2012-10-21 81 views
1

我使用的语法像单引号,双引号,用PHP

$query = "SELECT * FROM contacts WHERE contact_id = $id"; 

往往它的工作原理,但往往不工作MySQL查询。然后,如果我使用

$query = 'SELECT * FROM contacts WHERE contact_id = "'.$id.'"; 

然后它工作。哪一个是正确的?

+0

也看看http://stackoverflow.com/questions/3446216/difference-between-single-quote-and-double-quote-string-in-php – clentfort

回答

1
$query = "SELECT * FROM contacts WHERE contact_id = '". $id . "'"; 

但是该查询易受攻击且带有SQL Injection。这里有一个文章如何从SQL Injection

Best way to prevent SQL injection in PHP?

保护您的代码,如果你想过滤的列不是数字,下面的查询将无法工作。

$query = "SELECT * FROM tableName WHERE username = $name"; 
2

事实上,没有这些语法的是最好的,当谈到编写SQL查询。

如果你正在编写一个SQL查询,你是最好使用参数化查询,像这样写的:

$query = 'SELECT * FROM contacts WHERE contact_id = ?'; 
$prep = $mysqli->prepare($query); //prepares the query for action 
$prep->bind_param("i", $id);  //inserts the $id variable into the '?' as an integer value. 

...或类似的方法使用PDO库。

以这种方式进行查询将使您的查询更安全。

请注意,如果您使用旧式mysql_xx()函数(不支持这种类型的代码),则这些函数被认为是过时且不安全的,并且将从未来版本的PHP中删除。你应该尽快停止使用它们。 (关于这方面的更多信息,请参阅PHP手册)

从问题中不清楚您是在询问关于字符串语法还是查询写作风格。以上内容有助于查询写作,并避免字符串语法问题,但如果您仍然想了解字符串语法问题,我将继续对该主题进行一些思考......

两种语法是完全有效的。简单的答案是,无论哪种方式都很好,所以无论哪种方式对任何给定的代码都最适合您。

你提到你的第一个语法“经常不起作用”。如果你能详细说明,这将是有帮助的,因为它是完全有效的PHP语法。

它可能失败的原因是,如果你有其他的词加入变量名称,所以PHP,或者如果你正在尝试使用数组元素作为变量。在这种情况下,你应该包装在大括号的变量名,如下所示:

$string = "this is a string with a {$variable} in it"; 

事实上,这部作品在所有的情况下(也有助于更清楚,当你使用一个字符串变量),所以最好总是这样做。

有些人会说使用单引号对性能更好。它是......但差别很小,事实上,当你连接了很多变量时,它变得更小。说实话,如果他们担心这种事情对他们来说是一个问题,那么他们不应该使用像PHP这样的解释型语言。

+0

感谢@Spudley为您长期的答案。 我,而我用下面的语法 '$查询=收到错误“SELECT * FROM接触WHERE CONTACT_NAME = $名称”;' 如果我用下面的语法,我没有得到错误。 '$ query =“SELECT * FROM contacts WHERE contact_name ='$ name'”;' 据我所知,第一个是正确的语法。 –

+0

好的。你得到的错误是SQL错误,而不是PHP错误。请参阅我的答案的前半部分以获得最佳解决方案。 (@ JohnWoo的答案也有一些重要提示,为什么你会犯错误,了解SQL注入的概念并知道如何避免这一点很重要) – Spudley

+0

这意味着你在说'$ query =“SELECT * FROM contacts WHERE contact_name = $ name“;'是错误的语法,'$ query =”SELECT * FROM contacts WHERE contact_name ='$ name'“;'如果我想避免错误,则是正确的语法。 –