我正在为学校做一项作业,其中包括使用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服务器中显示的查询代码,它运行良好,并返回了正确的结果。
问题是$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注入攻击的向量。
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
}
您的部分困惑是您使用了大量的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>");
}