使用PHP的SQL命令中的引号和双引号

时间:2017-06-28 15:27:40

标签: php

我发现了一段这样的代码:

<?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?

感谢。

2 个答案:

答案 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手册。