2011-06-06 88 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抱怨的问题。我从来没有想到它会被执行,但唉,这是查询导致我的错误。看到我不再需要它,我删除它,我的错误消失了。

再一次,我为所有在这个问题上留下时间的人感到抱歉。我将尽量在将来更小心!