Laravel / PDO没有逃避反斜杠或引号?

时间:2016-07-07 17:46:03

标签: mysql laravel pdo

在laravel中,我有一个用户可以输入的搜索框来搜索数据库。

它在提交时执行以下代码(这里只显示重要部分)。

$searchBox = $request->get('searchBox');

...
$getSearch->where(function($query) use($searchBox) {
    $query->orWhere('event', 'LIKE', '%'.$searchBox.'%');
    $query->orWhere('sub_event', 'LIKE', '%'.$searchBox.'%');
});

问题是如果用户输入双引号(")或反斜杠(),则查询失败。似乎没有逃脱这些角色。

如果我这样做。

$searchBox = addslashes($searchBox);

然后它很棒。

我不知道这是一个laravel还是PDO问题(或根本不是问题)。我是否需要清理反斜杠的所有用户输入?我应该使用addslashes吗?或者我不明白这是如何工作的。

当搜索词包含反斜杠或双引号时,如何在mysql / PDO / laravel中执行LIKE搜索?

由于

*修改

我应该检查一下我实际得到的错误是什么。我现在已经这样做了。

我认为它给出了一个奇怪的错误,因为它在我运行查询时给出了我的网页重定向循环。但是@David Smith的评论让我重新检查了一下。事实证明,这是导致循环的查询的零结果。

很抱歉,从一开始我就应该更清楚了。查询实际上并没有失败,我只是没有结果。

但我需要人们能够搜索可能(并且确实)有反斜杠和双引号的评论/字段。

实际上,修复循环似乎现在可以使用双引号。它只是反斜杠导致零结果。如果我搜索一个有反斜杠的短语,我就没有结果。

我不认为那是因为查询将反斜杠视为转义字符,而不是反斜杠来搜索。

如果那是对的,那么如何让我的用户搜索包含反斜杠的字词?还有续路吗?

2 个答案:

答案 0 :(得分:1)

A backslash is a special character for LIKE,因此必须仅为此运算符进行转义。

因此,如果您确实必须仔细匹配反斜杠,那么使用此代码处理您在LIKE语句中使用的数据

$data = addCslashes($data, '\\');

答案 1 :(得分:0)

如果使用Laravel,请使用四转义符:

// querying for 'Foo\Bar'...
Model::where('backslashes', 'like', 'Foo\\\\Bar')->get()

Laravel文档中应注明让我发疯了。