2014-09-29 127 views
0

的數量可變的sql查詢我需要做一個SQL查詢在PHP的搜索某些條目(因此使用WHERE)。但用於搜索的字段可能是可變數字。取決於搜索參數

我有一個網頁搜索表單,4場。它通過POST領域發送到search.php中,使查詢:

$gomme_sql = $data->query("SELECT * FROM table WHERE parameter1 = '$_POST['name1']' AND parameter2 = '$_POST['name2']' ORDER BY id ASC"); 

但我不知道哪場被填滿。因此,如果我在搜索表單中沒有輸入任何內容field1,我不應該在WHERE查詢中輸入parameter1 = '$_POST['name1']'

你有什麼想法如何獲得呢?

謝謝

回答

0

可以追加該子句查詢在這樣的方式前檢查後數據:

編輯:添加額外的檢查:

$sql="select something from someTable "; 
if(!empty($_POST['name1']) || !empty($_POST['name2'])) // add as many as you like 
{ 
$sql.=" where "; 
    if(!empty($_POST['name1'])) 
    { 
     $sql.="parameter1= $_POST['name1']"; 
    } 
// etc etc... 
} 
$sql.=" ORDER BY id ASC"; 

等。

說了這麼多,請,請用準備好的語句與這種輸入的來自用戶。這是超級開放的SQL注入。請務必閱讀本:How can I prevent SQL injection in PHP?

+0

好的,非常感謝你! 我也想,如果沒有字段填充,頁面顯示錶中的所有條目。有了這種結構,在這種情況下,我有一個沒有任何參數通過... – Matteo 2014-09-29 11:56:01

+0

請參閱編輯另一級別的檢查。 – Fluffeh 2014-09-29 12:15:49

0

您可以編寫通用的SQL SELECT功能就是這樣,如果你需要更復雜的SQL只是修改它。

<?php 


    function sqlSelect($table, $sel, $wh = '', $groupby = '', $order = '', $add = '') { 

      $tb = $table; 
      if (is_array($table)) { 
       $tb = implode(',', $table); 
      } 
      if ($wh) { 
       if (is_array($wh)) { 
        $w = array(); 
        foreach ($wh as $k => $v) { 
         $v = mysqli_real_escape_string($v); 
         if (is_null($v)) 
          $w [] = "$k=null "; 
         else 
          $w [] = "$k ='$v'"; 
        } 
        $wh = 'where ' . implode(' and ', $w); 
       }else { 
        $wh = "where $wh"; 
       } 
      } 
      if ($groupby) 
       $groupby = "group by $groupby"; 
      if ($order) 
       $order = "order by $order"; 
      $sql = "select $sel from $tb $wh $groupby $order $add "; 
      return $sql; 
     } 
    //set _GET as this is console test  
    $_GET['name1']='Bob'; 
    $where = array(
     'name1'=>$_GET['name1'] 
    ); 
     echo sqlSelect('sometable' , '*' , $where) ."\n"; 
     // select * from sometable where name1 ='Bob'  

//or some complex stuff 
     echo sqlSelect('persons', "age,status" , array('name'=>'Maria' , 'likes'=>'PHP') , null, 'age' , 'limit 20'); 
     //select age,status from persons where name ='Maria' and likes ='PHP' order by age limit 20