mysqli_num_rows() 期望参数通过同一页面上的较早查询有效

Posted

技术标签:

【中文标题】mysqli_num_rows() 期望参数通过同一页面上的较早查询有效【英文标题】:mysqli_num_rows() expects paramter though an earlier query on the same page works 【发布时间】:2012-11-03 18:03:06 【问题描述】:

在我的 mysql 数据库中查询表时出现错误。当传递的变量中没有值时,它是 mysqli_num_rows 的标准:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in folder/file.php on line 29

问题是我找不到语法错误。我已经看过很多次了。这是我的代码:

$sql_messages = "SELECT * FROM messages WHERE to='$userid'";
$result_messages = $mysqli->query($sql_messages);
$num_rows_messages = mysqli_num_rows($result_messages);

我尝试了一个 fetch 数组,但这给了我类似的错误。我想没有任何东西传递到 $result_messages 中。我回显了 $userid,它有一个值,我检查了我的数据库,有一个表 'messages' 和一个字段'to'。我已连接到正确的数据库,因为我在此查询之前有此代码:

$sql="SELECT * FROM users WHERE firstname='$firstname' && lastname='$lastname'";
$result = $mysqli->query($sql);
$row = mysqli_fetch_array($result);

而且效果很好。这是页面上的第三个查询,是否有某种限制?有没有人看到我忽略的语法错误?谢谢,如果是一个小错误,请见谅!

【问题讨论】:

【参考方案1】:

这是因为$mysqli->query() 返回了布尔值FALSE,according to the mysqli::query() docs 在发生错误时会这样做。您可以通过访问$mysqli->errno$mysqli->error 获取有关错误的更多详细信息。

我猜测问题的根源在于查询引用了名为to 的列,该列是MySQL reserved word。尝试在您的查询中使用反引号将单词 to 括起来。像这样:

$sql_messages = "SELECT * FROM messages WHERE `to`='$userid'";

确实,尽管您应该避免命名列和表的保留字。如果可行,请考虑重命名该列。

【讨论】:

原来如此。这是使用“to”这个词。我没有意识到那已经被保留了。我运行了错误消息,但什么也没回来,所以这是一个很好的捕获。很高兴知道,我需要确保我的领域在未来变得更加独特...... 作为旁注,您构建查询的方式(通过字符串连接),您正在创建SQL injection vulnerabilities。如果可能,考虑使用 mysqli 准备好的语句或 PDO。 好的,谢谢。有人告诉我 PDO,我会调查一下。我有点从头开始。非常感谢您的帮助!

以上是关于mysqli_num_rows() 期望参数通过同一页面上的较早查询有效的主要内容,如果未能解决你的问题,请参考以下文章

警告:mysqli_num_rows() 期望参数 1 为 mysqli_result,bool 给定...我该怎么办? [复制]

警告:mysqli_num_rows() 期望参数 1 为 mysqli_result,布尔值在 /home/digibeem/public_html/forgot_pass.php 第 55 行 [

期望脚本从文件中读取并将所有内容放在同一行

在 PHP 中,为啥 mysqli_num_rows 不为返回行数为 0 的查询返回整数?

独立同分布(iid)

PHP操作数据库出现错误:mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in