如何使用PHP、mysqli和HTML表单创建搜索功能

3
我希望创建一个表单,允许用户输入搜索内容,从数据库中获取正确的值并显示它们。但是,由于某种原因,我的查询无法正常工作,只显示“无法搜索”。
以下是我的php代码:

 <?php

  include "connect.php";

  $output = '';

  if(isset($_POST['search'])) {
    $search = $_POST['search'];
    $search = preg_replace("#[^0-9a-z]i#","", $search);

    $query = mysqli_query("SELECT * FROM house WHERE town LIKE '%$search%'") or die ("Could not search");
    $count = mysqli_num_rows($query);
    
    if($count == 0){
      $output = "There was no search results!";

    }else{

      while ($row = mysqli_fetch_array($query)) {

        $town = $row ['town'];
        $street = $row ['street'];
        $bedrooms = $row ['bedrooms'];
        $bathroom = $row ['bathrooms'];

        $output .='<div> '.$town.''.$street.''.$bedrooms.''.$bathrooms.'</div>';

      }

    }
  }

  ?>

这是我的表单。

 <form action ="home.php" method = "post">
  
          <input name="search" type="text" size="30" placeholder="Belfast"/>

          <input type="submit" value="Search"/>

          </form> 

          <?php print ("$output");?>


'%".$search."%'替换'%$search%'... - Nishant Solanki
仍然显示“无法搜索!”未能正常工作。 - Rebekah
“回显”您的查询SELECT * FROM house WHERE town LIKE '%$search%',并尝试从phpmyadmin或mysql运行该查询... - Nishant Solanki
这可能会有所帮助。http://askseeker.com/code-snippets/search-form-php-using-mysqli/ - smzapp
3个回答

2

您的查询中未连接到数据库:

$query = mysqli_query("SELECT
                      ^ missing connection variable

没有连接变量(不知道您正在使用什么进行连接)


$query = mysqli_query($connection, "SELECT ...
                      ^^^^^^^^^^^^

从手册中http://php.net/manual/en/mysqli.query.php
面向对象风格 mixed mysqli::query ( string $query [, int $resultmode = MYSQLI_STORE_RESULT ] ) 过程化风格 mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] ) 假设您正在使用mysqli_连接。如果您使用mysql_或PDO进行连接,则无法使用mysqli_。这些不同的MySQL API不能相互混合。
此外,不要使用or die("Could not search"),而是使用or die(mysqli_error($connection))来捕获任何错误(如果有)。
在文件顶部添加错误报告将有助于查找错误。
<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

注意: 错误报告仅应在测试环境中执行,绝不能在生产环境中执行。


mysqli 连接示例:

$connection = mysqli_connect("myhost","myuser","mypassw","mybd") 
                or die("Error " . mysqli_error($connection)); 

更多信息,请访问:


(注意:此处为原文,无需翻译)

请问您能否为我解释一下?“错误报告只应该在暂存环境中进行,而永远不应该在生产环境中进行。” - Keep Coding
1
@测试 如果出现任何错误,会显示系统路径、数据库表/列名称和人员不想显示的连接凭据,这些都不应该显示给用户。 - Funk Forty Niner
我已经在一个连接文件中建立了与数据库的连接。 - Rebekah
@Rebekah 你还需要将连接变量传递给你的查询。我不知道你用哪个变量来连接,所以我使用了 $connection 作为示例。你需要用你使用的那个变量来替换它。 - Funk Forty Niner
只需将查询更改为 $query = mysqli_query($con, "SELECT * FROM house WHERE town LIKE '%$search%'") or die ("Could not search"); - 这里我使用了 $con,因为这是您在其他问题中使用的变量。您需要将连接传递给查询,只需重新加载我的答案即可。@Rebekah - Funk Forty Niner
@Rebekah 不用谢。请将其标记为已解决。 - Funk Forty Niner

0
$query = mysqli_query("SELECT * FROM house WHERE town LIKE '%$search%'") or die ("Could not search");

$result = mysqli_query($connection,$query);

$count = mysqli_num_rows($result);

$connection 是在您的 connect.php 中声明连接到数据库的变量。

$count 之前,您应该先输出 $result


-1
尝试去掉if($count==0)之间的空格,它就能正常工作了!
if($count==0){
      $output = "There was no search results!";}

1
尽管这个问题可能在四年后得到解决或者不再相关,但在这种情况下空格仍然会产生影响。 - Paflow

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