使用预处理语句获取多行数据

5

我对预处理语句还比较陌生,不确定自己是否做得正确。

这是我的尝试:

$currgame = 310791;

$sql = "SELECT fk_player_id, player_tiles, player_draws, player_turn, player_passes, swapped FROM ".$prefix."_gameplayer WHERE fk_game_id = ?";
$stmt = $mysqli->stmt_init();

$data = array();
if($stmt->prepare($sql)){
    $stmt->bind_param('i', $currgame);
    $stmt->execute();

    $fk_player_id = null; $player_tiles = null; $player_draws = null; $player_turn = null; $player_passes = null; $swapped = null;
    $stmt->bind_result($fk_player_id, $player_tiles, $player_draws, $player_turn, $player_passes, $swapped);

    $res = $stmt->get_result();
    
    while ($row = $res->fetch_assoc()){
        $data[] = $row;
    }
    $stmt->close(); 
}

// to display own games
foreach ($data as $row) {
    if ($row['fk_player_id'] == $playerid) {
        
        $udraws = $row['player_draws']+1; 
        $upass = $row['player_passes'];
        $uswaps = $row['swapped'];
        
        echo 'uDraws: '.$udraws.'<br>';
        echo 'uPass: '.$upass.'<br>';
        echo 'uSwaps: '.$uswaps.'<br><br>';
    }
}
// to display other games
foreach ($data as $row) {
    if ($row['fk_player_id'] != $playerid) {
        
        $opponent = $row['fk_player_id'];
        $oppTiles = $row['player_tiles'];
        
        $odraws = $row['player_draws']+1;
        $opass = $row['player_passes'];
        $oswaps = $row['swapped'];
        
        echo 'oID: '.$opponent.'<br>';
        echo 'oTiles: '.$oppTiles.'<br>';
        
        echo 'oDraws: '.$odraws.'<br>';
        echo 'oPass: '.$opass.'<br>';
        echo 'oSwaps: '.$oswaps.'<br><br>';

    }
}

当我尝试运行以下代码时,出现了"ServerError"错误: $res = $stmt->get_result(); 造成了这个错误,但我不确定原因。

PHP致命错误:在第61行/home/mypage/public_html/TEST/preparedstatement.php中调用未定义的mysqli_stmt :: get_result()方法


请详细说明“ServerError”。有没有迹象表明错误来自哪里(MySQL、Apache、PHP)?是否有异常的HTTP状态码?完整的错误消息是什么? - Oswald
3个回答

14

根据您的PHP/MySQL设置,您可能无法使用get_result()函数。

解决此问题的方法是绑定结果。

例如:

$stmt->execute();

$fk_player_id = null; $player_tiles = null; $player_draws = null; $player_turn = null; $player_passes = null; $swapped = null;

$stmt->bind_result($fk_player_id, $player_tiles, $player_draws, $player_turn, $player_passes, $swapped);

while ($stmt->fetch()) { // For each row
    /* You can then use the variables declared above, which will have the 
    new values from the query every time $stmt->execute() is ran.*/
}

更多信息请点击此处


好的,马上处理。很快回复您。 - Mansa
这是它的错误提示: PHP致命错误: 在/home/mypage/public_html/TEST/preparedstatement.php的第61行,调用未定义的mysqli_stmt :: get_result()方法。 - Mansa
好的,所以不是使用 $res = $stmt->get_result();,我应该这样做:$res = $stmt->bind_result($fk_player_id, $player_tiles, $player_draws, $player_turn, $player_passes, $swapped); - Mansa
好的,解决了错误,谢谢...但是我的数组里面没有任何东西(请参见编辑后的帖子)!? - Mansa
让我们在聊天中继续这个讨论 - EM-Creations
显示剩余5条评论

-2

1
请对您的代码进行解释,以便更清楚地了解它正在做什么以及如何帮助提问者解决问题。 - Bobulous

-2

由于我在您的代码中没有看到它,请确保在尝试查询之前实例化mysqli对象:

$mysqli = new mysqli("127.0.0.1", "user", "password", "mydb"); 
if($mysqli->connect_error){
    die("$mysqli->connect_errno: $mysqli->connect_error");
}

此外,ServerError 一定会在您的日志中显示,并指向正确的方向。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接