【问题标题】:CakePHP 1.3 query method gives SQL 1064 errorCakePHP 1.3 查询方法给出 SQL 1064 错误
【发布时间】:2011-06-06 14:46:58
【问题描述】:

我写了一个自定义查询在 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));

【问题讨论】:

  • 你能说说你是如何生成 $sql 变量的吗?
  • 你真的应该使用内置的 find 方法来查询这个查询,如果你的关系设置正确,它会工作得很好,它看起来并不复杂。
  • 我很想这样做,但我无法让它按照我想要的方式工作。我在博客上找到了一些可能的解决方案,但它们看起来比我自己编写查询更麻烦。这个选择的难点在于我想根据他们相关流派的 ID 来选择艺术家。我找不到在 Cake 中轻松做到这一点的方法。

标签: php mysql sql cakephp cakephp-1.3


【解决方案1】:

我认为您的查询最终会是这样的情况:

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

【讨论】:

    【解决方案2】:

    试图早点发布这个,但我不能没有 100 名声望。无论如何,这是我之前尝试发布的答案:

    尊敬的此问题的访客。非常抱歉(特别是对你 ypercube,因为你花时间思考并回答了我的问题!)。

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

    再一次,对于所有在这个问题上花时间的人,我深表歉意。以后我会更加小心的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2019-01-02
      相关资源
      最近更新 更多