2011-05-06 34 views
1

这段代码有什么问题。我似乎每次尝试在mysql语句中使用AND或OR都会遇到同样的问题。PHP/MySQL - 与/或问题

我显然不理解这是如何解释,因为我永远不能得到它的工作。

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

即使输入正确的数据,它也会返回,因为找不到任何东西。什么是适当的语法 - 让我疯狂。我已经试过这10种不同的方式,包括无(括号,在语句的不同区域brakets等

+0

我们好不知道你的桌子是什么样子的(我们不介意跨越时间和空间的读者)和che ck在'$ _POST'中有'var_dump()'的信息 – Neal 2011-05-06 16:12:33

回答

3

你没关上OR (po='{$_POST['record_number']})报价

在一个侧面说明 - 这被无限打开SQL注入攻击 - 可能要到消毒您输入

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注入逃脱做

1

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

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

在PHP中,你被允许在数组索引不要使用单冒号,那么试试这个:

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

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

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); 
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)