PHP:MYSQLi查询在搜索参数包含单引号时不返回结果

PHP:MYSQLi查询在搜索参数包含单引号时不返回结果,php,mysqli,Php,Mysqli,我有一个搜索MySQL表的PHP脚本。它适用于常规文本搜索,但当搜索字符串包含单引号(如单词O'Brien)时,它不会返回结果。在phpMyAdmin中运行等效的SQL不会返回结果 以下是我正在使用的代码: $mysqli = new mysqli($host, $user, $password, $database); $mysqli->set_charset('utf8'); if (isset($_GET["q"])) { $search = $_GET["q"];

我有一个搜索MySQL表的PHP脚本。它适用于常规文本搜索,但当搜索字符串包含单引号(如单词O'Brien)时,它不会返回结果。在phpMyAdmin中运行等效的SQL不会返回结果

以下是我正在使用的代码:

$mysqli = new mysqli($host, $user, $password, $database);
$mysqli->set_charset('utf8');    

if (isset($_GET["q"]))
{
    $search = $_GET["q"];
}

$sql = 'SELECT * FROM MyTable WHERE MyField LIKE ?';
$stmt = $mysqli->prepare($sql);
$param = '%' . $search . '%';
$stmt->bind_param("s", $param);
$stmt->execute();
$result = $stmt->get_result();
如何处理像O'Brien这样的字符串以便返回结果?

使用mysqli::real\u escape\u string


希望这有帮助。

好的,问题似乎是一些使用filter\u var的旧代码:

filter_var($search, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
当我删除它时,查询将按预期工作

谢谢你的时间


Paul

当您使用准备好的语句时,这是不必要的,它实际上会在您的变量中添加斜杠,而数据库中可能没有斜杠。@jeroen准备好的语句不应该有问题,但显然是这样。考虑到这一点,我怀疑OP已经开启了magic quotes,但如果他们无法改变这一点,那么这是一个可以接受的解决方法。不,这是另一种方法,如果magic quotes真的启用,输入已经有引号,需要将它们剥离以匹配数据库,其中引号不会用反斜杠转义…您验证了$search的值吗?如果您使用的是非常旧的服务器,理论上可以启用magic quotes…对于数据库中的确切值,它们是否正是您期望的值?澄清一下,这意味着sanitize筛选器正在更改输入数据,而查询无法匹配数据库中更改的字符串,因为没有条目匹配它。这并不是因为任何与SQL注入有着远程关联的东西,就像每个人似乎都关注的那样,不管您是否正确地使用了一个准备好的语句。如果您在最初的问题中包含了上述代码,那么问题至少对我们来说是显而易见的。到底是谁提到了SQL注入?@worldofjr将错误地包含在SQL查询中的引号与SQL注入等同起来,这意味着您,另一个家伙已经删除了他的答案。@Sammitch我的答案使用了一种逃避特殊字符的方法。SQL注入不会有问题,因为OP使用的是预先准备好的语句。确实,它也应该避免特殊字符的问题,但这取决于数据库中存储的内容。@worldofjr我不想争论这一点,jeroen已经在你的[错误]答案的评论中指出了你推理的缺陷。
filter_var($search, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);