用“”拆分字符串并在查询中使用它 - 有什么问题吗?

Split string by " " and use it in a query - What is wrong?

我是 php 的新手,一般来说是编码方面的新手。

直到现在,我的用户在进行搜索时必须匹配完美的格式,因为整个字符串必须完全包含在 mysql table 中。

我正在尝试将搜索字符串按空格拆分为一个数组,然后将每个数组与搜索列匹配 "itemname"。使用我的代码,我只能搜索一个词。 $拆分[0];正在搜索,如果添加另一个词,将找不到匹配项。

// Search from MySQL database table
$search=$_POST['search'];
$stat=$_POST['stat'];

$split = explode(" ", $search);

$query = $pdo->prepare("SELECT itemname, itemprice, itemupdate, itemstat, itemmarket, itemdiff FROM premium WHERE itemname LIKE ? AND itemname LIKE ? AND itemname LIKE ? AND itemname LIKE ? AND itemname LIKE ? AND itemname LIKE ? AND itemstat=? ORDER BY itemprice DESC LIMIT 15");
$query->bindValue(1, "%$split[0]%", PDO::PARAM_STR);
$query->bindValue(2, "%$split[1]", PDO::PARAM_STR);
$query->bindValue(3, "%$split[2]", PDO::PARAM_STR);
$query->bindValue(4, "%$split[3]", PDO::PARAM_STR);
$query->bindValue(5, "%$split[4]", PDO::PARAM_STR);
$query->bindValue(6, "%$split[5]", PDO::PARAM_STR);
$query->bindValue(7, $stat);
$query->execute();

我的一个朋友几天前更改了我的代码以保护我免受 sql-注入。他加了 ”?”而不是查询中的变量名,并更改了查询下方的绑定值内容。

我试图自己完成定界工作,但我认为我对自己的代码的理解不够好。我必须在查询和下面的行中更改什么,为什么?我正在努力理解。

我必须自己添加每个数组编号吗?如果用户使用 10 个字长的字符串进行搜索,但查询中只有 5 个数组怎么办?


简短 - 我想要实现的目标:

SELECT * FROM premium WHERE itemname LIKE $split[0] and itemname LIKE $split[1] and itemname Like $split[2] ... and so on ...

---

编辑:

这是我的代码,在我尝试修改之前:

$search=$_POST['search'];
$stat=$_POST['stat'];
$query = $pdo->prepare("SELECT itemname, itemprice, itemupdate, itemstat FROM pricedata WHERE itemname Like ? AND itemstat=? ORDER BY itemprice DESC LIMIT 15");
$query->bindValue(1, "%$search%", PDO::PARAM_STR);
$query->bindValue(2, $stat);
$query->execute();

我实际上想实现某种 "AND" 搜索。

这是怎么回事:用户想要查找 "This is an apple tree" - 他必须键入 "is an apple" 或 "This is an",因为他的字符串需要与整个字符串的结果相匹配。

应该如何:用户在键入 "tree apple" 或 "this is tree" 时应该会找到相同的句子。我想通过拆分搜索字符串然后检查每个单词是否与结果匹配来实现这一点。只有在搜索字符串中的每个词都存在的地方才能找到结果。


编辑2

现在的代码:

// Search from MySQL database table
$search=$_POST['search'];
$stat=$_POST['stat'];
$split = explode(" ", $search);
$query = $pdo->prepare("SELECT itemname, itemprice, itemupdate, itemstat, itemmarket, itemdiff FROM premium WHERE MATCH (itemname) AGAINST (?) ORDER BY itemprice DESC LIMIT 15");
$query->execute(array(implode(' ', $split)));


$sql = "UPDATE `cars` SET `model` = :model WHERE id = :id";
$statement = $pdo->prepare($sql);

如果您想使用 mySQL 的 full text search 功能,您可以这样做:

...
$query = $pdo->prepare("
    SELECT itemname, itemprice, itemupdate, itemstat, itemmarket, itemdiff
    FROM premium
    WHERE MATCH (itemname) AGAINST(?)
    ORDER BY itemprice DESC
    LIMIT 15
");
$query->execute([implode(' ', $split)]);

或者您可以使用 +(必备)或 -(必备)和 *(部分单词匹配)进行布尔搜索。请参阅部分必备项的示例:

$query = $pdo->prepare("
    SELECT itemname, itemprice, itemupdate, itemstat, itemmarket, itemdiff
    FROM premium
    WHERE MATCH (itemname) AGAINST(? IN BOOLEAN MODE)
    ORDER BY itemprice DESC
    LIMIT 15
");
$query->execute(['+'.implode('* +', $split).'*']);

对于布尔模式,您必须清理 a、the 等,才能使其发挥最佳效果。我建议阅读一些关于全文搜索的教程,你也可以实现更好的排序和其他很酷的东西。

快速提示:您需要在数据库 table.

中对 itemname 字段进行全索引