PHP / MySQL - 和/或问题

时间:2011-05-06 16:11:11

标签: php mysql sql

此代码有什么问题。每当我尝试在mysql语句中使用AND或OR时,我似乎遇到了同样的问题。

我显然不明白这是如何解释的,因为我永远无法让它发挥作用。

SELECT *
  FROM customer
 WHERE (record_number = '{$_POST['record_number']}')
    OR (po = '{$_POST['record_number']}) 
LIMIT 1

即使我输入正确的数据,它也会在没有找到的情况下返回。什么是正确的语法 - 让我疯狂。我尝试了这10种不同的方式,包括没有(括号,声明的不同区域的括号等等。

5 个答案:

答案 0 :(得分:3)

您未关闭OR (po='{$_POST['record_number']})上的引文。

另一方面 - 这对sql注入攻击非常开放 - 可能需要考虑清理你的输入。

答案 1 :(得分:1)

假设这是从php

完成的
$sql = "SELECT * FROM customer WHERE (record_number='". mysql_real_escape_string($_POST['record_number'])."') OR (po='". mysql_real_escape_string($_POST['record_number'])."') LIMIT 1";

应该可以工作并从mysql注入中转义。

答案 2 :(得分:1)

问题不是因为您的查询结构,而是因为您使用单冒号打破它。

(record_number='{$_POST['record_number']}') OR (po='{$_POST['record_number']})

在PHP中,您不能在数组索引中使用单冒号,请尝试以下操作:

(record_number='{$_POST[record_number]}') OR (po='{$_POST[record_number]}')

虽然我认为不在数组中使用单冒号并且还有其他方法来构建查询字符串是不好的做法。

答案 3 :(得分:1)

使用:

$query = sprintf("SELECT c.*
                    FROM CUSTOMER c
                   WHERE c.record_number = '%s'
                      OR c.po = '%s'
                   LIMIT 1",
                 mysql_real_escape_string($_POST["record_number"]),
                 mysql_real_escape_string($_POST["record_number"]));

$result = mysql_query($query);

答案 4 :(得分:1)

有几个问题。一个是您对SQL文字和用于索引$_POST数组的PHP字符串使用相同的引号样式(单引号)。对PHP字符串使用双引号:"record_number"而不是'record_number'

但要注意!盲目地在MySQL查询中包含$_POST的输入是危险的,因为它会将您的代码暴露给SQL注入攻击。至少应该确保$_POST["record_number"]只包含数字。更好的方法是使用参数编写查询,并使用您正在使用的任何驱动程序或库定义的机制传递这些参数的值。

此外,只要在WHERE条件中有OR子句,就可以使用括号。在你的例子中,这不是问题,但是这个:

WHERE x = 1 AND y = 2 OR z = 3

评估为:

WHERE (x = 1 AND y = 2) OR (z = 3)

当你可能有这个意思时:

WHERE (x = 1) AND (y = 2 OR z = 3)