我创建了以下搜索脚本,但在查询数据库时只能搜索一个表列:
$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();
?>
答案 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%';