社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

Jane Semtner • 5 年前 • 1678 次点击  

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

我有以下代码:

<?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
 
1678 次点击  
文章 [ 4 ]  |  最新文章 5 年前
Hasee Amarathunga
Reply   •   1 楼
Hasee Amarathunga    6 年前

我想问题在这里。

if(sizeof($q_resultSel)>0)

将sizeof替换为count并检查它。

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

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

q_resultSel = $stmtSel -> execute();

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

关于错误检查,我尝试了$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    6 年前

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