【问题标题】:Search entire table? PHP MySQL搜索整个表格? PHP MySQL
【发布时间】:2010-12-26 13:56:34
【问题描述】:

我做了如下搜索脚本,但是查询数据库时只能搜索一个表列:

$query = "select * from explore where site_name like '%".$searchterm."%'";

我想知道如何搜索整个表格(探索)。另外,我需要修复这行代码:

echo "$num_found. ".($row['site_name'])." <br />";

让我烦恼的最后一件事是,当我在不同的页面上按下提交按钮时,我总是显示消息“请输入搜索词”。即使我输入了什么?

感谢您的帮助,如果需要,这是整个脚本:

<?php
// Set variables from form.
$searchterm  = $_POST['searchterm'];
trim ($searchterm);

// Check if search term was entered.
if (!$serachterm)
{
    echo "Please enter a search term.";
}
// Add slashes to search term.
if (!get_magic_quotes_gpc())
{
    $searchterm = addcslashes($searchterm);
}

// Connects to database.
@ $dbconn = new mysqli('localhost', 'root', 'root', 'ajax_demo');
if (mysqli_connect_errno())
{
    echo "Could not connect to database. Please try again later.";
    exit;
}
// Query the database.
$query = "select * from explore where site_name like '%".$searchterm."%'";
$result = $dbconn->query($query);

// Number of rows found.
$num_results = $result->num_rows;
echo "Found: ".$num_results."</p>";

// Loops through results.
for ($i=0; $i <$num_results; $i++)
{
    $num_found = $i + 1;
    $row = $result->fetch_assoc();
    echo "$num_found. ".($row['site_name'])." <br />";
}

// Escape database.
$result->free();
$dbconn->close();
?>

【问题讨论】:

    标签: php sql mysql search


    【解决方案1】:

    与其他答案相反,我认为您想在查询中使用“OR”,而不是“AND”:

    $query = "select * from explore where site_name like '%".$searchterm."%' or other_column like '%".$searchterm."%'";
    

    other_column 替换为第二列的名称。您可以继续重复我为您的每一列添加的部分。

    注意:这是假设您的变量$searchterm 已经为数据库转义,例如$mysqli-&gt;real_escape_string($searchterm);。始终确保是这种情况,或者最好使用参数化查询。

    类似地,在输出 $row['site_name'] 之类的变量时,始终确保为 HTML 转义它们,例如使用 htmlspecialchars($row['site_name'])

    让我烦恼的最后一件事是,当我在不同的页面上按下提交按钮时,我总是显示消息“请输入搜索词”。即使我输入了什么?

    确保两种形式都使用相同的方法(在您的示例中发布)。 &lt;form&gt; 标签应具有method="post" 属性。

    另外,你提到的那行代码有什么问题?有错误吗?据我所知,它应该可以工作。

    【讨论】:

    • 随着行数的增加,此查询将严重影响性能。
    【解决方案2】:

    UNION 查询将以比简单地使用 OR 更优化的方式提供结果。请注意,以这种方式使用 LIKE 将不允许您使用您的桌子上可能拥有的任何索引。您可以使用以下方法提供更优化的查询,但会丢失一些可能的结果:

    $query = "SELECT * FROM explore WHERE site_name LIKE '".$searchterm."%'
              UNION
              SELECT * FROM explore WHERE other_field LIKE '".$searchterm."%'
              UNION
              SELECT * FROM explore WHERE third_field LIKE '".$searchterm."%'";
    

    此查询可能与您在不使用 FULLTEXT 搜索的情况下获得的一样快。然而,缺点是 您只能匹配以 searchterm 开头的字符串

    【讨论】:

    • +1 因为答案没问题,但我会选择 DisgruntledGoat 的选项:(使用 OR 而不是 AND)$query = "select * from explore where site_name like '%".$searchterm."%' 或 other_column like '%".$searchterm."%'" 有机会MySql 会做不止一次全表扫描...
    • @Adrian - 我的答案的重点是它会使用 INDEX 而不是所有其他答案。这将防止全表扫描,并通过不使用 OR 查询来提供更快的结果。
    【解决方案3】:

    要搜索表的其他列,您需要在 sql 中添加条件

    $query = "select * from explore where site_name like '%".$searchterm."%' or other_column like '%".$searchterm."%'";
    

    但如果你不知道,我强烈建议你阅读一些 sql 教程......

    我也没看出这行有什么问题

    echo "$num_found. ".($row['site_name'])." <br />";
    

    你得到什么错误信息?

    【讨论】:

    • 我认为应该是“OR”而不是“AND”
    【解决方案4】:

    只需在查询的 WHERE 子句中添加 'AND column = "condition"'。

    添加大量 LIKE % 条件时要小心,因为这些条件可能会非常慢,尤其是在使用前通配符的情况下。这会导致 RDBMS 搜索每一行。如果您在列上使用索引并且仅使用尾随通配符,则可以进行优化。

    【讨论】:

      【解决方案5】:

      您正在搜索整个表格,只是将结果限制在site_name like '%".$searchterm."%' 所在的位置。如果要从该表中搜索所有内容,则需要删除 WHERE 子句

      这是更正后的行。你的引号太多了。

      echo $num_found.".".($row['site_name'])." <br />";
      

      【讨论】:

      • 这在所有地方都是错误的......除非我弄错了他不想得到每一行,他想搜索整个表(即不同的列)。而且您的“代码更正”并没有真正得到改善-一方面,现在$num_found 之后没有时间段。以1. Site Name&lt;br /&gt; AFAIK 的身份出现是很有意义的。
      • 很好,我错过了'。'在他的代码中。现在已经修复了。但是,当他说“我想知道如何搜索整个表格(探索)”时,我并没有试图对他的意思做出任何假设。我想我给出了一个聪明的 alec 回应,因为这个问题很模糊,但这并没有错。它回答了他的问题......
      • 但我看不出 echo $num_found.".".($row['site_name'])." &lt;br /&gt;";echo "$num_found." .($row['site_name'])." &lt;br /&gt;"; 有哪些改进。如果我没有完全错,两者都是正确的。
      • @Felix, echo "$num_found." 不会显示变量的值,而是会显示文本“$num_found.”。如果它写成 echo "{$num_found}." ,用大括号括起来或我在上面写的连接方式,输出将显示变量的值虽然
      • 是点的原因吗?因为通常,PHP 会解析 " " 中包含的字符串并替换变量。如果字符串用单引号括起来,那么您是正确的。
      【解决方案6】:

      关于显示消息,您的代码中有错字:

      // Check if search term was entered.
      if (!$serachterm)
      

      应该是:

      // Check if search term was entered.
      if (!$searchterm)
      

      在您编写的代码中,!$serachterm 的计算结果始终为 true,因为您从未声明变量 $seracherm(请注意错字)。

      【讨论】:

      • 如果他复制并粘贴了他的代码,这就是他的问题的答案:“让我烦恼的最后一件事是,当我在不同的页面上按下提交按钮时,我总是显示消息”请输入搜索词。”即使我输入了一些内容?”
      • 只要不是说'Uups,这是一个复制粘贴错误,我的原始代码包含if(!$searchterm)',这是一个有效的答案。
      【解决方案7】:

      您的代码对于 sql 注入非常有问题,首先执行 这样做

      $searchterm = htmlspecialchars($searchterm);
      trim($searchterm);
      

      下一个

      $query = mysql_real_escape_string($query);
      

      最终您的搜索看起来像这样

      $query = "select * from explore where site_name like '%$searchterm%';
      

      【讨论】:

      • 你确实意识到你可以评论人们的问题,这几乎不是一个答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多