搜索整个表格?PHP MySQL

4
我已经制作了以下的搜索脚本,但是在查询数据库时只能搜索一个数据表列:
$query = "select * from explore where site_name like '%".$searchterm."%'";

我想知道如何搜索整个表格(explore)。另外,我需要修复这行代码:
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个回答

7
与其他答案不同,我认为你想在查询中使用“OR”,而不是“AND”:
与其他答案不同,我认为您希望在查询中使用“或”(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'])

最后一个让我困扰的问题是,当我在不同的页面上按提交按钮时,它总是显示消息“请输入搜索词。”,即使我输入了一些内容也是如此?

确保两个表单使用相同的方法(例如您的示例中的post)。<form>标记应具有属性method="post"

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


随着行数的增加,此查询将对性能产生严重影响。 - Corey Ballou

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."%'";

如果不使用全文搜索,这个查询可能是你能得到的最快的。 然而,缺点是它只能匹配以搜索词开始的字符串


+1 因为答案没问题,但我会选择 DisgruntledGoat 的选项:(使用 OR 而不是 AND)$query = "select * from explore where site_name like '%".$searchterm."%' or other_column like '%".$searchterm."%'" 有可能 MySql 会执行多个完整的表扫描... - Adrian
@Adrian - 我的回答重点在于它将利用索引而不是其他所有答案。这将防止全表扫描,并通过不使用OR查询提供更快的结果。 - Corey Ballou

1
要搜索表的其他列,您需要向您的 SQL 添加条件。
$query = "select * from explore where site_name like '%".$searchterm."%' or other_column like '%".$searchterm."%'";

但是如果你不知道,我强烈建议先学习一些 SQL 教程...

另外,我没有看到这行代码有什么问题。

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

你收到了什么错误信息?

我认为应该使用“或”而不是“且”。 - Adrian

0

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

注意不要添加太多 LIKE % 条件,因为这可能会非常慢,特别是如果使用前置通配符。这会导致 RDBMS 搜索每一行。如果您在列上使用索引并且仅使用尾部通配符,则可以进行优化。


0

你正在搜索整张表,仅将结果限制在site_name like '%".$searchterm."%'的记录中。如果你想搜索表中的所有内容,需要删除 WHERE 子句。

以下是已更正的行。你在其中添加了太多引号。

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

这完全是错的... 除非我搞错了,他不想获取每一行,他想搜索整个表(即不同的列)。而你的“代码更正”并没有真正改进——首先,现在$num_found后面没有句号了。它应该是这样显示的:1. 网站名称<br />,据我所知。 - DisgruntledGoat
但我看不出echo $num_found.".".($row ['site_name'])." <br />";echo "$num_found." .($row ['site_name'])." <br />";有什么改进。如果我没有完全错,两者都是正确的。 - Felix Kling
@Felix,echo "$num_found."不会显示变量的值,而是会显示文本'$num_found.'。如果写成echo "{$num_found}.",在花括号中或者我上面写的串联方式,输出会显示变量的值。 - munch
@Felix,你刚刚教会了我一些东西。我不得不回到PHP手册去检查,但似乎在我的PHP之旅中我从某个地方获得了一些错误的信息。可能是从这里的某个人那里:P他的echo应该可以工作。没有任何分隔符做这件事是否被认为是不好的实践?因为我知道有时它不起作用,例如对于变量$var$varstring不起作用,而{$var}string则可以。 - munch
我认为PHP会寻找最长的有效变量序列,因此$varstring是有效的,但对于字符串$var,string,只有$var是有效的变量($var,不是)。解析变量字符串被认为是较慢的,但我认为它并没有显著地变慢。我认为这更多是可读性的问题,有时将所有内容放在" "之间会更容易 ;) - Felix Kling
显示剩余2条评论

0
关于显示消息,您的代码中有一个拼写错误:
// Check if search term was entered.
if (!$serachterm)

应该是:

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

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

如果他已经复制并粘贴了他的代码,那么这就是他问题的答案:“还有一件事情困扰着我,当我在另一页上点击提交按钮时,它总是显示消息“请输入搜索词”,即使我已经输入了东西?” - Felix Kling
只要它没有说“哎呀,这是一个复制粘贴错误,我的原始代码包含if(!$searchterm)”,那么这就是一个有效的答案。 - Felix Kling

-1

你的代码存在很多 SQL 注入漏洞,请先进行以下修正:

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

下一个

$query = mysql_real_escape_string($query);

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

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

你应该意识到你可以在别人的问题下面进行评论,这并不是一个合适的回答。 - TravisO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接