在PHP中搜索名称

时间:2017-01-26 11:27:59

标签: php search mysqli pdo

如何搜索名称或类似关键字的内容以及预期会产生多少结果?

例如,当您搜索标记时, 你希望有这样的想法:
Mark Zuckerberg
Mark Hamil
Mark Fischbach
...

但是当我进行查询时,它只为我显示一个。

我试图使用许多不同的SQL子句和其他东西,但仍然给出了一个结果。顺便说一下,我使用 PDO 作为我的数据库处理程序。

这是我的代码:

<?php
require_once '../../assets/conn.db.php';
require_once '../../assets/init.php';
require_once '../../assets/main.func.php';

if($_POST){
  $namesearch = $_POST['name'];

  $sql = "SELECT * FROM `student_info` WHERE username LIKE ? OR username LIKE ?";
  $checkstmt = $conn->prepare($sql);
  $checkstmt->execute(array("%{$namesearch}%","%{$namesearch}%"));
  $result = $checkstmt->fetch(PDO::FETCH_ASSOC);

  if($result){
    echo "
    <table border='1' class='text-align: center'>
      <tr>
        <th>Name</th>
        <th>Phone</th>
        <th>Address</th>
        <th>Username</th>
        <th>Action</th>
      </tr>
      <tr>
        <td>{$result['name']}</td>
        <td>{$result['phone']}</td>
        <td>{$result['address']}</td>
        <td>{$result['username']}</td>
        <td><a href='grades.php?user=".$result['StudentID']."'>+</a> Add Grades</td>
      </tr>
    </table> <br>
    ";
  }
}

 ?>

<form method="post">
  <input type="text" name="name" placeholder="Search for a student">
  <input type="submit" value="Search!">
</form>

2 个答案:

答案 0 :(得分:4)

sql查询是正确的,输出你必须迭代$ result的结果的所有元素。

示例:

while($data = $result->fetch_array())
{
  echo $result["name"];
}

答案 1 :(得分:2)

您的查询会返回您需要的所有结果,但您只需获取单个数据。 K. O. Rolling先生为您提供了如何迭代结果的一般概念,让我们将其应用于您的确切问题:

require_once '../../assets/conn.db.php';
require_once '../../assets/init.php';
require_once '../../assets/main.func.php';

if($_POST){
  $namesearch = $_POST['name'];

  $sql = "SELECT * FROM `student_info` WHERE username LIKE ? OR username LIKE ?";
  $checkstmt = $conn->prepare($sql);
  $checkstmt->execute(array("%{$namesearch}%","%{$namesearch}%"));
  $result = $checkstmt->fetch(PDO::FETCH_ASSOC);

  echo "
    <table border='1' class='text-align: center'>
      <tr>
        <th>Name</th>
        <th>Phone</th>
        <th>Address</th>
        <th>Username</th>
        <th>Action</th>
      </tr>";
  while($data = $checkstmt->fetch(PDO::FETCH_ASSOC)){
    echo "
      <tr>
        <td>{$result['name']}</td>
        <td>{$result['phone']}</td>
        <td>{$result['address']}</td>
        <td>{$result['username']}</td>
        <td><a href='grades.php?user=".$data['StudentID']."'>+</a> Add Grades</td>
      </tr>
    ";
  }
  echo "</table> <br>";
}

代码未经测试。在每次迭代的while中,使用当前元素初始化$data并对其进行逻辑评估。如果没有更多的元素,那么它将是假的,循环将退出。否则,它将获取该项并写入tr

进一步改善:

  $sql = "SELECT * FROM `student_info` WHERE username LIKE ? OR username LIKE ?";
  $checkstmt = $conn->prepare($sql);
  $checkstmt->execute(array("%{$namesearch}%","%{$namesearch}%"));

请注意,你检查两次相同的东西,这不是很理想。改进:

  $sql = "SELECT * FROM `student_info` WHERE username LIKE ?";
  $checkstmt = $conn->prepare($sql);
  $checkstmt->execute(array("%{$namesearch}%"));

此外,明智的做法是在选择中使用列列表而不是*。