我发现了一段这样的代码:
<?php
class myClass {
function myFunc(&$par1) {
// [...]
$val2 = $par1->field1;
// [...]
$val3_escaped = mysql_real_escape_string($someVar2);
$cmdInsert = "insert into tab1(col1,col2,col3, col4) values(1,'$val2',\"$val3_escaped\",'val4')";
$result = mysql_query($cmdInsert, $myConnection);
}
}
?>
我想知道'$val2'
和\"$val3_escaped\"
之间的区别是什么?两者都有效吗?
我想这应该是正确的,只有单引号,但它似乎只适用于\"
。
什么是正确的sintax?
感谢。
答案 0 :(得分:3)
转义字符是为了PHP的利益(因为PHP字符串由&#34;字符分隔)。它与发送给MySQL的内容无关。
单引号在SQL中分隔字符串。
双引号在标准SQL中没有意义。在MySQL中,它们的含义与“和”相同。或者`取决于ANSI_QUOTES setting。避免它们。
警告:您使用的an obsolete database API已完全从最新版本的PHP中删除。你应该使用modern replacement。
使用现代替代品,您可以将预备语句与占位符一起使用,而不必担心引用变量。
答案 1 :(得分:1)
我同意this answer Quentin,但由于你仍有疑问,这里有解释。希望这会有所帮助。
'$val2'
特殊字符的变量和转义序列在单引号字符串中出现时,不会扩展(它们代表的实际值)。 例如 -
// Outputs: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either';
因此,在您的情况下,'$val2'
只会将$val2
字符串添加到查询中,而不是其值。
\"$val3_escaped\"
如果字符串用双引号(“)括起来,PHP 将解释特殊字符的所有变量和转义序列。(例如\n
,\t
等等。)。
\"
- 只会在双引号内使用时打印双引号。 :)
因此,在您的情况下,PHP将获得其实际值并添加到查询中(由于外部双引号)。
示例 -
$juices = array("apple", "orange", "koolaid1" => "purple");
//Outputs : He drank some apple juice.
echo "He drank some $juices[0] juice."
有关详细信息,请参阅PHP:Strings手册。