【问题标题】:PHP escaping questionPHP转义问题
【发布时间】:2010-02-18 12:59:00
【问题描述】:

我刚刚看了下面的代码,但不明白为什么有 " 和 ' 使用。谢谢!

$sql='SELECT uid,name FROM users WHERE user="'.mysql_real_escape_string($_POST['login_name']).'" AND ..

【问题讨论】:

    标签: php escaping


    【解决方案1】:

    不应该。

    “正确的”$sql 可能如下所示:

    $sql="SELECT uid,name FROM users WHERE user='".mysql_real_escape_string($_POST['login_name'])."';
    

    你在 SQL 中使用 ' 来表示它是一个字符串/文字。

    我建议你看看prepared statements,我不相信mysql_real_escape_string 也不相信mysql_very_real_seriously_this_is_the_real_escape_string,php-syndrome 是不值得相信的。

    【讨论】:

    • 是的,这可能是理解准备好的语句之后的自然步骤......不是吗?
    【解决方案2】:

    这是一个用于编写 SQL 查询(并将其存储在字符串中)的 PHP 程序。

    目标 SQL 如下所示:

    SELECT uid,name FROM users WHERE user="something" AND …
    

    所以用 PHP 术语来说:

    $foo = 'SELECT uid,name FROM users WHERE user="something" AND …'
    

    但是您想用动态数据替换“某物”。在这种情况下,发布的 login_name ——但对 MySQL 来说是安全的。

    $foo = 'SELECT uid,name FROM users WHERE user="' .
           mysql_real_escape_string($_POST['login_name']) .
           '" AND …'
    

    更好的方法是使用prepared statements

    【讨论】:

      【解决方案3】:

      单引号包围 SQL 语句 ("SELECT..."),双引号包围字段 "user" 的数据(尽管我会反过来使用引号)。

      查询看起来像这样(使用单引号):

      SELECT uid FROM users WHERE user='snake'
      

      要将此查询分配给变量 $sql,您必须将其括在引号中,这次使用双引号,因此 PHP 不会假设字符串将在 'snake' 之前结束:

      $sql = "SELECT uid FROM users WHERE user='snake'";
      

      由于您不会总是静态地询问“snake”,因此您可以用动态名称交换“snake”,再次使用双引号退出/输入 $sql 字符串:

      $sql = "SELECT uid FROM users WHERE user='" . $dynamic . "'";
      

      如果您只想要一种引号,则必须转义包含用户字符串的引号。

      【讨论】:

        【解决方案4】:

        " 将包含在最终的 mysql 请求中,因此发送到 mysql 数据库的请求将是:

        SELECT uid,name FROM users WHERE user="loginname" AND ..
        

        【讨论】:

          【解决方案5】:

          单引号用于在 PHP 中定义字符串。两个分隔符在 SQL 查询中分隔您的文本字段 (login_name)。

          这样做是为了避免转义查询的引号(如果使用相同的话)。

          【讨论】:

            【解决方案6】:

            您可以使用单引号或双引号来包装 php 中的字符串。不过还是有区别的。

            使用单引号字符串,您不能内联变量(例如:$a = 'hi $name'),也不能转义字符(例如:$a = 'hi!\n$name')。

            这是一个很好的总结:http://www.jonlee.ca/php-tidbit-single-quotes-vs-double-quotes/

            另外附注.. 不确定是否应该使用双引号来封装 SQL 中的字符串。我相信您应该在大多数数据库中使用单引号。

            【讨论】:

            • 是的,双引号不可移植,即 MS Sql Server 使用“字段”来表示字段/表名称(MySQL 使用 field)。但是,由于这是 PHP,它可能是一个 MySQL 数据库,并且没有编写 vor 可移植性,所以这无关紧要。
            【解决方案7】:

            看起来单引号用于 PHP 代码的查询形式,而双引号用于查询本身

            More on Single/Double quotes

            在对数据库执行 SQL 之前,您始终可以回显 $sql 值以查看单引号/双引号的外观。

            类似:

            $sql='SELECT uid,name FROM users WHERE
            user="'.mysql_real_escape_string($_POST['login_name']).'";
            
            // Print the SQL
            echo $sql."<br />";
            

            【讨论】:

              猜你喜欢
              • 2011-12-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-27
              • 2013-11-15
              • 1970-01-01
              • 2014-12-03
              • 2016-12-20
              相关资源
              最近更新 更多