【问题标题】:Laravel cannot use mysql_real_escape_string()Laravel 不能使用 mysql_real_escape_string()
【发布时间】:2012-09-19 08:12:05
【问题描述】:

尝试在 Laravel 中使用 mysql_real_escape_string() 时出现数据库连接错误。 Fluent 查询工作正常,因此我假设数据库已正确配置。

mysql_real_escape_string() 应该如何在 Laravel 中使用?由于 Fluent 的限制,我正在使用它来转义我需要自己构建的 SQL 查询中的值。

构建我自己的 SQL 查询的 PHP 代码

    foreach($listings as $listing) {
        $listing = get_object_vars($listing);
        $query = 'INSERT IGNORE into archive ';
        $query .= '(' . implode(',', array_keys($listing)) . ') ';
        $query .= 'VALUES(' . implode(',', array_values( array_map('mysql_real_escape_string', $listing) )) . ')';
        DB::query($query);
    }

错误

mysql_real_escape_string() [function.mysql-real-escape-string]: 
Access denied for user 'nobody'@'localhost' (using password: NO)

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    请改用DB::connection()->getPdo()->quote()

    【讨论】:

      【解决方案2】:

      mysql_real_escapes_string() 使用mysql_connect() 创建的数据库链接,因此只能在您调用mysql_connect() 后使用。

      关于此的重要说明(来自 cmets):

      .. 但不应在选择 PDO 为数据库驱动程序的环境中使用。事实上, mysql_connect() 根本不应该被使用。 – 罗宾诉 G.

      【讨论】:

      • .. 但不应在 PDO 是首选数据库接口的环境中使用。事实上,mysql_connect() 根本不应该再使用了。
      【解决方案3】:

      我的解决方案:

      1. 在 app/lib/helpers.php 中创建自定义帮助文件
      2. 将此添加到composer.json中的自动加载:

        "files": [
            "app/lib/helpers.php"
        ],
        
      3. 添加此功能(可在 php.net 上找到)

        if ( !function_exists('mysql_escape'))
        {
            function mysql_escape($inp)
            { 
                if(is_array($inp)) return array_map(__METHOD__, $inp);
        
                if(!empty($inp) && is_string($inp)) { 
                    return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp); 
                } 
        
                return $inp; 
            }
        }
        
      4. php artisan dump-autoload

      现在您可以在代码中的任何地方使用 mysql_escape。

      【讨论】:

      • 请不要这样做... mysql_* 已经被弃用了一段时间。由于 PDO 使用准备好的语句,您将不再需要转义字符串 :)
      【解决方案4】:

      Laravel 使用PDO,所以没有转义,只是准备好的语句。请参阅Laravel manual on databases

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-16
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多