Laravel 5.1 Eloquent转义字符串参数(havingraw)

6
我收到了一个字符串参数,我想使用havingRaw函数来处理它:
收到的字符串:
$searchString = Input::get('q');//example:party beach

我在不同的问题中发现,为了防止SQL注入,我应该使用以下方法:

$searchStringEsc = DB::connection()->getPdo()->quote($searchString);

我遇到的问题是,当我使用havingRaw插入查询时,由于我的字符串现在已经被转义为“party beach”,它返回null,但是当我插入未转义的字符串时,它可以正常工作。

->havingRaw('search rlike replace("'.$searchStringEsc.'", " ", "|")')

有没有其他方法可以避免使用原始参数?谢谢。

编辑-- 完整查询(我正在进行搜索查询,用户可以输入城市名称、机构名称、与机构相关的任何标签等...)

            $results = DB::table('events')
            ->leftJoin('event_tag', 'events.id', '=', 'event_tag.event_id')
            ->join('tags', 'tags.id', '=', 'event_tag.tag_id')
            ->join('establishments', 'establishments.id', '=', 'events.establishment_id')
            ->join('cities', 'establishments.city_id', '=', 'cities.id')
            ->leftJoin('artist_event', 'events.id', '=', 'artist_event.event_id')
            ->join('artists', 'artist_event.artist_id', '=', 'artists.id')
            ->leftJoin('event_music', 'events.id', '=', 'event_music.event_id')
            ->join('musics', 'musics.id', '=', 'event_music.music_id')
            ->select('events.id as evId', 'events.slug as evSlug', 'events.name as evName',
                'events.cover_path as estPath','establishments.establishment_type_id as estType',
                'establishments.name as estName', 'events.start_date as evStart', 'events.end_date as evEnd',
                'cities.name as ciName',
                DB::raw('CONCAT_WS(",",
                        GROUP_CONCAT(distinct tags.name),
                        GROUP_CONCAT(distinct artists.name),
                        GROUP_CONCAT(distinct cities.name),
                        GROUP_CONCAT(distinct events.name),
                        GROUP_CONCAT(distinct musics.name)
                        ) as search'))
            ->where('events.end_date','>=', DB::raw('NOW()'))
            ->where('establishments.is_active','=',1)
            ->groupBy('events.id')
            ->havingRaw('search rlike replace("'.$searchString.'", " ", "|")')
            ->orderBy('events.total_visited', 'desc')
            ->take(5)->get();

如果我将其保留为 $searchString(未转义字符串),则可以正常工作。 但是,如果我将其更改为 $searchStringEsc(转义字符串),它将返回 null。

1个回答

2
您可以简单地使用查询绑定,因此替换:
 ->havingRaw('search rlike replace("'.$searchString.'", " ", "|")')

使用

->havingRaw('search rlike replace(?, " ", "|")', [$searchString])

这里有一个处理所有转义需求的函数(whereRaw也可以实现)。而?只是表示你在那里有一个绑定参数(即$searchString)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接