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%" 那样搜索。 % 开头会告诉你匹配它之前的任何内容,最后的相同字符也会告诉你匹配你想要的字符串之后的任何内容。