2011-06-06 29 views
-1

我寫了一個自定義查詢在CakePHP的1.3要使用的查詢如下:CakePHP的1.3查詢方法給出SQL 1064錯誤

SELECT artists.id, artists.name, artists.image_id, genres.genre 
FROM artists 
    LEFT JOIN coupling_artist_genre 
    ON artists.id = coupling_artist_genre.id_in 
    LEFT JOIN genres 
    ON coupling_artist_genre.id_out = genres.id 
    WHERE artists.name LIKE '%tee%' 
    AND genres.id IN (12,14) 
    ORDER BY artists.name ASC 
    LIMIT 0,25 

當我把這個像這樣:

$this -> Artist -> query ($sql); 

我得到這個錯誤:

1064: You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near ' 

但是,當我複製生成的查詢並將其粘貼到PHPMyAdmin它工作正常。沒有警告,沒有錯誤,最重要的是:我期望的結果。

有誰知道可能會導致Cake和PMA之間的這種差異?

編輯:這是查詢是如何產生的:

$query = "SELECT artists.id, artists.name, artists.image_id"; 

if ($genres != ' ' && strlen ($genres) > 0) 
{ 
    $query .= ", genres.genre"; 
} 

$query .= " FROM artists"; 

if ($genres != ' ' && strlen ($genres) > 0) 
{ 
    $query .= " LEFT JOIN coupling_artist_genre ON artists.id = coupling_artist_genre.id_in"; 
    $query .= " LEFT JOIN genres ON coupling_artist_genre.id_out = genres.id"; 
} 

$query .= " WHERE"; 

if ($searchString != '' && strlen ($searchString) > 0) 
{ 
    $searchString = $searchString == ' ' ? '' : $searchString; 
    $query .= " artists.name LIKE '%".$searchString."%'"; 
} 

if ($searchString != ' ' && strlen ($searchString) > 0 && $genres != ' ' && strlen ($genres) > 0) 
{ 
    $query .= " AND"; 
} 

if ($genres != ' ' && strlen ($genres) > 0) 
{ 
    $query .= " genres.id IN (".$genres.")"; 
} 

$query .= " ORDER BY artists.name ASC LIMIT " . ($page - 1) * 25 . ",25"; 

$this -> set ('artists', $this -> Artist -> query ($query)); 
+1

你可以把你如何生成$ sql var? – raultm 2011-06-06 15:07:10

+0

是的,看我的編輯:) – lunanoko 2011-06-06 15:13:00

+1

你應該真的使用這個查詢的內置查找方法,它會工作正常,如果你有正確的關係設置,它看起來並不複雜。 – Dunhamzzz 2011-06-06 15:24:58

回答

0

我覺得有情況下,當你的查詢結束這樣的:

" ... 
    WHERE 
    ORDER BY ... " 

" ... 
    WHERE artists.name LIKE '%tee%' 
    AND 
    ORDER BY ... " 

嘗試這個:

$query .= " WHERE True "; 

if ($searchString != '' && strlen ($searchString) > 0) 
{ 
    $searchString = $searchString == ' ' ? '' : $searchString; 
    $query .= " AND artists.name LIKE '%".$searchString."%'"; 
} 


if ($genres != ' ' && strlen ($genres) > 0) 
{ 
    $query .= " AND genres.id IN (".$genres.")"; 
} 

$query .= " ORDER BY artists.name ASC LIMIT " . ($page - 1) * 25 . ",25"; 

$this -> set ('artists', $this -> Artist -> query ($query)); 
0

試圖發佈此更早,但我不能沒有100聲望。無論如何,這是我早些時候發佈的答案:

尊敬的訪客這個問題。我非常抱歉(特別是對於你,因爲你花時間思考並回答我的問題!)。

我剛發現我犯了一個非常愚蠢的錯誤。在我的控制器中,在一個完全不同的方法中,甚至不應該執行,我在die()調用中進行了另一個查詢。這是MySQL抱怨的問題。我從來沒有想到它會被執行,但唉,這是查詢導致我的錯誤。看到我不再需要它,我刪除它,我的錯誤消失了。

再一次,我爲所有在這個問題上留下時間的人感到抱歉。我將盡量在將來更小心!