Py学习  »  DATABASE

尽管语句在数据库中工作,PHP/MYSQL Select语句仍抛出错误

Jane Semtner • 4 年前 • 828 次点击  

我知道之前有人问过这个问题,但我花了很多时间来研究答案,找不到任何能给我指明正确方向的东西。

我有以下代码:

<?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>';
}
?>

我已经检查了数据库中的查询,它返回了一切正常。但是,它在这里不起作用。我得到错误消息“调用boolean上的成员函数fetch_assoc()”。

我试图找出错误,但似乎是

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

返回false,就像返回查询fail一样,因此迭代它不起作用。我试图在$q_resultSel中找到行数,但得到消息“Trying to get property of non-object”,因此我不确定我是否理解在以前的文章中找到的特定错误检查方法。

任何想法都将非常感谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52034
 
828 次点击  
文章 [ 4 ]  |  最新文章 4 年前
Hasee Amarathunga
Reply   •   1 楼
Hasee Amarathunga    5 年前

我想问题在这里。

if(sizeof($q_resultSel)>0)

将sizeof替换为count并检查它。

if(count($q_resultSel)>0)
Maxim Kravets
Reply   •   2 楼
Maxim Kravets    5 年前

$stmtSel -> execute() -返回布尔值。所以你想调用一个方法 fetch_assoc() 在布尔值上,这是错误的。
尝试替换:

q_resultSel = $stmtSel -> execute();

$stmtSel -> execute();
q_resultSel = $stmtSel->get_result();
Bill Karwin
Reply   •   3 楼
Bill Karwin    5 年前

关于错误检查,我尝试了$q撸resultSel=$stmtSel->execute()或die(mysqli撸error($q撸resultSel));但它没有输出任何内容

当你检查错误时,你应该在 prepare() 以及 execute() ,因为每种情况下都会出现不同类型的错误。

当你发现错误时 准备() ,这意味着创建语句失败,因此必须从连接获取错误:

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

当你发现错误时 执行() ,这意味着您有一个语句,但执行该语句失败。所以你必须从语句中得到错误:

$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。

请注意 执行() 不返回对象,当成功或有错误时返回布尔值。

那意味着 $q_resultSel->fetch_assoc() 即使查询没有问题,也会导致致命错误。使用它总是无效的 -> 关于PHP中的布尔值。

if(sizeof($q_resultSel)>0){

检查结果的大小是多余的。因为你唯一能做的就是 >0 就是运行一个 while 循环,你最好跳过 if 条件,因为如果结果有0行,则 虽然 无论如何,循环将立即终止。

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

如前所述,您试图调用 $q_resultSel ,这一定是布尔值TRUE或FALSE。这就是致命错误的原因。

相反,您应该在调用 执行() 在确认 执行() 未返回FALSE指示错误:

$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() 是一个只有在PHP安装使用mysqlnd驱动程序时才能使用的函数。默认情况下,大多数现代PHP安装都应该这样做,但您可以通过在shell命令行获取PHP配置信息来进行检查:

php -i

... lots of output ...

mysqlnd

mysqlnd => enabled

... lots more output ...
Richard Socker
Reply   •   4 楼
Richard Socker    5 年前

改变 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>';
    }