我是php和编码的新手。
到目前为止,我的用户在进行搜索时必须匹配完美的格式,因为整个字符串必须完全包含在mysql表中。
我试图用空格将搜索字符串拆分成数组,然后将每个数组与搜索列" itemname"匹配。使用我的代码,我只能搜索一个单词。 $ split [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-injections 的影响。他补充说"?"而不是变量名称到查询中,并改变了查询下面的bindvalue事项。
我试图自己制作分界工作,但我想我不太了解自己的代码。我需要在查询和下面的行中更改什么以及为什么?我想了解。
我必须自己添加每个数组编号吗?如果用户使用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"搜索。
它是怎么回事:用户想要找到"这是一棵苹果树" - 他必须输入"是一个苹果"或"这是一个"因为他的字符串需要将结果与整个字符串相匹配。
应该如何:用户在输入" tree apple"时应该找到相同的句子。或者"这是树"。我希望通过拆分搜索字符串来实现这一点,然后检查每个单词是否与结果匹配。只有搜索字符串中的每个单词出现时才能找到结果。
EDIT2
现在代码:
// 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);
答案 0 :(得分:2)
如果你想使用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等一样清理它,以实际上使它工作得最好。我建议阅读一些关于全文搜索的教程,你也可以实现更好的排序和其他很酷的东西。
快速提示:您需要对数据库表中的itemname
字段进行完整索引。