当前位置: 首页 > 知识库问答 >
问题:

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

怀晋
2023-03-14

我是新的PHP和一般编码。

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

我试图将搜索字符串按空格拆分为一个数组,然后将每个数组与搜索列“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注入。他加了“?”代替变量名进入查询,并更改了查询下面的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();

我实际上想实现某种“和”搜索。

如何:用户想要找到“这是一棵苹果树”——他必须键入“是一个苹果”或“这是一棵”,因为他的字符串需要将结果作为一个整体字符串匹配。

应该是这样的:用户在键入“树苹果”或“这是树”时应该会发现相同的句子。我希望通过拆分搜索字符串来实现这一点,然后检查每个单词在结果中是否匹配。只有在搜索字符串中的每个单词都存在的地方才能找到结果。

编辑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);

共有1个答案

秦新立
2023-03-14

如果你想使用mySQL的全文搜索功能,你可以这样做:

...
$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、等一样清理,以使其真正发挥最佳效果。我建议你阅读一些关于全文搜索的教程,你也可以实现更好的排序和其他很酷的东西。

快速提示:您需要对数据库表中的itemname字段进行全索引。

 类似资料:
  • 这是作为输入的字符串,但我只需要每一列,从第二列开始,即: 1(第二行) 2和1(第三行) 1(第五排) 这个在可能有多少行或多少列(列被一个空格分割)方面没有固定的大小。 我认为通过使用以下工具,这相当容易: 我需要第一列之后的每一列。我仍在学习regex,但似乎找不到一个好的解决方案。我知道关于拆分的“\\r?\\n”和“”,但不知道如何将两者连接起来以获取每一列。非常感谢您的帮助:) 另一个

  • 问题内容: 假设有一个字符串… 我想要的就是将字符串拆分为“ my”,“ big”,“ string”等。因此,我尝试 返回java.util.regex.PatternSyntaxException:在索引0附近悬挂元字符’*’ 是正则表达式中的特殊字符,所以我尝试转义…。 同样的例外。我认为有人会知道快速解决方案。谢谢。 问题答案: 和我一起工作。

  • 问题内容: 我从网上得到一个字符串,看起来像这样: 然后,我需要将,和存储在不同的变量中,但是它将不起作用。 现在它只存储整个字符串 怎么了? 问题答案: 该参数是一个普通表达式,在那里有特殊含义;“开始的锚” 您需要做: 通过转义,您是在说“我的意思是字符’^’”

  • 问题内容: 我在Oracle数据库中有一个字符串,我的字符串是:’bbb; aaa; qqq; ccc’ 我用正则表达式来分割我的字符串: 我想按顺序拆分它,我总是希望下面的输出: 因为subString的顺序对我来说非常重要。但是此查询的结果不正确: 问题答案: 您不需要a即可获得结果;此外,要获得给定顺序的结果,您所需要做的只是一个子句:

  • 我想在拆分函数调用中使用空格作为分隔符,但我想在单个单元格数组中输入某些单词;例如。 例如: 在带有一些分隔符的函数拆分调用之后,输出应如下所示: 我需要找到一个分隔符(或正则表达式模式)用于split函数。我如何着手做那件事?

  • 问题内容: 有没有办法在不知道字符串长度的情况下,将一个字符长的字符串切成4个字符串,每个字符长? 例如: 问题答案: