Laravel不能使用mysql_real_escape_string()

时间:2012-09-27 13:57:44

标签: php mysql laravel

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

如何从Laravel使用mysql_real_escape_string()?我正在使用它来逃避我需要自己构建的SQL查询中的值,因为Fluent的限制。

构建我自己的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)

4 个答案:

答案 0 :(得分:10)

改为使用DB::connection()->getPdo()->quote()

答案 1 :(得分:4)

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

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

  

..但不应该在PDO是首选数据库驱动程序的环境中使用。实际上,不应再使用mysql_connect()了。 - 罗宾诉G。

答案 2 :(得分:3)

我的解决方案:

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

    "files": [
        "app/lib/helpers.php"
    ],
    
  4. 添加此功能(在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; 
        }
    }
    
  5. php artisan dump-autoload

  6. 现在,您可以在代码中的任何位置使用mysql_escape。

答案 3 :(得分:2)

Laravel使用PDO,所以没有逃避,只是准备好的陈述。请参阅Laravel manual on databases