2013-01-09 78 views
0

正確的方式,我這裏有PHP代碼,可我用來拉特定日期其間的兩個日期用戶提供什麼是插入一個變量一個SQL查詢

if($start_date!="" && $end_date!=""){ 
$query[]="submit_time BETWEEN '$start_date' and '$end_date'"; 
} 

爲什麼是它後字符串被處理,工作。然而似乎widley例外辦法做到這一點是:

if($start_date!="" && $end_date!=""){ 
$query[]="submit_time BETWEEN '".$start_date."' and '".$end_date."'"; 
} 

任何一個可以闡述爲什麼這兩個方面的工作,哪一個是最好的?今天我被告知我應該用第一種方式來做,但我總是把字符串中的變量分開。有任何想法嗎?

或者是一個更好的例子:

$sql="SELECT * FROM $tbl_name WHERE submit_time BETWEEN 
'$start_date' and '$end_date'"; 

V.S.

$sql="SELECT * FROM $tbl_name WHERE submit_time BETWEEN 
'".$start_date."' and '".$end_date."'"; 
+2

不這樣做。使用PDO準備好的語句。 http://php.net/manual/en/book.pdo.php – shark555

回答

4

更加緊湊是核心的方式。如果這是唯一的檢查你是否在SQL注入。

你應該使用預處理語句:

http://php.net/manual/en/pdo.prepare.php

,如果你只是在談論一般的串插,我更喜歡sprintf因爲我認爲這是遠遠更具可讀性和它類型轉換:

$name = 'John Doe'; 
sprintf("Hello %s - How are you today", $name); 

請不要在你的sql中使用用戶提供的開始和結束日期。

+0

我沒有提到防止SQL注入,我指的是sql字符串的寫法,根據變量從字符串中分離 – Nick

+1

PDO不僅是安全問題。這也是一個乾淨的代碼問題。 在查詢中加入字符串看起來只是令人厭惡,並造成可怕的混亂。 – shark555

+0

@JohnDoe你正在做的是直接綁定到安全,他們在這種情況下攜手並行 – dm03514

0

我總是使用第一種方法,我認爲這只是歸結爲選擇的問題,而不是與編碼有關。但是,這只是我的意見..讓我們拭目以待

+0

不是一個真正的答案,更多的是評論。 – FrankieTheKneeMan

+0

@FrankieTheKneeMan問題是要求註釋 – 2013-01-09 20:46:31

+0

感謝您的共享興趣 – Nick

3

其實......沒有一個版本真的是最好的解決方案。如果您使用準備好的語句並將開始日期和結束日期作爲此查詢的參數提供,那將會好很多。如果您使用的PDO,它會是這個樣子:

$stmt = $db->prepare('SELECT * FROM somewhere WHERE submit_time BETWEEN :startdate AND :enddate'); 
$stmt->bindParam(':startdate', $start_date); 
$stmt->bindParam(':enddate', $end_date); 
$stmt->execute(); 

這樣你可以肯定會有你的查詢沒有搞亂,它也將更快地執行,因爲查詢分析器不必評估你的變量是否包含任何SQL語法。

要回答你的問題的其餘部分:這是編寫乾淨的代碼的問題。將變量嵌入到字符串中看起來有些雜亂,因爲您可以在任何提供語法高亮顯示的編輯器中輕鬆進行分析。如果將數組元素添加到字符串中,它會變得特別混亂。

0

它們之間幾乎沒有區別,它只是個人的優先。你真的應該使用準備好的語句(PDO),但至少在mysql_real_escape_string()中包裝你的變量以使它更安全。 PDO是要走的路。

$start_date = mysql_real_escape_string($start_date); 
$end_date = mysql_real_escape_string($end_date); 

$sql="SELECT * FROM $tbl_name WHERE submit_time BETWEEN 
'$start_date' and '$end_date'";