【问题标题】:PHP search featurePHP 搜索功能
【发布时间】:2015-05-03 08:23:50
【问题描述】:

我正在处理一个 PHP/SQL 项目,其中一个 html 页面包含客户登记册。为了找到特定客户,我实现了基于两个输入表单(名字、姓氏)的搜索功能。

当用户最初加载页面时,每个客户都可以在一个表中找到。当用户随后搜索客户时,将仅显示匹配的客户。当页面通过菜单刷新或再次加载时,我希望它再次显示每个客户。这就是我的问题所在。我试图找到一个解决方案,但仍然没有找到任何解决方案。我知道我必须使用unset($_SESSION['fname']) 等,但我不知道在哪里。如果进行了搜索并且用户刷新了页面,搜索结果仍然存在,我该如何解决这个问题?我已经在几个地方尝试了取消设置,但它总是阻止我进行搜索,而是显示每个客户。

我已经发布了下面的代码:

<?php

//Display all
if(!isset($_SESSION['fname']) && !isset($_SESSION['lname']))
{
$stmt = $dbh->prepare("SELECT * FROM customer ORDER BY lname");

$stmt->execute();
$res = $stmt->fetchAll();
}

//Perform a search
if(isset($_POST['search']))
{
  if(!isset($_SESSION['fname']) && !isset($_SESSION['lname']))
  {
    $_SESSION['fname'] = $_POST['fname'];
    $_SESSION['lname'] = $_POST['lname'];

    header('location:customers.php');
  }
}

//Display search result
if(isset($_SESSION['fname']) && isset($_SESSION['lname']))
{
  $fname = $_SESSION['fname'];
  $lname = $_SESSION['lname'];

  //Enable binded param to be used in LIKE clause
  $fnameString = '%'.$fname.'%';
  $lnameString = '%'.$lname.'%';

  $stmt = $dbh->prepare("SELECT * FROM customer WHERE fname LIKE :fname AND lname LIKE :lname");
  $stmt->bindParam(':fname', $fnameString, PDO:: PARAM_STR);
  $stmt->bindParam(':lname', $lnameString, PDO:: PARAM_STR);

  $stmt->execute();
  $res = $stmt->fetchAll();
}

//Print
foreach ($res as $row)
{
?>
  <tr>
    <td><a href="customer.php?id=<?php echo $row->id; ?>"><?php echo $row->fname." ".$row->lname; ?></a></td>
    <td><p><?php echo $row->street; ?><p></td>
    <td><p><?php echo $row->zip; ?></p></td>
    <td><p><?php echo $row->city; ?></p></td>
    <td><p><?php echo $row->email; ?></p></td>
    <td><p><?php echo $row->phone; ?></p></td>
  </tr>
<?php
}

?> 

【问题讨论】:

    标签: php jquery sql search-engine


    【解决方案1】:

    我认为没有理由使用 $_SESSION,我只会将搜索表单作为 GET 处理并检查代码中的参数。

    <?php
    
    //Display all
    if(!$_GET['fname'] && !$_GET['lname'])
    {
        $stmt = $dbh->prepare("SELECT * FROM customer ORDER BY lname");
    
        $stmt->execute();
        $res = $stmt->fetchAll();
    }else{
    
    
      //Enable binded param to be used in LIKE clause
      $fnameString = '%'.$_GET['fname'].'%';
      $lnameString = '%'.$_GET['lname'].'%';
    
      $stmt = $dbh->prepare("SELECT * FROM customer WHERE fname LIKE :fname AND lname LIKE :lname");
      $stmt->bindParam(':fname', $fnameString, PDO:: PARAM_STR);
      $stmt->bindParam(':lname', $lnameString, PDO:: PARAM_STR);
    
      $stmt->execute();
      $res = $stmt->fetchAll();
    }
    
    //Print
    foreach ($res as $row)
    {
    ?>
      <tr>
        <td><a href="customer.php?id=<?php echo $row->id; ?>"><?php echo $row->fname." ".$row->lname; ?></a></td>
        <td><p><?php echo $row->street; ?><p></td>
        <td><p><?php echo $row->zip; ?></p></td>
        <td><p><?php echo $row->city; ?></p></td>
        <td><p><?php echo $row->email; ?></p></td>
        <td><p><?php echo $row->phone; ?></p></td>
      </tr>
    <?php
    }
    
    ?> 
    

    如果您不希望向用户显示搜索字符串,请使用 POST。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 2019-08-04
      • 2015-04-11
      • 2023-03-30
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      相关资源
      最近更新 更多