2010-07-28 103 views
0

所以我正在做一個搜索,我在我的select語句中使用了一個implode,我發現它非常有用。基本上這個搜索引擎會有3個不同的選擇,它們會根據不同的標準選擇不同的東西,當我使用我的implode時,會得到一個通過無效參數的錯誤。php內爆問題

這裏是我的SQL語句:

 
$sql = "SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link FROM ((camp INNER JOIN gender ON camp.id = gender.camp_id) 
INNER JOIN grades ON camp.id = grades.camp_id) 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE ((grades.year = '".implode('\' OR grades.year = \'',$age)."') 
AND gender.gender = '".$gender."') 
OR ((interests.activity = '".implode('\' OR interests.activity = \'',$array)."') 
AND (grades.year = '".$age."' AND gender.gender = '".$gender."'))";

第二破滅的利益是我開始有我的問題,$陣列是。我不明白的另一件事是,當我運行我的代碼時,我得到了正確的結果,但我仍然收到錯誤,我傳遞了無效的參數。

+0

所以我必須絕對遲鈍,因爲當我去尋找代碼發佈時,我意識到我只是搞砸了大量的時間,並沒有意識到我的代碼不合適,這是我的問題所在。對不起,使這個線程如簡單的答案。謝謝你幫助,雖然它非常感謝! – Chris 2010-07-29 13:03:09

回答

0

您正試圖在重大聲明中做所有事情。爲什麼不在你將它們包含在SQL中之前構建你的內置數組字符串?

0

Chris,你的問題是你不是傳遞數組到implode()的第二個參數。

如果你看到www.php.net/implode第二個參數的類型必須爲ARRAY,使PHP可以開始用第一個參數指定的分隔符一起加入您的陣列。

一個很好的方法來檢查您的變量的數據類型是用var_dump(),它會告訴你,如果事情是一個數組,或int..etc

有你傳遞給兩個變量那裏有implode()$年齡$ array,我猜測它是年齡,你需要修改你的代碼。

粘貼您生成$ array和$ age的整個代碼將幫助我們進一步瞭解您在創建這些變量時出錯的位置。

希望這會有所幫助。

2

你可能會相信PHP通常會說的。如果它說它不是一個數組,你可能沒有傳遞一個數組。

而且一個小技巧,以節省您的一些代碼:有一個IN()聲明在MySQL:

$sql = "SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link FROM ((camp INNER JOIN gender ON camp.id = gender.camp_id) 
INNER JOIN grades ON camp.id = grades.camp_id) 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE (grades.year IN(".implode(',', $age).") 
AND gender.gender = '".$gender."') 
OR (interests.activity IN('".implode("','", $array)."') 
AND grades.year = ".$age." AND gender.gender = '".$gender."')"; 

要保存重複gender.gender = $gender和(可能)優化查詢:

$sql = "SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link FROM ((camp INNER JOIN gender ON camp.id = gender.camp_id) 
INNER JOIN grades ON camp.id = grades.camp_id) 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE gender.gender = '".$gender."' 
AND (
    grades.year IN(".implode(',', $age).") 
    OR (
     interests.activity IN('".implode("','", $array)."') 
     AND grades.year = ".$age." 
    ) 
)"; 

而且我認爲MySQL不需要使用所有這些加入的圓括號:

$sql = 
"SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link 
FROM camp 
INNER JOIN gender ON camp.id = gender.camp_id 
INNER JOIN grades ON camp.id = grades.camp_id 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE gender.gender = '".$gender."' 
AND (
    grades.year IN(".implode(',', $age).") 
    OR (
     interests.activity IN('".implode("','", $array)."') 
     AND grades.year = ".$age." 
    ) 
)"; 

現在查詢應該更好理解。

+0

你的右邊的MySQL不需要括號,但是我已經開發了使用Access數據庫的這個,但是現在我試圖讓它與MySQL一起工作。此外這個解決方案沒有工作。 – Chris 2010-07-29 12:51:38

0

由於您使用的字符串:

OR (interests.activity IN ('".implode("','", $array)."') 

將neaten了該行。

但我擔心$年齡。您可以使用它,就好像它是一個數組:

WHERE ((grades.year = '".implode('\' OR grades.year = \'',$age)."') 

但作爲一個字符串變量:

AND (grades.year = '".$age."' AND gender.gender = '".$gender."'))"; 

我想你應該使用「IN」和內爆()爲兩地表達你如果是數組,則使用$年代。