2016-07-07 427 views
0

在laravel中,我有一个用户可以输入的搜索框来搜索数据库。Laravel/PDO不能转义反斜杠或引号?

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

$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的问题(或者不是一个问题,在所有)。我需要进行消毒的反斜杠所有的用户输入?我应该使用addsl骨灰?还是我不明白这应该如何工作。

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

感谢

*编辑

我应该检查什么,我实际上得到的错误了。我现在已经做到了。

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

非常抱歉,我应该从一开始就更加清楚。查询实际上并不“失败”,我只是没有结果。

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

事实上,修复循环似乎现在双引号工作。它的反斜杠导致了零结果。如果我搜索带有反斜杠的短语,则不会得到任何结果。

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

如果这是正确的,那么我该如何让我的用户搜索包含反斜杠的条款? addslashes仍然是要走的路?

+0

Laravel不需要逃避数据,因为它使用的参数查询。我的猜测是数据库中的数据实际上包含斜线,而不应该使用斜线。 – patricus

+0

你说“查询失败”。这到底是什么意思? MySQL返回错误,还是查询返回零结果? –

+0

@DavidSmith你带来了一个好点,我编辑澄清。失败意味着这里的结果为零。 – Nertskull

回答

1

A backslash is a special character for LIKE,因此必须仅为该操作员转义。

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

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

所以我应该总是使用LIKE运算符的搜索字段使用addcslashes?这不会影响PDO查询正常进行的转义? – Nertskull

+0

是的,看起来像你必须使用它。不,它不应该干涉。 –