尽管语句在数据库中运行,PHP / MYSQL Select语句仍会引发错误

时间:2019-03-02 19:05:08

标签: php mysql

我知道之前已经有人问过这个问题,但是我已经花了一些时间来回答这些问题,但是找不到任何指向我正确方向的东西。

我有以下代码:

<?php
$connSel = OpenCon();
$sqlSel = 'SELECT * FROM sitecomments';
$stmtSel = $connSel -> prepare($sqlSel);
$q_resultSel = $stmtSel -> execute();

if(sizeof($q_resultSel)>0){
    while($row = $q_resultSel->fetch_assoc()){
        echo $row['username']."<br><br>".$row['comment'];
    }
}
else{
    echo '<i>No comments yet</i>';
}
?>

我已经检查了数据库中的查询,它返回的一切都很好。但是,它在这里不起作用。我收到错误消息“在布尔值上调用成员函数fetch_assoc()”。

我试图追踪错误,似乎是那一行

while($row = $q_resultSel->fetch_assoc())

与查询失败一样返回false,因此无法进行迭代。我试图在$ q_resultSel中查找行数,但收到消息“试图获取非对象的属性”,所以我不确定我是否理解我在以前的文章中找到的特定错误检查方法。

任何想法都会受到赞赏。

4 个答案:

答案 0 :(得分:1)

sizeof()更改为$stmtSel->num_rows

    $connSel = OpenCon();
    $sqlSel = 'SELECT * FROM sitecomments';


    if($stmtSel = $connSel -> prepare($sqlSel)){   
    $q_resultSel = $stmtSel -> execute(); 
    $stmtSel ->store_result();
    if($stmtSel->num_rows>0){      
      $result = $q_resultSel->get_result();
        while ($row = $result->fetch_array(MYSQLI_NUM)){
            echo $row['username']."<br><br>".$row['comment'];
        }
    }
}
    else{
        echo '<i>No comments yet</i>';
    }

答案 1 :(得分:1)

  

关于错误检查,我尝试了$ q_resultSel = $ stmtSel-> execute()或die(mysqli_error($ q_resultSel));但没有输出

检查错误时,应该在每个prepare()和每个execute()之后进行检查,因为在每种情况下都会发生不同类型的错误。

prepare()上遇到错误时,这意味着创建语句失败,因此必须从连接中获取错误:

$stmtSel = $connSel -> prepare($sqlSel);
if ($stmtSel === false) {
    die($connSel->error);
}

当您在execute()上遇到错误时,表明您有一条语句,但是执行该语句失败。因此,您必须从语句中获取错误:

$q_resultSel = $stmtSel -> execute();
if ($q_resultSel === false) {
    die($stmtSel->error);
}

一种替代方法是启用mysqli异常,因此您不必编写任何代码即可显式检查错误。如果有错误,它们将通过引发异常来中断您的代码执行。

以下是启用例外的方法:

$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ALL;

阅读有关错误检查的文档:


我越看你的代码,我注意到的错误就越多。

$q_resultSel = $stmtSel -> execute();

您应该阅读docs on the execute() function

  

返回值

     

成功返回TRUE,失败返回FALSE。

请注意,execute()不会返回对象-成功执行或发生错误时都会返回布尔值。

这意味着$q_resultSel->fetch_assoc()必然会导致致命错误,即使查询没有问题。在PHP中的布尔值上使用->总是无效的。

if(sizeof($q_resultSel)>0){

检查结果的大小是多余的。因为如果它是>0,那么您唯一要做的就是在其上运行while循环,因此最好跳过if条件,因为如果结果有0行,则while循环将立即立即终止。

while($row = $q_resultSel->fetch_assoc()){
    echo $row['username']."<br><br>".$row['comment'];
}

如前所述,您正在尝试调用$q_resultSel的方法,该方法必须是布尔TRUE或FALSE。这就是致命错误的原因。

相反,您应该在确认execute()没有返回表示错误的FALSE后调用execute(),以获得结果对象:

$ok = $stmtSel -> execute();
if ($ok === false) {
    die($stmtSel->error);
}

$q_resultSel = $stmtSel->get_result();
if ($q_resultSel === false) {
    die($stmtSel->error);
}

while($row = $q_resultSel->fetch_assoc()){
    echo $row['username']."<br><br>".$row['comment'];
}

通过代码示例阅读有关get_result的文档:

请注意,get_result()是仅当PHP安装使用mysqlnd驱动程序时才可以使用的功能。大多数现代的PHP安装程序默认都应该执行此操作,但是您可以通过在shell命令行中获取PHP配置信息来进行检查:

php -i

... lots of output ...

mysqlnd

mysqlnd => enabled

... lots more output ...

答案 2 :(得分:0)

$stmtSel -> execute()-返回布尔值。因此,您试图在布尔值上调用方法fetch_assoc(),这是错误的。
尝试替换:

q_resultSel = $stmtSel -> execute();

$stmtSel -> execute();
q_resultSel = $stmtSel->get_result();

答案 3 :(得分:0)

我认为问题就在这里。

{"error":{"root_cause":[{"type":"parsing_exception","reason":"[match] query does not support [type]","line":7,"col":17}],"type":"parsing_exception","reason":"[match] query does not support [type]","line":7,"col":17},"status":400}

替换sizeof进行计数和检查。

if(sizeof($q_resultSel)>0)