通过准备好的语句从数据库中获取行
Posted
技术标签:
【中文标题】通过准备好的语句从数据库中获取行【英文标题】:Fetching rows from database via a prepared statement 【发布时间】:2015-02-19 12:47:45 【问题描述】:我最初创建了以下查询以从我的数据库中返回一些结果。
$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));
【问题讨论】:
要么删除bind_result
行,你不要同时使用$id
和$loc
,或者在循环中使用它($output[$id] = $loc
)。
【参考方案1】:
问题:
与mysqli
中的PDO
不同,函数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));
【讨论】:
【参考方案2】:您可以尝试以下方法(而不是使用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);
【讨论】:
@RobP 是的。只是尝试将其保留为 OP 的格式,因为我不确定他想在此期间做什么。可能是他在循环中做更多的事情。以上是关于通过准备好的语句从数据库中获取行的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Prepared 语句中获取行数据,然后将其与 AJAX() 函数一起使用
无法使用准备好的对象语句从 mysql 获取多行数据 [重复]