2012-03-14 24 views
0
  • 我廠擁有的這個數據庫
  • 該數據的用戶enteres發送到PHP文件,執行SQL,這將列出植物從
  • PHP文件中的HTML表單一個數據庫,基於用戶輸入

因此,例如他們可能會選擇'樹'型植物。他們也可以輸入特定搜索一個英文名字,現在這是我的PHP:PHP的形式,只發送所選數據

$data = mysql_query("SELECT * FROM Plants WHERE PlantType='$plantType' AND EnglishName='$englishName'") 

,但我怎麼能做好,因此,如果用戶不輸入一個英文名字被搜索,它將只搜索按植物類型?注意:我會搜索很多字段,例如花朵的顏色,土壤類型等,我只想按用戶選擇要更改的那些進行搜索。

+0

你應該爲用戶提供一些電臺和檢查搜索類型,examepl(PS做不是爲了得到安全的保護!):如果($ rado1)$ data = mysql_query($ querry1)elseif($ radio2)$ data = mysql_query($ querry2)elseif($ radio2)$ data = mysql_query($ querry3)...等等。 – nvcnvn 2012-03-14 17:06:08

回答

1
$query = "SELECT * FROM Plants WHERE PlantType='$plantType'"; 
if(isset($_POST['englishName'])) $query .= " AND EnglishName='$englishName'"; 
if(isset($_POST['someForm'])) $query .= " AND someForm='$otherForm'"; 
if(isset($_POST['otherForm'])) $query .= " AND otherForm='$otherForm'"; 

$data = mysql_query($query); 

您還可以準備整個語句,如果變量爲空,則使用通配符(%)。

if(isset($_POST['something']) { 
$something = mysql_real_escape_string($_POST['something'];) 
}else{ 
$something = '%'; 
} 

顯然你會想檢查你的POST變量是否有錯誤的數據,否則你會打開自己的SQL注入攻擊。此外,使用PDO準備的語句更容易。我閱讀了關於PDO @ PHP.net

+1

僅僅因爲設置了$ _POST ['englishName']'並不一定意味着設置了'$ englishName'。 ;)另外,永遠不要將'POST'變量直接放到SQL查詢中! – Crontab 2012-03-14 17:09:59

+0

希望$ englishName沒有設置;)否則他有比他意識到的更大的問題。 mysql_real_escape_string($ _ GET ['EnglishName'])在查詢字符串內沒有錯,我只是爭辯說它可能需要更多的驗證才能到達該點。 – 2012-03-14 17:36:52

+0

如果你調用'example.com?englishName =&plantType = tree',你的$ _POST [「englishName」]將被設置('isset(...)== true'),但它將是空的。你也可以檢查'!empty($ _ POST [「englishName」])'。 – Basti 2012-03-14 17:39:39

2

構建查詢字符串在運行查詢之前:

$fields = array(); 
if ($plantType != "") { 
    $fields["PlantType"] = $plantType; 
} 
if ($englishName != "") { 
    $fields["EnglishName"] = $englishName; 
} 
if (count($fields) < 1) { 
    echo "No fields submitted"; 
} else { 
    $query = "SELECT * FROM Plants WHERE "; 
    foreach($fields as $field => $value) { 
     $query .= $field." = '".$value."' AND "; 
    } 
    $query = substr($query,0,-4); 
    $data = mysql_query($query); 
} 
+0

請注意,由於您沒有在您的問題中提及'$ _POST'或'$ _GET',我假設您已經對'$ plantType'或'$ englishName'中的任何內容進行了清理。 – Crontab 2012-03-14 17:34:15

0

保存所有條件,用戶想要滿足進入和arrayimplode他們到您的查詢字符串:

$conditions = array(); 

if (isset($_POST['plantType']) && is_string($_POST['plantType'])) 
    $conditions[] = "PlantType = '".mysql_real_escape_string($_POST['plantType'])."'"; 

if (isset($_POST['englishName']) && is_string($_POST['englishName'])) 
    $conditions[] = "EnglishName = '".mysql_real_escape_string($_POST['englishName'])."'"; 

// repeat for color, soilType, ... 

$query = "SELECT * FROM Plants"; 
if (count($conditions) > 0) 
    $query .= " WHERE ".implode(" AND ", $conditions); 

$data = mysql_query($query); 

一個較短的版本不相同:

$conditions = array(); 
$validColumns = array(
    // Name of the column in DB => name of the parameter in URL 
    "PlantType"     => "plantType", 
    "EnglishName"    => "englishName", 
    "Color"      => "color", 
    // add more here 
); 

// Loop through all valid columns the user might input. 
foreach ($validColumns as $column => $param) 
{ 
    // If it is set and maybe if it is valid (add validation here). 
    // add this condition to our array 
    if (isset($_POST[$param]) && is_string($_POST[$param]) && !empty($_POST[$param])) 
     $conditions[] = "`$column` = '" . 
      // Don't forget to escape to prevent SQL-Injection. 
      mysql_real_escape_string($_POST[$param])."'"; 
} 

$query = "SELECT * FROM Plants"; 

// Check if there are any conditions. Otherwise display all plants. 
if (count($conditions) > 0) 
    $query .= " WHERE ".implode(" AND ", $conditions); 

$data = mysql_query($query); 
+0

$ _REQUEST是壞的範圍應該是已知的... $ _REQUEST將包括$ _COOKIES這可能是惡意的。 – 2012-03-14 17:30:03

+0

那麼可以做些什麼? '$ _GET'和'$ _POST'也可以由攻擊者自由修改。如果參數不是字符串,我添加了一個額外的檢查來不使這個腳本報告警告。 – Basti 2012-03-14 17:32:40

+1

看到這篇文章http://stackoverflow.com/questions/2142497/whats-wrong-with-using-request – 2012-03-14 17:34:15

0

根據用戶輸入的內容可以構建查詢。

$query_string = "SELECT * FROM Plants WHERE PlantType='$plantType'"; 
    if(!empty($_POST["engName"])) 
     $query_string .= "AND EnglishName=".$_POST['engName']; 

當然要清理$ _POST [「engName」]!

+0

你爲什麼不在你的例子中清理你的POST數據?我不想給一個修剪SQL注入的例子。 – Basti 2012-03-14 17:19:37

+0

看到我的例子在下面...我用$ _GET作爲註冊全局變量範圍的變種應該關閉!我在get var上使用了mysql_real_escape_string,可以擴展它以執行額外的檢查和其他操作,但這是一個開始 – 2012-03-14 17:31:45

0

單獨在MySQL中有很多先進的技術可以處理這個問題。例如Where子句之後的OR語句甚至合併。

有了這樣說我會動態建立WHERE子句

<?php 
    $sql = "SELECT * FROM Plants WHERE"; 

    $where = array(); 

    if(!empty($_GET['plantType'])){ 
     'PlantType=' . mysql_real_escape_string($_GET['plantType']); 
    } 

    if(!empty($_GET['EnglishName'])) { 
     'EnglishName=' . mysql_real_escape_string($_GET['EnglishName']); 
    } 

    if(!empty($_GET['color'])) { 
     'color=' . mysql_real_escape_string($_GET['color']); 
    } 

    if(!empty($_GET['soilType'])) { 
     'soilType=' . mysql_real_escape_string($_GET['soilType']); 
    }; 

    foreach($where as $key => $value) { 
     $sql = $sql . ' ' . $value; 
     if($key+1 < count($where)) { 
      $sql = $sql . ' AND' 
     } 
    } 

    $data = mysql_query($sql); 
?>