Php Laravel和#x27之间的差异;s原始SQL函数

Php Laravel和#x27之间的差异;s原始SQL函数,php,laravel-4,eloquent,Php,Laravel 4,Eloquent,似乎我不是唯一一个为拉威尔的DB::raw()、DB::select()、DB::statement()和DB::unprepared()方法之间的差异而挣扎的人。似乎人们几乎需要尝试一个包含所有4个语句的给定SQL语句来确定哪一个可以工作。有谁能澄清它们之间的关系,以及它们的用途是什么?我将尝试澄清: DB::raw() 它生成一个原始的、经过净化的SQL字符串,并将其传递给其他查询/语句,从而防止SQL注入。是用来与所有的,而不是单独。而且,您永远不应该向查询/语句发送未经消毒的字符串 DB

似乎我不是唯一一个为拉威尔的DB::raw()、DB::select()、DB::statement()和DB::unprepared()方法之间的差异而挣扎的人。似乎人们几乎需要尝试一个包含所有4个语句的给定SQL语句来确定哪一个可以工作。有谁能澄清它们之间的关系,以及它们的用途是什么?

我将尝试澄清:

DB::raw() 它生成一个原始的、经过净化的SQL字符串,并将其传递给其他查询/语句,从而防止SQL注入。是用来与所有的,而不是单独。而且,您永远不应该向查询/语句发送未经消毒的字符串

DB::select(DB::raw('select * from whatever'));
DB::select() 用于简单选择:

DB::select(DB::raw('select * from whatever'));
DB::语句() 我认为它适用于selects,但应用于非SQL查询命令:

DB::statement(DB::raw('update whatever set valid = true;'));
DB::unprepared() 默认情况下,Laravel中的所有SQL命令都已准备就绪,但有时需要在未准备就绪的模式下执行命令,因为某些数据库中的某些命令无法在准备就绪的模式下运行。这里有一个问题是我打开的:

更正确的答案(我认为)为拉威尔>=5.0

DB::raw()

生成“raw”,表示“未消毒”字符串。这就是为什么屏幕上有一个警告:

DB::select()、DB::insert()、DB::update()、DB::delete()

这些是Laravel提供的运行准备好的语句的实用方法

DB::select(DB::raw('select * from whatever'));
DB::statement()

这同样适用于运行不特定于CRUD的准备好的语句

为SQL注入提供保护,而在使用时,此责任属于程序员

DB::未准备好()

Laravel文档中没有关于它的信息,互联网上的信息也很少。然而,考虑到上述答案,我对其进行了测试:

e、 g.我尝试先用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)

您在
DB::raw
中犯了一个小错误-它生成未经消毒的字符串,并且不会阻止注射。另外,
DB::statement
可以接受一些命令/语句,比如
set@var=0
。然而,对于大多数人来说,它应该像你说的那样是毫无准备的。谢谢,这非常有帮助。对于DB::statement()来说,“应该用于非SQL查询命令”是什么意思?当我们调用存储过程时,使用什么,
DB::select
DB::statement
?例如:
DB::select('callstoredprocesdure(?,)',数组($a,$b))
DB::语句('callstoredprocedure(?,),数组($a,$b))