【问题标题】:PHP search shows more than one resultPHP 搜索显示多个结果
【发布时间】:2017-06-15 08:32:12
【问题描述】:

我正在尝试搜索我的网站,如果我使用会员证书搜索 no,它将显示他的完整详细信息。但是在我的代码中,当我搜索 Certificate No : 1 时,它会显示 Certificate no 1、10、11、12、13、14、15、....的详细信息。

有没有办法显示单个成员的详细信息。

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

  $query = mysql_query("SELECT * FROM  certificate  WHERE certificate_no LIKE '%$searchq%' ") or die ("could not search "); 
}
$count = mysql_num_rows($query);
if($count==0){   
  $output = 'There is no search result ';
} else {
    while ($row = mysql_fetch_array($query)){  
      $name =$row['name']; 
      $certificate_no =$row['certificate_no']; 
      $y_of_passing =$row['y_of _passing'];
      $grade =$row['grade']; 
      $score =$row['score'];

      $output.='<div>Certificate Number : '  .$certificate_no.' <div>Candidate Name :  '.$name. '<div>Grade/Score : '  .$grade.' <div>Course Name :  '.$score. '<div>Year Of Passing: '.$y_of_passing.'<div>'; 

      echo "<img src ='".$row['photo']."' height='100' width='200' >" ; 

   }

}
print("$output");

【问题讨论】:

  • 什么是certificate_no是primerykey还是unique?
  • mysql_* 函数已弃用。你应该看看 MySQLi 或 PDO。
  • "当我搜索 Certificate No : 1 时,它会显示 Certificate No 1、10、11、12、13、14、15 的详细信息。" ...好吧,是的,这就是你告诉它做的WHERE certificate_no LIKE '%$searchq%' - 如果你想要一个特定的证书,只需使用WHERE certificate_no = $searchq ...除了将它移动到带有绑定参数的mysqli/pdo; mysql_ 扩展已失效,并且像这样将数据插入 SQL 是自找麻烦。
  • like 是一个模式匹配。这就是为什么它返回匹配的模式结果像这样 10, 11,12,13,14,15, .你注意到结果都有那个 1 。这是您用来匹配 '%1' 中的模式的。所以你需要使用像这样的比较运算符 certificate_no=1

标签: php mysql search


【解决方案1】:

更改您的查询:

$query = mysql_query("SELECT * FROM  certificate  WHERE certificate_no LIKE '%$searchq%' ")

$query = mysql_query("SELECT * FROM  certificate  WHERE certificate_no  = ". $searchq ."

然后再试一次。

解释:当你使用 LIKE '%$searchq%' 时,它会在任何地方搜索具有1 的字符串,即PATTERN MATCHING。但是如果你想要平等比较而不是尝试=。它将搜索完全匹配。

【讨论】:

    【解决方案2】:

    您使用了错误的通配符使用 = 或仅喜欢或使用 Rlike

    SELECT * FROM  certificate  WHERE certificate_no LIKE '$searchq'
    SELECT * FROM  certificate  WHERE certificate_no = '$searchq'
    SELECT * FROM  certificate  WHERE certificate_no RLike '[[:<:]]$searchq[[:>:]]'
    

    【讨论】:

      【解决方案3】:

      尝试像这样编辑 $query :::

      $query = mysql_query("SELECT * FROM  certificate  WHERE certificate_no LIKE $searchq ") or die ("could not search "); 
      

      【讨论】:

        【解决方案4】:

        Like 是一个模式匹配。它将在您的列中搜索给定的字符串。这就是为什么它返回像这样的匹配模式结果 10, 11,12,13,14,15 。您是否注意到结果都具有 1 。这是您用来匹配 like '%1%' 中的模式的。所以你需要使用像这样的比较运算符certificate_no=1

        警告 mysql_query、mysql_fetch_array、mysql_connect 等扩展在 PHP 5.5.0 中已被弃用,并在 PHP 7.0.0 中被删除。 相反,应该使用 MySQLi 或 PDO_MySQL 扩展。

        【讨论】: