【问题标题】:PHP and MySQLi Error Converting Query Results into String [duplicate]PHP和MySQLi错误将查询结果转换为字符串[重复]
【发布时间】:2013-12-27 03:01:40
【问题描述】:

我正在为学校做一项作业,其中涉及使用 PHP 生成 SQL 结果表。我在转换查询结果时遇到问题。这是我的错误信息:

可捕获的致命错误:无法将类 mysqli_result 的对象转换为字符串

这是我的代码的相关部分:

$q = "SELECT pages.pageid,pages.pagetitle,pagetype.pagetypename,stylesheets.stylename
FROM pages
INNER JOIN stylesheets
ON pages.styleid=stylesheets.styleid
INNER JOIN pagetype
ON pages.pagetypeid=pagetype.pagetypeid
ORDER by pages.".$sortBy." ".$sortDirection;
print("<p>Query: ".$q."</p>\n");


$r = mysqli_query($db_link,$q);
$n = mysqli_num_rows($r);
print("<p>$r</p>");

我唯一的理论是,也许因为我使用了多个表的内部联接,所以我需要做一些额外的事情?我运行查询显示在 MySQL 服务器中的代码,它运行良好并返回了正确的结果。

【问题讨论】:

    标签: php mysql database string mysqli


    【解决方案1】:

    问题在于$r 是一个对象,而不是一个字符串。您想打印$n 的值,而不是$r。将您的 print 语句更改为以下内容以修复错误:

    print("<p>$n</p>");
    

    从问题详细信息中不清楚您是在询问如何打印行数,还是如何打印查询的实际结果。

    如果您尝试执行后者:mysqli_query() 返回一个 mysqli_result 对象。返回的结果资源应该传递给mysqli_fetch_array()mysqli_fetch_assoc()或其他处理结果表的函数,以访问返回的数据。

    基本结构如下:

    $r = mysqli_query($db_link,$q) or die(mysqli_error($db_link);
    $n = mysqli_num_rows($r);
    
    while ($row = mysqli_fetch_assoc($r)) {
        // use $row['key']
    }
    

    另外,我建议您在代码中使用更具描述性的变量名称——它使您的代码易于维护和阅读。

    您还应该更加小心地构造查询字符串。如果 $sortBy 来自用户输入,则它是 SQL 注入攻击的向量。

    【讨论】:

    • 我认为发帖人希望打印查询结果,而不是行数。
    • @Tim:我认为他们只是想打印出结果集中的行数。
    • 来自帖子:“生成 SQL 结果表。”这对我来说听起来像是一个结果集。
    • @Tim:谢谢,我已经更新了我的答案(并删除了之前的评论,因为它现在无关紧要):)
    【解决方案2】:

    mysqli_query() 返回一个结果集资源,它与一组结果相同。您需要使用mysql_fetch_array() 或类似名称检索数据。

    $r = mysqli_query($db_link,$q) or die(mysqli_error($db_link);
    $n = mysqli_num_rows($r);
    
    while ($row = mysqli_fetch_array($r)) {
     var_dump($row);       // replace this with your own code to format the output
    }
    

    【讨论】:

    • mysqli_fetch_assoc不是更方便吗?
    • 可能——这取决于你想要做什么。 OP要求提示。我还有很多其他方法可以编写代码。
    【解决方案3】:

    您感到困惑的部分原因是您使用了大量的 1 字符串——在我看来——这只会引起混乱并且对现在的编码没有真正的好处。对字符串使用真实的单词,让您的生活和调试过程更轻松。此外,您的查询和结果似乎还没有被解析。这是我使用面向对象的处理方式对您的代码的看法:

    $query = "SELECT pages.pageid,pages.pagetitle,pagetype.pagetypename,stylesheets.stylename
    FROM pages
    INNER JOIN stylesheets
    ON pages.styleid=stylesheets.styleid
    INNER JOIN pagetype
    ON pages.pagetypeid=pagetype.pagetypeid
    ORDER by pages.".$sortBy." ".$sortDirection;
    
    print("<p>Query: ".$query."</p>\n");
    
    $result = $db_link->query($query);
    $number_of_rows = $result->num_rows($result);
    while($row = $result->fetch_assoc()){
        print("<p>$row</p>");
    }
    

    【讨论】:

    • 为了与 OP 的帖子保持一致,您可能希望以程序样式而不是 OOP 样式编写 mysqli 命令。
    • 也许吧。但根据我的经验,新的 PHP 程序员使用程序风格的原因是因为这是 PHP 手册页上给出的示例。在现实世界的使用中,面向对象的格式更为常见,并且有更多的答案/技术使用面向对象的样式而不是程序。
    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    相关资源
    最近更新 更多