PHP - 准备好的语句和json_encode

Chr*_*tis 2 php json prepared-statement

我想使用预准备语句创建一个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();
?>
Run Code Online (Sandbox Code Playgroud)

预备声明版本:

<?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();
?>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我没有得到mysqli错误,这意味着问题是在执行查询后,但我只是不知道它是什么.

编辑:我的意思是说它不起作用是我没有得到任何回报.执行后页面的html主体完全为空.另一方面,如果我使用我发布的其他脚本(没有预备语句),我得到了预期的结果.

ncm*_*ncm 8

更新:

用这个:

/* bind result variables */
$stmt->bind_result($col1,$col2,$col3,$col4);

/* fetch values */
while ($stmt->fetch()) {
    $output[]=array($col1,$col2,$col3,$col4);
}
Run Code Online (Sandbox Code Playgroud)

代替.希望能帮助到你.

任何人请说明放下投票的理由.