【问题标题】:PHP: different quotes?PHP:不同的报价?
【发布时间】:2009-08-23 08:02:56
【问题描述】:

引号 " 和 ' 有什么区别?` 呢?下面使用不同的引号 ' 和 " 会不会出错?

 $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 )
          )

【问题讨论】:

    标签: php quotes


    【解决方案1】:

    使用单引号 (') 时不会进行变量替换,这意味着如果它是常规字符串并且没有传递给替换它们的函数,则第一个示例中的值实际上是 $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

    【讨论】:

    • 控制字符的转义,如 \n 和 \t 也不会在单引号字符串中展开。
    • $sql1 这样的字符串总是让我畏缩。如果你真的想在其中包含一个变量,我总是喜欢使用{$email}。我通常的做法:"WHERE email = ".$email,这绝对清楚地表明它不是字面意思。
    • 当然,这些方法都不能安全地防止 SQL 注入,无论您如何称呼变量! OP 是对的,在单引号中使用 $1 等到 pg_query_params ;这里实际上没有发生变量替换。 '$1​​' 语法可能有点误导......其他查询参数化系统只使用'?'。
    • PHP 使用状态机 (like this) 对输入文本进行标记,因此当您不使用变量插值时,单引号和双引号之间绝对没有性能差异。此外,展示其中存在严重安全漏洞的示例代码并不酷。
    【解决方案2】:

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

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

    使用' 表示不检查变量。

    <?php
    echo '$beer';
    ?>
    

    将输出$beer

    【讨论】:

      【解决方案3】:

      单引号和双引号字符串的区别在PHP manual about Strings中有很好的解释。

      在您的示例中,由于您正在使用诸如 $1 之类的替换变量,这意味着特定于 pg_query_params 并且您确实希望 PHP 将其解释为变量名称,因此您应该使用 single SQL 查询字符串的引号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2020-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多