2012-10-24 23 views
0

我在使用带变量的引号的sql查询中遇到了一些问题。 (通常我使用“绑定”,所以我没有这种问题)。以下是查询:在sql查询中使用简单和双引号

$myquery = mysql_query("SELECT * FROM mytable ORDER BY id ASC WHERE var='".$var."'"); 

语法似乎不正确,任何人都可以帮忙吗?

+1

请,不要concat SQL字符串... – Prinzhorn

+1

这种方法通常容易出现SQL注入攻击,所以它不是真的可取的。“似乎不是合作的直立“意味着什么都没有;你有错误吗? – lanzz

+0

@lanzz,抱歉不准确:实际上查询会加载一些我在网页上显示的数据。但是在这里显示这些数据失败 – Newben

回答

2

以及你可以尝试这样的事:

$query = sprintf("SELECT * FROM mytable WHERE var='%s' ORDER BY id ASC",mysql_real_escape_string($var)); 
$result = mysql_query($query) or die("Error:" . mysql_error()); 

另外请注意,ORDER BY是在错误的地方。 它更具可读性,您无需打扰单一的qoute concate。 也是安全的mysql注入。 希望这有助于!

+0

非常感谢Alan,它工作得很好! – Newben

+0

lanzz你是对的我只是忘了把mysql_real_escape_string($ var) tx – alan978

-1

您可以使用它像

$myquery = mysql_query("SELECT * FROM mytable ORDER BY id ASC WHERE var='$var'"); 
+0

没有相反的证据,我假设'$ var'没有通过'mysql_real_escape_string'传递,所以这种方法很容易发生SQL注入。它在问题中也存在错误的ORDER BY/WHERE子句顺序,所以它在语法上仍然无效。 – lanzz

+0

@ alan978的解决方案工作正常,但您的表达似乎不起作用。但仅凭好奇心,它是否存在使用引号的一些查询,而不使用sprintf风格的用法? – Newben

+0

@lanzz,他没有被告知有关数据,我们可以假设,他直接分配数据的值:P –

1

一般来说,你应该使用参数绑定您的DBD(Perl的数据库驱动程序)或其他语言和驱动器组合提供的功能。我收集你正在使用PHP(虽然你应该标记你的问题,以消除歧义)。

这是How to bind SQL parameters in PHP(使用PDO)上的StackOverflow线程。注意:PHP PDO :: bindParam方法存在限制其他语言类似的功能。因此,阅读链接的线程注意事项。

这是另一个讨论有关Binding Parameters to Statements ... Perl的(但概念适用于其他编程语言和他们的SQL库/驱动器)。

+0

我知道,我总是使用绑定技术。在这里我想知道,因为我正在为使用sql查询的大量引用项目工作,所以我想说清楚 – Newben