2009-12-11 76 views
2

我目前在MySQL中有一個很大的表,有幾個字段。我目前正在嘗試允許用戶通過選擇框篩選每個字段。正確過濾PHP/MySQL和選擇框

我有4個領域:學校,部門和國家。

我沒有問題,使用PHP,如何篩選基於用戶在選擇框中選擇哪個選項。

例如,如果這3個提交:

<select id="school"> 
<option value="13">John Brown School</option> 
</select> 

<select id="division"> 
<option value="I">I</option> 
</select> 

<select id="state"> 
<option value="NY">New York</option> 
</select> 

我將能夠根據每個選項進行查詢,如:

$school= $_POST['school']; 
$division= $_POST['division']; 
$state = $_POST['state']; 

Query: SELECT * from table WHERE school=$school AND division=$division and state=$state 

但是,如果我想有一個「全「選項(在選擇框中),我將如何將它實現到查詢或WHERE子句中,以便它不會過濾該特定字段?

+2

我希望你使用準備好的語句來避免SQL注入。 –

+0

我是,我只是保持簡潔,以保持'問題'儘可能簡單。 – Dodinas

回答

4

你應該簡單地做一個你特別尋找的選項。事實上,在這種情況下,聽起來最好的選擇是使您的選擇框具有「全部」選項,或者將它們留空。空白選擇可以是您的默認選項。我把它設置爲:

<option value="">-- All schools --</option> 
etc. 

現在,設置查詢變量的時候,你這樣做:。

$whereClauses = array(); 
if (! empty($_POST['school'])) $whereClauses[] = 'school='.mysql_real_escape_string($_POST['school']); 
if (! empty($_POST['division'])) $whereClauses[] ='division='.mysql_real_escape_string($_POST['division']); 
if (! empty($_POST['state'])) $whereClauses[] = 'state='.mysql_real_escape_string($_POST['state']); 

$where = ''; 
if (count($whereClauses) > 0) { 
    $where = 'WHERE '.implode(' AND ',$whereClauses); 
} 

$query = "SELECT * FROM table ".$where; 

現在,如果任何選擇選項獲得與空值選擇(即使用全部),它們將不會成爲WHERE子句的一部分。

你是開放的SQL注入攻擊,如果你不逃避傳入$ _ POST數據一樣,所以有一件事你需要做的是運行在你的$ _POST價值觀,這是我到例如添加mysql_real_escape_string()。聽起來你已經意識到了這一點。

1

不考慮SQL注入等,這裏是一個方法來做到這一點的基本邏輯。 Psudo代碼或課程。

<select id="select1"> 
    <option value="">All</option> 
    <option value="value1">Value1</option> 
    ... 
</select> 



$sql = "select ... from ... where 1 = 1 "; 

if (!empty($_POST["select_1"])) { 
    $sql .=" and field1 = select1value"; 
} 

if (!empty($_POST["select_2"])) { 
    $sql .=" and field2 = select2value"; 
} 

if (!empty($_POST["select_one"])) { 
    $sql .=" and field3 = select3value"; 
} 

// Etc. 

這樣,與1 = 1,您不必擔心是否要追加基於一些或所有這些是否存在/添加「和」。您默認選擇全部(空白選擇值),並根據每個選擇的存在進行過濾。

當然,您需要清理它,保護它,將值放入變量等,但這是基本邏輯。