2014-10-27 18 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."%' ");