我似乎并不是唯一一个在Laravel的DB :: raw(),DB :: select(),DB :: statement()和DB :: unfpared之间挣扎的人() 方法。似乎人们几乎需要尝试使用全部4的给定SQL语句来识别哪个将起作用。任何人都可以澄清它们之间的关系,以及用于何种目的的方法?
答案 0 :(得分:14)
我会尽力澄清:
它生成一个原始和已清理的SQL字符串,以传递给其他查询/语句,从而阻止SQL注入。是和所有人一起使用而且从不孤单。并且您永远不应该向查询/语句发送未经过清理的字符串。
DB::select(DB::raw('select * from whatever'));
用于简单选择:
DB::select(DB::raw('select * from whatever'));
我认为它适用于选择,但应该用于非SQL查询命令:
DB::statement(DB::raw('update whatever set valid = true;'));
Laravel中的所有SQL命令都是默认准备的,但有时您需要在未准备模式下执行命令,因为某些数据库中的某些命令无法在准备模式下运行。这是我打开的一个问题:https://github.com/laravel/framework/issues/53
DB::unprepared(DB::raw('update whatever set valid = true;'));
答案 1 :(得分:0)
Laravel> = 5.0的更多正确答案(我认为)
DB :: raw()
产生“ raw”,表示“未消毒”的字符串。这就是在Laravel Docs上出现警告的原因:
DB :: select(),DB :: insert(),DB :: update(),DB :: delete()
这些是Laravel提供的运行准备好的语句的实用方法。
DB :: statement()
这再次用于运行不特定于CRUD的准备好的语句。
The methods which use prepared statements为SQL注入提供保护,而使用raw expressions时,此责任属于程序员。
DB :: unprepared()
Laravel Docs上没有关于它的信息,而互联网上只有很少的信息。尽管如此,我还是根据上面的答案对此进行了测试:
Laravel, create MySQL trigger from Migration
例如我尝试首先使用DB :: statement()方法创建MySQL触发器,但在迁移时却给了我这个错误:
Exception trace:
1 PDOException::("SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if
your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.")
C:\wamp64\www\oscared-laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458
2 PDOStatement::execute()
C:\wamp64\www\oscared-laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458
但是,当我使用DB :: unprepared()测试它时,它运行顺利。 (Laravel 5.8)