PHP - 准备好的语句和json_encode


PHP - prepared statements and json_encode

我想使用预准备语句创建一个 php 脚本来查询数据库中的表并以 json 格式返回结果。我有一张医生表,我想返回给定专业的医生。我有一个不使用预准备语句的脚本版本,可以正常工作。但是当我使用预准备语句时,我的脚本不起作用。

非预准备语句版本:

<?php
// include database constants
require_once("../config/config.php");             
// create db connection
$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s'n", $mysqli->connect_error);
    exit();
}
$mysqli->set_charset("utf8");
$speciality = $_POST['speciality'];
$query = "SELECT * FROM `doctors` WHERE speciality='$speciality'";
$result = $mysqli->query($query) or die("Error executing the query");
while($row = $result->fetch_assoc()) {
    $output[]= $row;    
}
print(json_encode($output));
$mysqli->close();
?>

预处理语句版本:

<?php
// include database constants
require_once("../config/config.php");             
// create db connection
$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s'n", $mysqli->connect_error);
    exit();
}
$mysqli->set_charset("utf8");
$speciality = $_POST['speciality'];
$query = "SELECT * FROM `doctors` WHERE speciality=?";
if ($stmt = $mysqli -> prepare($query)){
    $stmt -> bind_param("s", $speciality);
    $stmt -> execute();
    $result = $stmt -> get_result();
    while($row = $result -> fetch_assoc()) {
        $output[]= $row;    
    }
    print(json_encode($output));
    $stmt -> close();
} else {
    echo $mysqli->error;
    echo "no entry found";
}
$mysqli->close();
?>

我做错了什么?我没有收到mysqli错误,这意味着问题出在执行查询之后,但我不知道它是什么。

编辑:我说它不起作用的意思是我没有得到任何东西。执行后页面的 html 正文完全为空。另一方面,如果我使用我发布的其他脚本(没有准备好的语句),我会得到预期的结果。

更新:

使用这个:

/* bind result variables */
$stmt->bind_result($col1,$col2,$col3,$col4);
/* fetch values */
while ($stmt->fetch()) {
    $output[]=array($col1,$col2,$col3,$col4);
}

相反。希望对您有所帮助。

任何人请给出投反对票的理由。

ini_set('display_errors',1);
error_reporting(E_ALL);

然后再次查看 HTML 正文。很可能不支持get_result但我不想猜测。

确保你的 PHP 版本与该方法兼容

http://php.net/manual/pt_BR/mysqli-stmt.get-result.php

要获取数据作为关联数组,您可以执行以下操作:

$stmt->bind_result($col1, $col2);
$rows = [];
while ($stmt->fetch()) {
    $rows[]=array("col1"=>$col1, "col2"=>$col2);
}