用PHP实现单引号、双引号和Mysql查询

用PHP实现单引号、双引号和Mysql查询,php,mysql,sql,Php,Mysql,Sql,我使用的语法如下 $query = "SELECT * FROM contacts WHERE contact_id = $id"; 它通常起作用,但通常不起作用。那么如果我使用 $query = 'SELECT * FROM contacts WHERE contact_id = "'.$id.'"; 然后它就起作用了。哪一个是正确的方法 $query = "SELECT * FROM contacts WHERE contact_id = '". $id . "'"; 但是,使用

我使用的语法如下

$query  = "SELECT * FROM contacts WHERE contact_id = $id";
它通常起作用,但通常不起作用。那么如果我使用

$query  = 'SELECT * FROM contacts WHERE contact_id = "'.$id.'";
然后它就起作用了。哪一个是正确的方法

$query  = "SELECT * FROM contacts WHERE contact_id = '". $id . "'";
但是,使用SQL注入时,查询容易受到攻击。下面是一篇如何保护代码不受SQL注入的影响的文章

如果要筛选的列不是数字,则下面的查询将不起作用

$query  = "SELECT * FROM tableName WHERE username = $name";
但是,使用SQL注入时,查询容易受到攻击。下面是一篇如何保护代码不受SQL注入的影响的文章

如果要筛选的列不是数字,则下面的查询将不起作用

$query  = "SELECT * FROM tableName WHERE username = $name";
事实上,在编写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这样的解释语言。

事实上,在编写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这样的解释语言。

也看看,也看看,谢谢@Spudley给出的详细答案。当我使用下面的语法$query=SELECT*FROM contacts时,我遇到了一个错误,其中contact_name=$name;如果我使用下面的语法,我不会出错$查询=从联系人中选择*,其中联系人_name=“$name”;据我所知,第一个是正确的语法。您得到的错误是SQL错误,而不是PHP错误。看到第一个了吗
我的一半答案是最好的解决方案@JohnWoo的回答也有一些重要的提示,说明为什么会出现错误。理解SQL注入的概念并知道如何避免它是很重要的,这意味着你说$query=SELECT*FROM contacts,其中contact_name=$name;语法错误,$query=SELECT*FROM contacts,其中contact_name='$name';如果我想避免错误,这是正确的语法。我想说的是,第二个更好,但两个都不正确。第一个查询永远不会工作;第二种方法可行,但存在严重缺陷。请使用我在回答中描述的技巧来避免这些缺陷。谢谢@Spudley给出的详细回答。当我使用下面的语法$query=SELECT*FROM contacts时,我遇到了一个错误,其中contact_name=$name;如果我使用下面的语法,我不会出错$查询=从联系人中选择*,其中联系人_name=“$name”;据我所知,第一个是正确的语法。您得到的错误是SQL错误,而不是PHP错误。请参阅我答案的前半部分,以了解最佳解决方案@JohnWoo的回答也有一些重要的提示,说明为什么会出现错误。理解SQL注入的概念并知道如何避免它是很重要的,这意味着你说$query=SELECT*FROM contacts,其中contact_name=$name;语法错误,$query=SELECT*FROM contacts,其中contact_name='$name';如果我想避免错误,这是正确的语法。我想说的是,第二个更好,但两个都不正确。第一个查询永远不会工作;第二种方法可行,但存在严重缺陷。请使用我在回答中描述的技巧来避免这些缺陷。