【问题标题】:PHP Keyword search not working with multiple wordsPHP关键字搜索不适用于多个单词
【发布时间】:2015-01-22 08:29:06
【问题描述】:

我是 PHP 新手,创建了一个基本的 HTML 表单;

<form id="game" method="get" action="results.php">
    <label> Book Name
        <input type="text" name="gameTitle" />
    </label>
        <input type="submit" name="search" value="Search">
</form>

这是我的 PHP;

$gameTitle = $_GET['gameTitle'];
$gameTitle = preg_replace("#[^0-9a-z]#i", "", $gameTitle);

$sql = "SELECT games.gameTitle FROM games WHERE gameTitle LIKE '%$gameTitle%'";

$Games = mysqli_query($conn, $sql) 
or die(mysqli_error($conn));

while ($row = mysqli_fetch_assoc($Games)) {
    $gameTitle = $row['gameTitle'];

echo "<div>$gameTitle</div>\n";
}

mysqli_free_result($Games); 
mysqli_close($conn);

?>

例如,如果我要搜索一款名为“孤岛惊魂”的游戏,而我只是搜索了“遥远”,它将返回记录。但是,如果我要搜索“Far C”等(两个词),它不会返回记录。即使我搜索全名“孤岛惊魂”也会发生这种情况,但似乎不起作用。

感谢您的帮助。

【问题讨论】:

  • 好好看看你的 preg_replace 函数...
  • @Naruto - 谢谢,没有意识到该功能导致它以不同的方式存储。现在让它工作吧。
  • 没问题,检查 Giwwel 的答案并将其标记为已接受 :)

标签: php html forms search keyword


【解决方案1】:

您使用的 preg_replace 函数会替换 $gameTitle 中所有不是 0-9 或 a-z 的字符。因此,如果您搜索“Far Cry”,则 preg_replace 将变为“FarCry”,SQL 语句将是 WHERE gameTitle LIKE '%FarCry%'.. 如果此单词没有标题,则不会返回任何内容

【讨论】:

  • 那更好,我 +1 :)
  • 感谢您抽出宝贵时间回复。我没有意识到在这种情况下它会改变搜索并删除空格。现在让它工作吧。
【解决方案2】:

查看变量 $gameTitle。您认为您正在寻找“Far Cry”,但代码 preg_replace 部分会将变量设置为“FarCry”,我猜您在数据库中存储了一个名为“Far Cry”而不是“FarCry”的游戏。

【讨论】:

  • 谢谢,你没看错。没有意识到它会以不同的方式存储。现在都在工作!再次感谢。
  • 请注意,您不应该只信任这些输入值。你应该清理它们,至少应该使用 PDO 和参数绑定。
【解决方案3】:
  1. 要在查询字符串中允许空格,试试这个:

    $gameTitle = preg_replace("#[^\s0-9a-z]#i", "", $gameTitle);

  2. 不要忘记mysql_real_escape_string函数以避免SQL注入甚至更好 使用 PDO,请参阅http://php.net/manual/en/pdo.prepared-statements.php

  3. 处的示例

所以简单的查询将如下所示:

"SELECT games.gameTitle FROM games WHERE gameTitle LIKE '%".mysql_real_escape_string($gameTitle)."%'";

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多