我有一个PHP网站来展示产品。我需要介绍一下搜索'可以在多个产品中找到关键字或短语的功能。
我浏览了一些现有脚本并为我编写/修改了一个脚本虽然可以连接到数据库但是没有返回任何值。调试模式会发出警告" mysqli_num_rows()
期望参数1为mysqli_result,boolean给出"。似乎我没有正确收集查询值。 PHP手册说mysqli_query()
在失败时返回FALSE,成功的SELECT,SHOW,DESCRIBE或EXPLAIN查询mysqli_query()
将返回mysqli_result
个对象,而其他成功查询mysqli_query()
将返回TRUE"。
有什么建议吗?
<form name="search" method="post" action="search.php">
<input type="text" name="searchterm" />
<input type="hidden" name="searching" value="yes" />
<input type="submit" name="submit" value="Search" />
</form>
<?php
$searchterm=trim($_POST['searchterm']);
$searching = $_POST['searching'];
$search = $_POST['search'];
//This is only displayed if they have submitted the form
if ($searching =="yes")
{
echo 'Results';
//If they forget to enter a search term display an error
if (!$searchterm)
{
echo 'You forgot to enter a search term';
exit;
}
//Filter the user input
if (!get_magic_quotes_gpc())
$searchterm = addslashes($searchterm);
// Now connect to Database
@ $db = mysqli_connect('localhost','username','password','database' );
if (mysqli_connect_errno()) {
echo 'Error: Could not connect to the database. Please try again later.';
exit;
}
else {
echo "Database connection successful."; //Check to see whether we have connected to database at all!
}
//Query the database
$query = "SELECT * FROM wp_posts WHERE post_title LIKE '%$searchterm%' OR post_excerpt LIKE '%$searchterm%' OR post_content LIKE '%$searchterm%'";
$result = mysqli_query($db, $query);
if (!$result)
echo "No result found";
$num_results = mysqli_num_rows($result);
echo "<p>Number of match found: ".$num_results."</p>";
foreach ($result as $searchResult) {
print_r($searchResult);
}
echo "You searched for $searchterm";
$result->free();
$db->close();
}
答案 0 :(得分:0)
我认为在您的查询中应该是'%$searchterm%'
,而不是'%{searchterm}%'
。您没有在示例中搜索变量$searchterm
。
Google的显示在查询中使用LIMIT
,因此它一次只显示一定数量的结果(称为pagination)。
这是经过测试和运作的。您需要在搜索引擎类中更改1)数据库连接信息。 2)如果您希望它位于不同的页面上,则必须将其拆分。如果没有,请将整个代码复制到一个页面,它将在该页面上运行。
<?php
class DBEngine
{
protected $con;
// Create a default database element
public function __construct($host = '',$db = '',$user = '',$pass = '')
{
try {
$this->con = new PDO("mysql:host=$host;dbname=$db",$user,$pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
}
catch (Exception $e) {
return 0;
}
}
// Simple fetch and return method
public function Fetch($_sql)
{
$query = $this->con->prepare($_sql);
$query->execute();
if($query->rowCount() > 0) {
$rows = $query->fetchAll();
}
return (isset($rows) && $rows !== 0 && !empty($rows))? $rows: 0;
}
// Simple write to db method
public function Write($_sql)
{
$query = $this->con->prepare($_sql);
$query->execute();
}
}
class SearchEngine
{
protected $searchterm;
public function execute($searchword)
{
$this->searchterm = htmlentities(trim($searchword), ENT_QUOTES);
}
public function display()
{ ?>
<h1>Results</h1>
<?php
//If they forget to enter a search term display an error
if(empty($this->searchterm)) { ?>
<h3>Search Empty</h3>
<p>You must fill out search field.</p>
<?php }
else {
$con = new DBEngine('localhost','database','username','password');
$results = $con->Fetch( "SELECT * FROM wp_posts WHERE post_title LIKE '%".$this->searchterm."%' OR post_excerpt LIKE '%".$this->searchterm."%' OR post_content LIKE '%".$this->searchterm."%'");
if($results !== 0 && !empty($results)) { ?>
<p>Number of match found: <?php echo count($results); ?> on search:<br />
<?php echo strip_tags(html_entity_decode($this->searchterm)); ?></p>
<?php
foreach($results as $rows) {
echo '<pre>';
print_r($rows);
echo '</pre>';
}
}
else { ?>
<h3>No results found.</h3>
<?php
}
}
}
}
if(isset($_POST['submit'])) {
$searcher = new SearchEngine();
$searcher->execute($_POST['searchterm']);
$searcher->display();
} ?>
<form name="search" method="post" action="">
<input type="text" name="searchterm" />
<input type="hidden" name="searching" value="yes" />
<input type="submit" name="submit" value="Search" />
</form>
答案 1 :(得分:0)
要进行文字搜索,您需要将代码'%{searchterm}%'
更改为'%$searchterm%'
,因为the brackets aren't needed并且您正在搜索短语“{ searchterm}。“除此之外,您可能需要查看FULLTEXT search capabilities,因为您正在使用当前方法进行文字搜索。
要使输出看起来像Google的输出,您只需为每个搜索结果编写一个包装器,并使用CSS和HTML设置它们的样式。