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

在PHP中将mysqli结果获取为json_encode()的数组,php,mysql,sql,mysqli,prepared-statement,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); $prename = "Peter"; $rows = array();

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

这是老办法:

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

$rows = array();

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

print json_encode($rows);
$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);
这是我的mysqli方法:

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

$rows = array();

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

print json_encode($rows);
$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字符串,由我的webapplication解析。我用$stmt->fetch\u数组尝试了几种解决方案,但都不起作用


非常感谢您的帮助。

您可以这样填充阵列

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

/* fetch value */
while ($stmt->fetch()) {
    array_push($row, $lastname);
}

说服自己使用PDO

$stm = $db->prepare("select lastname where prename = ? order by prename asc");
$stm->execute([$prename]);
echo json_encode($stm->fetchAll());

您可以在php.net mysqli bind_结果页面上找到您的问题的解决方案:

查看gmail.com上nieprzeklinaj的评论

他/她提供了一个函数fetch,该函数将作为fetchall,用于在数组中返回完整结果集的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);

我最终使用了PDO,因为它似乎比mysqli简单得多:

$stmt = $db->prepare("select * from .....");
$stmt->execute(array($lastname));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
print json_encode($rows);

我需要从mysqli查询中获取带有数字数组的JSON,而不需要准备语句

<?php 
  header('Content-Type: application/json');
  $conn = include_once("dbopen.php");
  $result = mysqli_query($conn, "CALL sp_readtable");
  $data = array();
  while ($row = mysqli_fetch_row($result)){
      $data[] = $row;
  }
  echo json_encode($data, JSON_NUMERIC_CHECK);
?>

您是否在$lastname中获得了预期的结果?@Rikesh,是的,$lastname中填充了数据库中的数据。而不仅仅是将其放入$rows数组中,而不是将其回显。一定有更好的解决方案。以上示例已编辑。最初,我从返回的数据库中有20个字段。我希望能够像使用普通mysql_查询一样执行类似的操作:$rows[]=$r;这并没有像预期的那样起作用。没有生成任何输出:嗯,考虑到您的sql语法中没有任何错误,应该没有问题。我注意到您没有检查您发布的原始代码中的错误。我将在这里发布我的完整代码和结果,以便您可以看到它正在工作。我没有看到您的查询中指定的表名。这可能是导致您不返回结果的错误。在这种情况下,如何绑定变量?您很少运行没有参数的静态查询,因此您的解决方案非常复杂limited@YourCommonSense:我之所以发布这个答案,是因为我需要一个来自json的真实数组,而我在任何地方都找不到解决方案,所以我花了几个小时进行测试——也许是有人感兴趣。顺便说一句,由于我现在需要一些其他参数化存储过程,我将在我的帖子中添加另一个例子。特别是如果你学习PHP一周,你应该使用PDO,直到它还不太晚。关于你的编辑,应该从你的答案中删除它,因为这正是SQL注入的例子,本主题的目的就是避免它,如果你的问题是一个真正的数组,那么你应该问一个问题,而不是写一个答案,因为有一种更简单的方法可以从mysqli获取数字索引。@YourCommonSense:非常感谢您的编辑。
[
  ["row1fieldvalue1","row1fieldvalue2"],
  ["row2fieldvalue1","row2fieldvalue2"],
  ...
]