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

标签 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);

这是我的 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);

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

非常感谢您的帮助。

最佳答案

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

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

查看 nieprzeklinaj 在 gmail.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);

已更新

已满

我创建了一个名为“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);

输出是:

[{"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 |
+---------+------------+----------+------------+

关于php - 在 PHP 中获取 mysqli 结果作为 json_encode() 的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20856049/

相关文章:

php - Xpath解析xml并输入mysql

javascript - 按日期检查jquery中是否是假期的功能

php mysql 查询循环if语句

sql - 从外键引用获取结果

php - php数据库如何查找年龄20岁以上25岁以下的用户

python - 如何使用python从sqlite查询中获取多个字典

php - 无法显示图像

php - 子查询 : select from one table based on matching user ids with team ids and output 2 dimensional array

php - 如何访问Docker容器中的主机MySQL服务器?

php - 通过 PHP 优化 MySQL InnoDB 插入