Datatables 服务器端脚本并使用 SQL MATCH 命令搜索每一列

Datatables server side script and search on every column using SQL MATCH COMMAND

提问人:user2965052 提问时间:1/4/2023 更新时间:1/5/2023 访问量:62

问:

我正在尝试将 MATCH SQL 命令与服务器端数据表脚本一起使用,但不知何故数据表无法工作,它没有找到任何结果,但如果我将查询输出复制并粘贴到任何 sql 客户端,它工作正常并找到预期的结果(匹配)。

为了让你了解上下文,这就是我现在所做的:

1-在数据库上创建一个FULLTEXT索引,其中包含将用于搜索的列:

ALTER TABLE site ADD FULLTEXT INDEX fulltext_index_site (id, title, domain);

2-更改了服务器端脚本中搜索字符串的逻辑:

$searchValue = mysqli_real_escape_string($mysqli,$_POST['search']['value']); // Search value

## Search
$searchQuery = " ";
if($searchValue != ''){
   $searchQuery = " AND MATCH(id, title, domain) AGAINST('".$searchValue."' IN BOOLEAN MODE)";
      }

3-我已将查询更改为使用MATCH命令:

select id, title, domain
from site
where 1 ".$searchQuery."

4-但是如果我去客户端搜索一些东西,找不到任何结果......我还检查了有效负载,search[value] 具有要搜索的值,但没有返回任何结果。即使我放了一个回声并得到输出:

select id, title, domain
from site
where 1 AND MATCH(id, title, domain) AGAINST('test' IN BOOLEAN MODE);

并且在 sql 客户端上运行良好,它返回与“test”模式匹配的所有行,但在数据表上只说“未找到结果”。

5-我什至尝试使用LIKE OR方法,但这无法正常工作,因为该模式必须是搜索到的每个列的巧合。

例如:

## Search
$searchQuery = " ";
if($searchValue != ''){
   $searchQuery = " AND (id LIKE '%".$searchValue."%' OR title LIKE '%".$searchValue."%' OR domain LIKE '%".$searchValue."%')";
}

我对此有点筋疲力尽,并且不知道为什么不能在服务器端脚本上工作,而是在 sql 客户端上工作。

任何帮助将不胜感激。

php mysql 搜索 datatables 服务器端

评论

0赞 Simon Goater 1/4/2023
尝试回显您的选择查询,以确保它以您期望的方式形成。此外,您还需要一些 SQL 注入保护。
0赞 user2965052 1/4/2023
嗨,西蒙,是的,我已经测试过了,正如我提到的,我也以某种方式解决了 sql inyection $searchValue = mysqli_real_escape_string($mysqli,$_POST['search']['value']);
1赞 Simon Goater 1/4/2023
我的错 - 没有正确阅读。只是一个想法,也许客户端连接和服务器连接的默认字符集有所不同。我看不出还有什么会有所作为的。请参阅 w3schools.com/php/func_mysqli_real_escape_string.asp/php/...上的“考虑连接的当前字符集”。
0赞 user2965052 1/4/2023
不用担心,我认为它可能与响应组成有关:我得到了while ($row = $result->fetch()) {来构建数据表使用的数据,如果我删除它的工作,但在找不到搜索时只显示一行。
0赞 user2965052 1/4/2023
我发现了问题!我得到了一个重复的$row = $result->fetch_assoc() ($row = $result->fetch()) { 这正在砸碎行! 谢谢。

答:

0赞 user2965052 1/4/2023 #1

我发现了问题!在砸碎行之前,我得到了重复!谢谢。$row = $result->fetch_assoc()while ($row = $result->fetch())