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

时间:2016-05-02 19:26:27

标签: php mysql explode

我是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);

1 个答案:

答案 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字段进行完整索引。