2014-10-27 22 views
0

我有一个搜索功能,可以让你输入最后一个,第一个和中间名的不同类型框。我没有任何代码问题,但有谁知道如何优化它?PHP/MySQL如何设置更简单的SELECT查询?

的代码有多种,如果是发现了什么文本框是unempty并随后在WHERE作为你可以看到下面的语句:

$where1 = $_POST['firstname']; 
      $where2 = $_POST['midname']; 
      $where3 = $_POST['lastname']; 

      if(!empty($where1) && empty($where2) && empty($where3)){ 
       $result = $connection->query("SELECT * FROM senior WHERE firstname = '$where1'"); 
      } else if(!empty($where1) && !empty($where2) && empty($where3)){ 
       $result = $connection->query("SELECT * FROM senior WHERE firstname = '$where1' AND midname = '$where2'"); 
      } else if(!empty($where1) && !empty($where2) && !empty($where3)){ 
       $result = $connection->query("SELECT * FROM senior WHERE firstname = '$where1' AND midname = '$where2' AND lastname = '$where3' "); 
      } else if(!empty($where1) && empty($where2) && !empty($where3)){ 
       $result = $connection->query("SELECT * FROM senior WHERE firstname = '$where1' AND lastname = '$where3' "); 
      } else if(empty($where1) && !empty($where2) && !empty($where3)){ 
       $result = $connection->query("SELECT * FROM senior WHERE lastname = '$where3' AND midname = '$where2' "); 
      } else if(empty($where1) && !empty($where2) && empty($where3)){ 
       $result = $connection->query("SELECT * FROM senior WHERE midname = '$where2'"); 
      } else if(empty($where1) && empty($where2) && !empty($where3)){ 
       $result = $connection->query("SELECT * FROM senior WHERE lastname = '$where3'"); 
      } 
+0

您可能不想“简化”代码。多重查询将允许MySQL利用特定于每组条件的索引。 – 2014-10-27 03:07:07

+0

搜索*“PHP的SQL查询生成器”*。当你在它,请参阅http://php.net/manual/language.operators.string.php – Phil 2014-10-27 03:07:39

+1

这属于http://codereview.stackexchange.com/ – EternalHour 2014-10-27 03:22:23

回答

0

我的建议对你

$where = ''; 
if($where1) $where .= ($where ? " AND " : " ")."firstname = '$where1'"; 
if($where2) $where .= ($where ? " AND " : " ")."midname = '$where2'"; 
if($where3) $where .= ($where ? " AND " : " ")."lastname = '$where3'"; 
$query = "SELECT * FROM senior".($where ? " WHERE ".$where : ""); 
$result = $connection->query($query); 
+0

而不是所有'$ where?'东西,为什么不在''AND'上填充数组和'implode'' – Phil 2014-10-27 03:28:39

+0

直接复制代码,它不起作用。稍微调整一下,看看会不会。谢谢你的想法!不知道你可以用它来进行查询。 – 2014-10-27 03:46:40

0

第一总之,我鼓励您使用Prepared Statements以提高其他方面的安全性。

相关与你写你上面的代码可以尝试这样的事:

$query = "SELECT * FROM senior"; 
$firstcondition = true; 

if (!empty($where1)) 
    addConditon($query, "firstname = ".$where1); 
if (!empty($where2)) 
    addConditon($query, "midname = ".$where2);  
if (!empty($where3)) 
    addConditon($query, "lastname = ".$where3); 

$result = $connection->query($query); 

function addCondition($query, $condition) { 
    if (!$firstcondition) 
    $query.= " AND "; 
    else { 
    $firstcondition = false; 
    $query.= " WHERE "; 
    } 
    $query.= $condition; 
} 
+0

谢谢你的代码和参考。我前两天才开始学习php,网上的教程并不一致,有时它们彼此过时和/或完全不同,以至于很难理解什么是更好的使用方法(或者完全可以使用它) 。 :) – 2014-10-27 03:53:02

+0

@HopelessNoob我建议您阅读[官方文档](http://php.net/manual/en/index.php)并将其与[使用PDO在PHP中准备的语句](http:// php.net/manual/en/pdo.prepared-statements.php) – emibloque 2014-10-27 04:01:55

0

只是一个建议:为什么不使用LIKE,因为它是一个搜索查询?

$where1 = $_POST['firstname']; 
$where2 = $_POST['midname']; 
$where3 = $_POST['lastname']; 

$result = $connection->query("SELECT * FROM senior WHERE firstname LIKE '%".$where1."%' AND midname LIKE '%".$where2."%' AND lastname LIKE '%".$where3."%' ");