2017-06-28 72 views
0

我发现像这样的一段代码:行情和SQL命令双引号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?

谢谢。

+1

使用准备好的语句。请保护您免受SQL注入。那么你甚至不需要担心引号与双引号。 – ctwheels

+0

正确的语法是将所有它,所有停止使用已停用的'mysql_'扩展名,并移动到'mysqli_'或'pdo'准备语句与绑定参数... – CD001

+0

这是一个非常古老的现有CRM,我是一个Java程序员,我试图修复该应用程序的一个小错误。不管怎么说,还是要谢谢你。 – Alessandro

回答

3

转义字符是PHP(因为PHP字符串由“字符分隔)的好处。它无关什么被发送到MySQL。

单引号中的SQL字符串定界。

双引号在标准SQL没有意义在MySQL中,他们可能意味着相同的'或'取决于ANSI_QUOTES setting避免他们


警告:。你是USI ng an obsolete database API已从中删除完全来自PHP的最新版本。您应该使用modern replacement

使用现代替代品,您可以使用带占位符的准备好的语句,而不用担心引用变量。

+0

感谢您的答案,这是一个非常古老的现有客户关系管理,我是一个Java程序员,我试图修复该应用程序的一个小错误。只是一个问题... PHP替代任何变量,以字符串内$开始?你不需要关闭引号并连接变量? – Alessandro

+0

好的,我明白了...非常感谢。 – Alessandro

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将获取其实际值并添加到查询中(由于外层do Uble引号)。

示例 -

$juices = array("apple", "orange", "koolaid1" => "purple"); 
//Outputs : He drank some apple juice. 
echo "He drank some $juices[0] juice." 

您可以参考PHP:Strings手册了解更多细节。

+1

这就是我正在寻找的。所以正确的方法应该是\“$ val3_escaped \”,否则它不能用它的值替换var。现在,我很清楚。谢谢。 – Alessandro

+0

如果它已帮助您,请将其标记为答案。谢谢:) –

+0

我已经upvoted你的答案,但对不起,现在我意识到整个字符串是用双引号括起来的,所以其他答案是最合适的。谢谢。 – Alessandro