搜索整个表? PHP MySQL

时间:2009-12-14 20:50:27

标签: php sql mysql search

我创建了以下搜索脚本,但在查询数据库时只能搜索一个表列:

$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();
?>

7 个答案:

答案 0 :(得分:7)

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

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

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

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

同样,在输出您的变量时,例如$row['site_name'] ,请始终确保您为HTML转义,例如使用htmlspecialchars($row['site_name'])

  

最后一件令我烦恼的事情是,当我在另一个页面上按下提交按钮时,我总是会显示消息“请输入搜索字词”。即使我进入某事物?

确保两个表单都使用相同的方法(在您的示例中发布)。 <form>代码应具有属性method="post"

另外,你提到的代码行有什么问题?有错误吗?它应该尽我所能。

答案 1 :(得分:4)

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开头的字符串

答案 2 :(得分:1)

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

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

但是如果你不知道我会强烈建议你去浏览一些sql教程......

此外,我没有发现此行有什么问题

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

您收到了什么错误消息?

答案 3 :(得分:0)

只需将'AND column =“condition”'添加到查询的WHERE子句中。

小心添加大量LIKE%条件,因为这些条件可能非常慢,特别是如果使用前面的外卡。这会导致RDBMS搜索每一行。如果在列上使用索引并且只使用尾随通配符,则可以进行优化。

答案 4 :(得分:0)

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

这是更正后的行。你的内容引用了太多。

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

答案 5 :(得分:0)

关于显示消息,您的代码中有拼写错误:

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

应该是:

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

在您编写的代码中,!$serachterm始终评估为true,因为您从未声明变量$seracherm(请注意拼写错误)。

答案 6 :(得分:-1)

你的代码是非常错误的sql注入先做 这样做

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

下一步

$query = mysql_real_escape_string($query);

最后您的搜索结果如下

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