【问题标题】: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)。

标签: php json mysqli prepared-statement


【解决方案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 的格式,因为我不确定他想在此期间做什么。可能是他在循环中做更多的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2019-05-26
    相关资源
    最近更新 更多