【问题标题】:Why is this a bad MYSQL query in PHP?为什么这是 PHP 中的错误 MYSQL 查询?
【发布时间】:2014-04-24 05:55:53
【问题描述】:

这是我在 php 中使用的错误 mysql 查询吗?

$tablenamep = $_POST["tablenamep"];
$res = mysqli_query($con, "SELECT * FROM `$tablenamep` WHERE number=9");

所以当我尝试使用以下方法获取结果时:

while ($row = mysqli_fetch_assoc($res))

存在sql注入错误: mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,给定布尔值

我已经阅读了有关此错误的几个问题和答案,但我的问题是为什么查询返回布尔值,而我什至向 $tablenamep 变量添加了一个值。我使用以下代码将值添加到我的 android 应用程序中的变量中:

nameValuePairs.add(new BasicNameValuePair("tablenamep", msg));

代码正在运行并且没有任何错误,但是当我尝试获取 php.ini 的结果时,我的 android 应用程序崩溃了。我该如何解决这个问题! (注意:我的安卓应用没有任何问题,我已经彻底检查过了)

为什么这是一个错误的查询?我该怎么做才能让查询不返回布尔值并返回实际值?

【问题讨论】:

  • 因为你是将php变量直接传递给查询..使用参数绑定...
  • 我看到很多人在表名和列上使用`,99% 的时间他们只是这样做,因为他们不知道更好。唯一需要的是变量可能是 mysql reserved keyword
  • 请保护该查询免受 sql 注入!
  • @NishantSolanki,参数绑定不起作用,因为它是一个表。表名和列名不能与参数绑定一起使用,但是可以采取其他步骤来防止 SQL 注入。
  • OP:返回的布尔值是假的,这意味着查询本身是错误的。独立于 PHP 测试查询,将其回显:echo "SELECT * FROM $tablenamep WHERE number=9";

标签: php android mysql


【解决方案1】:

我猜你的$res = mysqli_query($con, "SELECT * FROM $tablenamep WHERE number=9"); 返回失败。

正如here技术详情表

中所述

对于成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,它将 返回一个 mysqli_result 对象。对于其他成功的查询,它将 返回真。失败时为 FALSE

mysqli_fetch_assoc() 函数需要 mysqli_result 但查询失败,为什么它返回布尔值而不是对象。

【讨论】:

  • 那我该怎么办?解决方案??
  • 给我解决你说的问题!
【解决方案2】:

你会发现你的查询“失败”了

在下面插入一段代码

if($result === FALSE) {
    die(mysql_error()); 
}

就在这条线的上方

while ($row = mysqli_fetch_assoc($res))

你会发现它死在那里的脚本。

很可能是您发布的值有问题 - 回显您的发布值并查看它是否包含任何 '" 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多