使用Laravel的查询构建器,我使用以下查询形成了一个数据库事务:
DB::transaction(function($map) {
DB::connection('network')->table('Maps')
->insert([
'Name' => '?',
'Gametype' => '?',
'Author' => '?',
'Enabled' => '?',
'Public' => '?',
'Required' => '?',
'Image' => '?',
'ReleaseDate' => '?',
'ContactInfo' => '?',
], [
$map['name'],
$map['game'],
$map['creator'],
$map['enabled'],
$map['public'],
$map['required'],
$map['image-url'],
$map['released'],
$map['contact'],
]);
DB::connection('website')->table('panel_logs')
->insert([
'message' => 'Added a new map to '. $map['game'] .' called '. $map['name'] .'.',
'timestamp' => Carbon::now(),
'tag' => 2,
'username' => Auth::user()->username
]);
});
第一个查询使用查询绑定将数据插入数据库。我有一个名为maps
的数组,其中包含插入数据,我想绑定值,但它不起作用,因为它将第二个数组视为另一个插入。在文档中,他们没有提供使用构建器进行查询绑定的示例。只是在没有绑定的情况下插入数据会更好吗?这仍然可以保护我免受SQL注入,因为我认为Laravel无论如何都会使用他们的构建器准备好的语句。我只是想确保事情不会发生可怕的错误。
答案 0 :(得分:2)
insert
和查询Connection
类有不同的Builder
方法。
DB::connection('network') // this is Connection object
->table('Maps') // but now it's Query\Builder object
Connection insert
将查询字符串作为第一个参数,绑定作为第二个参数,而另一个为您完成任务(无需手动绑定任何内容)。
所以你需要做的就是:
DB::connection('network')->table('Maps')
->insert([
'Name' => $maps['name'],
'Gametype' => $maps['game'],
...
]);
Builder
将负责准备陈述并约束其价值。
您还需要稍微更改一下交易部分:
DB::transaction(function($con) use ($map) {