在带有 PDO 的 like 子句中使用带撇号的字符串时,如何正确处理它?
How do I properly handle a string with an apostrophe when using it within a like clause with PDO?
我正在尝试使用 PDO 使用 like 子句进行字符串搜索。该名称有一个撇号。到目前为止,我所有的尝试都没有找到任何结果,即使名称存在。
此代码有效,我对数组值进行了硬编码:
// looking for last names that start with A' and any first name
like_string = array("A'%", "B%");
$sql = "SELECT p.last_name, p.first_name
FROM person p
WHERE p.last_name LIKE ? AND p.first_name LIKE ? ";
$fields = array($like_string[0], $like_string[1]);
$stmt = $this->pdb->prepare($sql);
$stmt->execute($fields);
$result = $stmt->fetchALL(PDO::FETCH_ASSOC);
然而,在 php 代码中构建字符串数组的这段代码没有,我不明白为什么。
// e.g $search val = "A', B";
$search_array = explode(',',$search_val);
$like_string[0] = trim($search_array[0]) . "%";
$like_string[1] = trim($search_array[1]) . "%";
上述代码的结果产生数组值:
$like_string[0] = "A'%"
$like_string[1] = "B%"
还没有返回任何行。我什至尝试添加 addslashes 如下所示 - 仍然没有获取任何行:
// e.g $search val = "A', B";
$search_array = explode(',',$search_val);
$like_string[0] = addslashes(trim($search_array[0]) . "%");
$like_string[1] = addslashes(trim($search_array[1]) . "%");
如有任何帮助,我们将不胜感激。
作为对先前评论的更新,下面的代码生成
$search_val = "A', B";
$search_array = explode(',',$search_val);
$like_string[0] = trim($search_array[0]) . "%";
$like_string[1] = trim($search_array[1]) . "%";
var_dump($like_string);
来自 var_dump
的以下输出
array (size=2)
0 => string 'A'%' (length=3)
1 => string 'B%' (length=2)
而且我认为问题是上面的结果字符串没有用双引号引起来。那么我该如何强制它发生呢?
我发现了这个问题。正在通过调用
清理用户输入的搜索字符串
escape_string(filter_var($item_to_prep, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH));
这导致了与 PDO 函数的冲突。
我正在尝试使用 PDO 使用 like 子句进行字符串搜索。该名称有一个撇号。到目前为止,我所有的尝试都没有找到任何结果,即使名称存在。
此代码有效,我对数组值进行了硬编码:
// looking for last names that start with A' and any first name
like_string = array("A'%", "B%");
$sql = "SELECT p.last_name, p.first_name
FROM person p
WHERE p.last_name LIKE ? AND p.first_name LIKE ? ";
$fields = array($like_string[0], $like_string[1]);
$stmt = $this->pdb->prepare($sql);
$stmt->execute($fields);
$result = $stmt->fetchALL(PDO::FETCH_ASSOC);
然而,在 php 代码中构建字符串数组的这段代码没有,我不明白为什么。
// e.g $search val = "A', B";
$search_array = explode(',',$search_val);
$like_string[0] = trim($search_array[0]) . "%";
$like_string[1] = trim($search_array[1]) . "%";
上述代码的结果产生数组值:
$like_string[0] = "A'%"
$like_string[1] = "B%"
还没有返回任何行。我什至尝试添加 addslashes 如下所示 - 仍然没有获取任何行:
// e.g $search val = "A', B";
$search_array = explode(',',$search_val);
$like_string[0] = addslashes(trim($search_array[0]) . "%");
$like_string[1] = addslashes(trim($search_array[1]) . "%");
如有任何帮助,我们将不胜感激。
作为对先前评论的更新,下面的代码生成
$search_val = "A', B";
$search_array = explode(',',$search_val);
$like_string[0] = trim($search_array[0]) . "%";
$like_string[1] = trim($search_array[1]) . "%";
var_dump($like_string);
来自 var_dump
的以下输出array (size=2)
0 => string 'A'%' (length=3)
1 => string 'B%' (length=2)
而且我认为问题是上面的结果字符串没有用双引号引起来。那么我该如何强制它发生呢?
我发现了这个问题。正在通过调用
清理用户输入的搜索字符串escape_string(filter_var($item_to_prep, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH));
这导致了与 PDO 函数的冲突。