2013-07-09 68 views
0

我創建了幾個允許用戶縮小查找數據的下拉框。兩個下拉框包含用戶選擇年份的位置。例如,第一個盒子可能是1990年,第二個盒子可能是2000年。現在如何設置一個查詢來允許應用這段時間?多年間隔的Mysql查詢

$pYear1 = the first year they select in the drop down box 
$pYear2 = the second year they select in the drop down box 

select * from table where year = '$pYear1 - $pYear2'; 

我試過這個,但沒有奏效。誰能幫我這個?

+1

'WHERE year BETWEEN $ pYear1 AND $ pYear2'? [BETWEEN ... AND ...](http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between) – Sean

+0

我有強烈的感覺,這是要求SQL注入。你永遠不應該直接在SQL查詢中注入用戶提供的值。 –

回答

1

嘗試使用BETWEEN

select * from table where year BETWEEN '$pYear1' AND '$pYear2'; 

UPDATE:

由於@SylvainLeroux建議,強烈建議使用PDO或mysqli的性能和安全方面的原因:

PDO Manual

MySQLi Manual

+0

@SylvainLououx你是對的:),但問題不是安全相關的。 user2562125應該使用PDO或MySQLI來防止sql注入 – lexmihaylov

+0

這是SO的一個令人沮喪的部分:回答這個問題有時候就像給OP一把槍,讓他(她)自己在腳中一樣。但是你是對的:我應該在問題上發表我對安全性的評論,而不是你的回答;) –

+0

畢竟我們試圖幫助OP,所以我將參考PDO和mysqli的文檔,正如你所建議的 – lexmihaylov

1

正如我在評論中注意到的,您永遠不應該直接在SQL查詢中注入用戶提供的值。

在使用PHP時,首選的方法可能是使用準備好的語句。這裏我使用PDO(假設你的「年」是整數):

$sth = $dbh->prepare('* from table where year BETWEEN :start_year AND :end_year;'); 
$sth->bindParam(':start_year', $pYear1, PDO::PARAM_INT); 
$sth->bindParam(':end_year', $pYear2, PDO::PARAM_INT); 
$sth->execute(); 

這只是一個例子。有幾個變化可用。請參閱http://www.php.net/manual/en/pdostatement.execute.php

+0

PDO安全所需?我對PDO瞭解不多。 – user2562125

+0

@ user2562125我們主要關心的是,使用'$ pYear1'表示法,您在發送給數據庫的查詢中插入_untrusted_數據。可能導致[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)。使用_prepared語句_將顯着地防止特殊字符「屏蔽」 - 並且確保佔位符只能存儲_values_(而不是任意SQL)。出於安全原因,任何提供這種機制的庫都會有用。從PDO來看,這只是一個這樣的圖書館。 –

0

或者如果您想要排除日期的範圍,您可以直接執行此操作。

select * from table where year > '$pYear1' and year < '$pYear2';