Метод запроса CakePHP 1.3 выдает ошибку SQL 1064 - PullRequest
0 голосов
/ 06 июня 2011

Я написал собственный запрос для использования в 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));

Ответы [ 2 ]

0 голосов
/ 08 июня 2011

Пытался опубликовать это раньше, но я не мог без 100 репутации.В любом случае вот ответ, который я пытался опубликовать ранее:

Уважаемые посетители этого вопроса.Мне очень жаль (особенно для вас, ypercube, потому что вы нашли время подумать и ответить на мой вопрос!).

Я только что обнаружил, что совершил очень глупую ошибку.В моем контроллере, в совершенно другом методе, который даже не должен выполняться, у меня был другой запрос в вызове die ().Это был вопрос, на который жаловался MySQL.Я никогда не ожидал, что это будет выполнено, но, увы, это был запрос, вызвавший мою ошибку.Видя, что мне это больше не нужно, я удалил его, и моя ошибка исчезла.

Еще раз прошу прощения за всех вас, кто уделил время этому вопросу.Я постараюсь быть более осторожным в будущем!

0 голосов
/ 06 июня 2011

Я думаю, что есть случаи, когда ваши запросы заканчиваются так:

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