在 PHP 中获取 mysqli 结果作为 json_encode() 的数组

nim*_*rod 0 php mysql sql mysqli prepared-statement

升级旧的 PHP 版本后,我终于说服自己从 PHP mysql 切换到 mysqli。但是,我没有设法实施与以前相同的方法:

这是旧方法:

$sth = mysql_query("select * from .....");

$rows = array();

while($r = mysqli_fetch_assoc($sth)) {
    $rows[] = $r;
}

print json_encode($rows);
Run Code Online (Sandbox Code Playgroud)

这是我的 mysqli 方法:

$prename = "Peter";

$rows = array();

$mysqli = new mysqli($server, $user, $pass, $dbase);

if ($stmt = $mysqli->prepare("select lastname where prename = ? order by prename asc")) {

    /* bind parameters for markers */
    $stmt -> bind_param("s", $prename);

    /* execute query */
    $stmt -> execute();

    /* bind result variables */
    $stmt -> bind_result($lastname);

    /* fetch value */
    $stmt->fetch();

    echo $lastname;

    /* close statement */
    $stmt -> close();
}

/* close connection */
$mysqli -> close();

print json_encode($rows);
Run Code Online (Sandbox Code Playgroud)

如何将查询结果添加到$rows[]数组中?返回值必须是将由我的 web 应用程序解析的 json 字符串。我尝试了几种解决方案,$stmt -> fetch_array但都没有奏效。

非常感谢您的帮助。

Kor*_*eyD 5

您将在 php.net mysqli bind_result 页面上找到您问题的解决方案:

http://www.php.net/manual/en/mysqli-stmt.bind-result.php

查看 nieprzeklinaj 在 gmail dot com 上的评论

他/她提供了一个函数 fetch() ,它将用作准备好的 mysqli 语句的全部提取(返回数组中的完整结果集)。它将使用动态数量的选定字段。

您可以将 fetch() 函数添加到您的 php 代码中(当然您可以随意称呼它)。

然后在您上面提供的代码中使用它,您将执行以下操作:

$prename = "Peter";

$rows = array();

$mysqli = new mysqli($server, $user, $pass, $dbase);

if ($stmt = $mysqli->prepare("select lastname where prename = ? order by prename asc")) {

     /* bind parameters for markers */
     $stmt -> bind_param("s", $prename);

     /* execute query */
     $stmt -> execute();

     /* call the fetch() function provided by (nieprzeklinaj at gmail dot com) */
     $rows = fetch($stmt);
}

/* close connection */
$mysqli -> close();

print json_encode($rows);
Run Code Online (Sandbox Code Playgroud)

更新

满的

我创建了一个名为“comment”的测试表,并给它一个“prename”字段和一些其他随机字段,仅用于演示目的:

<?php
//fetch function from php.net (nieprzeklinaj at gmail dot com)
function fetch($result)
{    
    $array = array();

    if($result instanceof mysqli_stmt)
    {
        $result->store_result();

        $variables = array();
        $data = array();
        $meta = $result->result_metadata();

        while($field = $meta->fetch_field())
            $variables[] = &$data[$field->name]; // pass by reference

        call_user_func_array(array($result, 'bind_result'), $variables);

        $i=0;
        while($result->fetch())
        {
            $array[$i] = array();
            foreach($data as $k=>$v)
                $array[$i][$k] = $v;
            $i++;

            // don't know why, but when I tried $array[] = $data, I got the same one result in all rows
        }
    }
    elseif($result instanceof mysqli_result)
    {
        while($row = $result->fetch_assoc())
            $array[] = $row;
    }

    return $array;
}


$prename = "Peter";

$rows = array();

$server = 'localhost';
$user = 'user';
$pass = 'pass';
$dbase = 'mydatabase';

$mysqli = new mysqli($server, $user, $pass, $dbase);

$prename = "Peter";

$rows = array();

if ($stmt = $mysqli->prepare("select * from comment where prename = ? order by prename asc")) {

     /* bind parameters for markers */
     $stmt -> bind_param("s", $prename);

     /* execute query */
     $stmt -> execute();

     /* call the fetch() function provided by (nieprzeklinaj at gmail dot com) */
     $rows = fetch($stmt);
}
else{
    //print error message
    echo $mysqli->error;
}


/* close connection */
$mysqli -> close();

print json_encode($rows);
Run Code Online (Sandbox Code Playgroud)

输出是:

[{"prename":"Peter","comment_id":1,"fullname":"Peter 1","email":"some email"},{"prename":"Peter","comment_id":2, "fullname":"Peter 2","email":"some email"},{"prename":"Peter","comment_id":3,"fullname":"Peter 3","email":"some email "}]

数据库表信息(以便您可以检查输出):

mysql> describe comment;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| prename    | varchar(100) | YES  |     | NULL    |       |
| comment_id | int(11)      | YES  |     | NULL    |       |
| fullname   | varchar(150) | YES  |     | NULL    |       |
| email      | varchar(150) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

mysql> select * from comment;
+---------+------------+----------+------------+
| prename | comment_id | fullname | email      |
+---------+------------+----------+------------+
| Peter   |          1 | Peter 1  | some email |
| Peter   |          2 | Peter 2  | some email |
| Peter   |          3 | Peter 3  | some email |
+---------+------------+----------+------------+
Run Code Online (Sandbox Code Playgroud)