laravel插入查询中的绑定参数

时间:2014-07-17 13:49:20

标签: php mysql sql laravel

使用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无论如何都会使用他们的构建器准备好的语句。我只是想确保事情不会发生可怕的错误。

1 个答案:

答案 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) {