我最初创建了以下查询来从数据库返回一些结果。
$result = mysqli_query($con, "SELECT bookingId, locationName
FROM bookings
WHERE username = '$one'");
$output = array();
while($row = mysqli_fetch_assoc($result)) {
$output[]=$row;
}
print(json_encode($output));
但是,我现在想使用准备好的语句并尝试了以下方法。但它总是返回
[]
。这是通过准备好的语句返回行的正确方法吗?
$stmt = $con->prepare('SELECT bookingId,locationName
FROM bookings
WHERE username= ?');
$stmt->bind_param('s', $one);
$stmt->execute();
$stmt->bind_result($id, $loc);
$output = array();
while($row = $stmt->fetch()){
$output[] = $row;
}
$stmt->close();
print(json_encode($output));
问题:
与
PDO
中的 mysqli
不同,函数 fetch()
不返回行,它只返回布尔值或 NULL,请检查文档:
#Value Description
#TRUE Success. Data has been fetched
#FALSE Error occurred
#NULL No more rows/data exists or data truncation occurred
解决方案
$sql = '
SELECT bookingid,
locationname
FROM bookings
WHERE username = ?
';
/* prepare statement */
if ($stmt = $con->prepare($sql)) {
$stmt->bind_param('s', $one);
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($id, $loc);
$json = array();
/* fetch values */
if($stmt->fetch()) {
$json = array('id'=>$id, 'location'=>$loc);
}else{
$json = array('error'=>'no record found');
}
/* close statement */
$stmt->close();
}
/* close connection */
$con->close();
print(json_encode($json));
您可以尝试以下操作(而不是使用
bind_result()
):
$result = $stmt->get_result();
$output = array();
while ($row = $result->fetch_assoc()) {
$output[] = $row['bookingId'];
}
它基本上使您的行已经是一个数组。可能这对你更有效。 如果您在 while 循环中没有执行任何其他操作,则可以执行 RobP 建议的操作,只需使用
fetch_all
:
mysqli_fetch_all($result, MYSQLI_ASSOC);
像 mysqli 解决方案中那样,$stmt->get_result() 有什么问题:
$query = "SELECT * FROM table WHERE column = ?";
if($stmt = $conn->prepare($query)){
$stmt->bind_param('s', $col);
$stmt->execute();
if($result = $stmt->get_result()){
while($row = $result->fetch_assoc()){
$col_data = $row['data'];
}
}
}
对我有用。