PHP SQL Remove/ignore 搜索输入中的空格、制表符等
PHP SQL Remove/ignore spaces, tabs etc from search input
当用户在 sql 数据库中搜索时,我试图从他的输入中删除空格、白线和制表符。
所以基本上他搜索 'Test'(字符串后面的两个空格)它给出零结果,而 'Test' 是数据库中的正确结果。如何让 php / sql 在 sql 语句中仅使用单词 'Test' 作为关键字,这样即使用户 post 之前有空格,也会生成结果或在绳子后面。我们在搜索时使用了很多复制和粘贴,所以很多时候空格和内容都在粘贴中。
我知道这里已经准备好了问题。我尝试了所有我能实现的(正如你在矫枉过正的试验中看到的那样)但是 none 似乎可以解决问题..
请帮忙,我做错了什么?
$searchresult = trim(filter_var(isset($_POST['usearch10'])?$_POST['usearch10']:'' , FILTER_SANITIZE_STRING));
$save = trim(filter_var("%{$_POST['usearch10']}%", FILTER_SANITIZE_STRING));
$safedef = trim($save);
$stmt2 = $mysqli->prepare("SELECT * FROM table WHERE `colomn` LIKE trim(?)");
$stmt2->bind_param("s",$safedef);
$stmt2->execute();
$result = $stmt2->get_result();
while ($obj = $result->fetch_assoc()) {
你需要做两件事。一种是删除 spaces,trim
就足够了。除非您是从 Microsoft Word 复制粘贴,否则您可能会隐藏白色 space、不间断 space,并且可能 snakes。要摆脱 those 你可能需要使用正则表达式(需要 UTF8/mbstring 支持),
$search = preg_replace('#^\s*(.*)\s*$#', '\1', $search);
我不确定,但也许如果您从 HTML 复制粘贴,您甚至可能会遇到“”而不是 space,因此您可能还想使用 html_entity_decode
(在确认您需要它之后 - 它可能是其他麻烦的根源)。
那你需要指定一个包含;在过滤之后这样做,以防万一,像这样
$search = trim($search);
$search = "%{$search}%"; // search term anywhere
WHERE `column` LIKE ? # You wrote 'colomn' but I assume it was a typo
这 必须 有效,但您也可以这样做:
...WHERE `column` LIKE CONCAT('%', ?, '%');
确保 MySQL 理解您要告诉它的内容。
也尝试打印搜索词和查询,然后 运行手动打印它,看看会发生什么。并始终检查查询是否 运行 成功。为了更安全,转储 json_encode($search)
。因此,如果您忘记了一个 semispace,您将看到的不是预期的“测试”,而是类似“Test\u00a0”的东西,如果没记错的话,“Test\u00a0”。
如果最坏的情况出现,激活 session-level MySQL 中的“general_log”并检查实际查询 MySQL 在 MySQL log_file.
中发送
我从未在 SQL 中使用过 trim
,但如果这改变了某些东西,你的问题可能是你没有像 LIKE ”%STRING_TO_SEARCH%"
那样搜索。 %
开头会告诉你匹配它之前的任何内容,最后的相同字符也会告诉你匹配你想要的字符串之后的任何内容。
当用户在 sql 数据库中搜索时,我试图从他的输入中删除空格、白线和制表符。
所以基本上他搜索 'Test'(字符串后面的两个空格)它给出零结果,而 'Test' 是数据库中的正确结果。如何让 php / sql 在 sql 语句中仅使用单词 'Test' 作为关键字,这样即使用户 post 之前有空格,也会生成结果或在绳子后面。我们在搜索时使用了很多复制和粘贴,所以很多时候空格和内容都在粘贴中。
我知道这里已经准备好了问题。我尝试了所有我能实现的(正如你在矫枉过正的试验中看到的那样)但是 none 似乎可以解决问题..
请帮忙,我做错了什么?
$searchresult = trim(filter_var(isset($_POST['usearch10'])?$_POST['usearch10']:'' , FILTER_SANITIZE_STRING));
$save = trim(filter_var("%{$_POST['usearch10']}%", FILTER_SANITIZE_STRING));
$safedef = trim($save);
$stmt2 = $mysqli->prepare("SELECT * FROM table WHERE `colomn` LIKE trim(?)");
$stmt2->bind_param("s",$safedef);
$stmt2->execute();
$result = $stmt2->get_result();
while ($obj = $result->fetch_assoc()) {
你需要做两件事。一种是删除 spaces,trim
就足够了。除非您是从 Microsoft Word 复制粘贴,否则您可能会隐藏白色 space、不间断 space,并且可能 snakes。要摆脱 those 你可能需要使用正则表达式(需要 UTF8/mbstring 支持),
$search = preg_replace('#^\s*(.*)\s*$#', '\1', $search);
我不确定,但也许如果您从 HTML 复制粘贴,您甚至可能会遇到“”而不是 space,因此您可能还想使用 html_entity_decode
(在确认您需要它之后 - 它可能是其他麻烦的根源)。
那你需要指定一个包含;在过滤之后这样做,以防万一,像这样
$search = trim($search);
$search = "%{$search}%"; // search term anywhere
WHERE `column` LIKE ? # You wrote 'colomn' but I assume it was a typo
这 必须 有效,但您也可以这样做:
...WHERE `column` LIKE CONCAT('%', ?, '%');
确保 MySQL 理解您要告诉它的内容。
也尝试打印搜索词和查询,然后 运行手动打印它,看看会发生什么。并始终检查查询是否 运行 成功。为了更安全,转储 json_encode($search)
。因此,如果您忘记了一个 semispace,您将看到的不是预期的“测试”,而是类似“Test\u00a0”的东西,如果没记错的话,“Test\u00a0”。
如果最坏的情况出现,激活 session-level MySQL 中的“general_log”并检查实际查询 MySQL 在 MySQL log_file.
中发送我从未在 SQL 中使用过 trim
,但如果这改变了某些东西,你的问题可能是你没有像 LIKE ”%STRING_TO_SEARCH%"
那样搜索。 %
开头会告诉你匹配它之前的任何内容,最后的相同字符也会告诉你匹配你想要的字符串之后的任何内容。