CakePHP 1.3查询方法给出SQL 1064错误


CakePHP 1.3 query method gives SQL 1064 error

我编写了一个自定义查询,用于CakePHP 1.3。查询如下:

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));

我认为在某些情况下,您的查询最终会变成这样:

" ...
  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));

我早些时候试过发布这个,但没有100的声誉我做不到。总之,这是我之前试图发布的答案:

尊敬的有此问题的来访者。我非常抱歉(尤其是你,因为你花了时间思考并回答了我的问题!)。

我刚刚发现我犯了一个非常愚蠢的错误。在我的控制器中,在一个完全不应该执行的完全不同的方法中,我在die()调用中有另一个查询。MySQL一直在抱怨这个问题。我从未想过它会被执行,但遗憾的是,正是查询导致了我的错误。看到我不再需要它,我删除了它,我的错误就消失了。

再一次,我为你们所有在这个问题上花费时间的人感到抱歉。我以后会尽量小心的!