在while循环中使用fetch在返回和处理结果的中途抛出警告


Using fetch in while loop throws warning midway through returning and processing results

我正在运行以下查询,它大部分时间都按要求运行,但偶尔会循环几次,然后抛出以下警告:

Warning: mysqli_stmt::fetch(): Couldn't fetch mysqli_stmt in...

我相信这与结果有关,但在这一点上我不知所措。

$limit = 'LIMIT ' .($pagenum - 1) * $page_rows .',' .$page_rows;
$sql = "SELECT id, join_id, bus_name, first_name, last_name, address, city, state,
       zip, phone, fax, email, wsaddr FROM auctioneer";
$bystate = " ORDER BY state ".$limit;//by state
$sortedLastSQL = " ORDER BY last_name ".$limit;// sort by last_name
$alphbeticalSql = " WHERE bus_name LIKE '".$order."%' ".$limit; //sort by letter
$sortOrderStSql = " WHERE state LIKE '".$order."%' ORDER BY state ASC ".$limit;
$sortOrderLnSql = " WHERE last_name LIKE '".$order."%' ORDER BY last_name,
first_name ASC ".$limit;
if(empty($_GET['sort']) && empty($_GET['order'])){
    $sql = $sql.' '.$limit;
}
if(!empty($_GET['order']) && empty($_GET['sort'])){
    $sql = $sql.$alphbeticalSql;
}
if(!empty($_GET['sort']) && $_GET['sort'] === 'state' && empty($_GET['order'])){
    $sql = $sql.$bystate;
}
if(!empty($_GET['sort']) && $_GET['sort'] === 'last_name' && empty($_GET['order'])){
    $sql = $sql.$sortedLastSQL;
}
if(!empty($_GET['sort']) && $_GET['sort'] === 'state' && !empty($_GET['order'])
&& $_GET['order'] = range('A','Z')){
    $sql = $sql.$sortOrderStSql;
}
if(!empty($_GET['sort']) && $_GET['sort'] === 'last_name' && !empty($_GET['order'])
&& $_GET['order'] = range('A','Z')){
    $sql = $sql.$sortOrderLnSql;
}
$stmt = $conn->prepare($sql);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($id, $join_id, $bus_name, $first_name, $last_name,
      $address, $city, $state, $zip, $phone, $fax, $email,$wsaddr);
while($stmt->fetch()){
    //do a ton of stuff here
}

注意:这只是一个原始查询,目前还没有为调试目的设置安全性。

所以问题不在上面找到的较大的代码中,而是包含在while循环中。

我有以下内容:

while($stmt->fetch()){ 
    if($join_id != 0){
        $sql3 = "SELECT count(*) FROM auctions WHERE join_id = ?";
        $st = $conn->prepare($sql3);
        $st->bind_param("i", $join_id);
        $st->execute();
        $st->store_result();
        $st->bind_result($l);
        $st->fetch();
        $st->close();
    }
}

通过将else { $l = 0; }添加到if语句中,问题消失了。

这就是为什么我讨厌事先准备好的声明,因为这总是一场徒劳的追逐!

相关文章: