2014-05-01 19 views
0

這裏是頁我問:查詢使用多變量從形式不作爲預期

http://rdavidbeales.com/archiveprototype/advancedsearch.php 

我已經得到的查詢做使用從建設性的批評術語一些搜索無視NULL變量到原來的帖子。

唯一的問題是現在,我不能包括在$where變量的定義AND語句,因爲如果只選擇了一個字段,然後我得到一個錯誤的意義AND聲明。

  • 那麼如何在必要時編輯新代碼以包含AND

使用這個鏈接Possible to have PHP MYSQL query ignore empty variable in WHERE clause?我想出了下面的代碼:

$anf = $_POST["artistnameform"]; 
$df = $_POST["decadeform"]; 
$stf = $_POST["subjecttermform"]; 
$ptf = $_POST["phototitleform"]; 
$where = "WHERE"; 

if(!empty($ptf)){ 
$where .= " P.PhotoTitle='$ptf '"; 
} 
if(!empty($anf)){ 
$where .= " PE.idPeople = '$anf '"; 
} 
if(!empty($stf)){ 
$where .= " S.idSubjectTerm = '$stf '"; 
} 
if(!empty($df)){ 
$where .= " P.PhotoCreatedDate LIKE CONCAT ('%', '$df ', '%')"; 
} 

這裏是使用$where查詢:

$query = " 
    SELECT P.PhotoTitle, 
      P.PhotoURL, 
      P.PhotoCaption, 
      PE.FirstName, 
      PE.LastName 
    FROM Photo P 
LEFT JOIN People_has_Photo PHP 
     ON idPhoto=PHP.Photo_idPhoto 
LEFT JOIN People PE 
     ON idPeople=People_idPeople 
LEFT JOIN SubjectTerm_has_Photo SHP 
     ON idPhoto=SHP.Photo_idPhoto 
LEFT JOIN SubjectTerm S 
     ON idSubjectTerm=SubjectTerm_idSubjectTerm 
$where 
GROUP BY P.PhotoFileName"; 
$result = mysql_query($query); 
+0

你可以通過一個特定的字符串值,而不是空字符串(例如:<期權價值=「myNull」>請選擇)。這樣你就可以解釋這個字符串(「myNull」)因爲沒有過濾服務器端,所以組成最後的查詢 –

+0

現在我沒有得到回報,因爲不是字段不爲空,我沒有得到回報,因爲該字段不包含'mynull'。這是因爲我沒有在你提到的服務器端過濾它。那究竟是如何完成的?感謝您的想法和快速反應!我在這裏自學,所以我的命名習慣和模糊的語言會隨着我的進步而變得更好。謝謝你的幫助。 –

+1

您的命名策略留下了一些不足之處。我的意思是,爲什麼要分配一個別名,如果你不使用它!?!?!實際上,這裏有很多錯誤,知道從哪裏開始有點困難: - 〜 – Strawberry

回答

1

使用條件的數組,然後連接它們與' AND '之間

$wheres = array(); 

if(!empty($ptf)){ 
    $wheres[] = " P.PhotoTitle='$ptf '"; 
} 
if(!empty($anf)){ 
    $wheres[] = " PE.idPeople = '$anf '"; 
} 
if(!empty($stf)){ 
    $wheres[] = " S.idSubjectTerm = '$stf '"; 
} 
if(!empty($df)){ 
    $wheres[] = " P.PhotoCreatedDate LIKE '%{$df} %')"; 
} 

$where = implode(' AND ', $wheres); 

我也擺脫了CONCAT函數,因爲它是多餘的。

另外:

  1. 檢查,如果你真的需要每個值後的空間。我想你不會。
  2. 在MySQL中使用專門的DateTime函數,而不是LIKE。搜索時間值可以很快,如果索引,但這樣一個LIKE運營商殺死所有的表現。
  3. 該腳本易受SQL注入攻擊。退出引號,或者,甚至更好的是,在MySQLi或PDO中使用參數化查詢。
  4. 請勿使用mysql_...函數。它們已被棄用,將來會被刪除。
  5. 在編寫包含多個表的SQL查詢時,總是在字段中添加表名或別名。按照這個簡單的規則,您將在未來避免大量的錯誤。
+0

感謝您的幫助,這個工作非常完美,我將查詢SQL日期時間函數,一旦我開始工作,我將把這個函數移動到存儲過程中對,我會做一些readin g逃避用戶輸入。我會投票,但我還不能! –

+0

如果我是你,我不會做存儲過程。如果您還不知道DateTime函數,那麼您可能剛開始使用數據庫。存儲過程在MySQL上構建起來有些複雜,我從來沒有見過任何使用MySQL的系統。他們在那裏,但沒有人真正使用它們。但對於其他數據庫引擎則不同。 – AlexanderMP