PHP:不同的引号?

7
双引号 " 和单引号 ' 有什么区别?反引号 ` 呢?下面使用不同引号 ' 和 " 会有错误吗?
 $result = pg_query_params($dbconn,
      'INSERT INTO users 
      (username, email, passhash_md5)
      VALUES ($1, $2, $3)',
          array($username, $email, $passhash_md5
      )


      $result = pg_query_params( $dbconn,
          "SELECT user_id
           FROM users
          WHERE email = $1",
          array( $email )
          )
3个回答

20

使用单引号(')时,变量替换不会执行,这意味着在您的第一个示例中,如果它是普通字符串而不是传递给替换它们的函数,则其值将成为“$1”、“$2”等文字。

如果您不需要变量替换,出于性能原因最好使用单引号。

“`”符号调用shell引擎并将其作为实际命令调用,并返回结果,就像在perl中一样。 因此,它具有完全不同的含义。

示例:

$email = 'user@example.org';
$sql1 = "SELECT user_id FROM users WHERE email = $email";
$sql2 = 'SELECT user_id FROM users WHERE email = $email';

$sql1将是SELECT user_id FROM users WHERE email = user@example.org

$sql2将是SELECT user_id FROM users WHERE email = $email


5
在单引号字符串中,像 \n 和 \t 这样的控制字符转义符不会被展开。 - PhiLho
1
$sql1这样的字符串总是让我感到不舒服。如果你真的想在其中包含一个变量,那么使用 {$email}总是更受我的喜爱。我的常用方法是:"WHERE email = ".$email,它可以让人清楚地知道它不应该被字面理解。 - JorenB
1
当然,无论你如何称呼变量,这些方法都不能安全地防止SQL注入!OP是正确的,在单引号中使用$1等将其传递给pg_query_params;实际上这里没有进行任何变量替换。 “$1”语法可能有点误导性……其他查询参数化系统只使用“?”。 - bobince
4
PHP使用状态机来对输入文本进行标记化,类似于这个网址(http://gcov.php.net/PHP_5_3/lcov_html/var/php_gcov/PHP_5_3/Zend/zend_language_parser.c.gcov.php)。因此,当你不使用变量插值时,单引号和双引号之间绝对没有性能差异。此外,在示例代码中展示存在严重安全漏洞的内容并不好。 - Kornel

3
基本上," 允许你像这样嵌入变量:

<?php
$beer = 'Heineken';
echo "$beer's taste is great"; // works; "'" is an invalid character for variable names
echo "He drank some $beers";   // won't work; 's' is a valid character for variable names but the variable is "$beer"
echo "He drank some ${beer}s"; // works
echo "He drank some {$beer}s"; // works
?>

(来自php手册

使用'表示不对变量进行检查。

<?php
echo '$beer';
?>

会输出$beer


2

单引号和双引号字符串的区别在PHP手册关于字符串中有详细解释。

在您的示例中,由于您正在使用诸如$1之类的替换变量,这些变量对于pg_query_params具有特定含义,并且您不希望PHP将其解释为变量名,因此应该在SQL查询字符串中使用单引号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接