反引号不在sql字符串中

时间:2013-04-18 19:58:54

标签: php sql codeigniter activerecord

我正在使用Jamie Rumbelow的MY_Model并需要添加一个函数,以便包含一些额外的数据。

我看到这篇文章,它帮助我找出了我需要完成的工作,但是我遇到了SQL错误。关于什么是错的任何想法?

  

错误号码:1064

     

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近'FROM(titles)加入users ON titlescreator_id =   第2行usersuser_id'

SELECT CONCAT_WS(' ', `users`.`first_name`, `users`.`last_name)` AS creator FROM (`titles`) JOIN `users` ON `titles`.`creator_id` = `users`.`user_id`

public function with_creator()
{
    $this->db->join('users', 'titles.creator_id = users.user_id');
    $this->db->select("CONCAT_WS(' ', users.first_name, users.last_name) AS creator");

    return $this;
}

当我使用Jamie的MY_Model时,我使用以下代码。

// In controller
$pages = $this->pages->with_creator()->get_all();

// In Model
class Pages_m extends MY_Model 
{
public $_table = 'pages';
public $primary_key = 'page_id';

public function with_creator()
    {
        $this->db->join('users', 'pages.creator_id = users.user_id');
        $this->db->select("CONCAT_WS(' ', users.first_name, users.last_name) AS creator", FALSE);

        return $this;
    }
}

它现在只包含创建索引,不包括页面自身的任何数据。

2 个答案:

答案 0 :(得分:3)

您的查询在错误的地方有反复。修复如下:

SELECT CONCAT_WS(' ', `users`.`first_name`, `users`.`last_name`) AS creator 
FROM (`titles`) JOIN `users` ON `titles`.`creator_id` = `users`.`user_id`

答案 1 :(得分:3)

这是CodeIgniter的活动记录/查询构建器本身的错误。它与杰米的基础模型无关。发生该错误的原因是SELECT字符串使用explode()进行细分,并使用逗号作为分隔符。由于函数中有逗号,因此在某些情况下会产生一些混乱。

您有两种选择:

  1. 手动编写查询。您不 一直使用查询构建器,特别是如果您只针对单一类型的数据库(查询构建器的一个重要特性是使您的应用程序与数据库无关)

  2. 告诉查询构建器不要转义该特定SELECT调用。您可以通过两种方式执行此操作:

  3. 数组语法:

    $this->db->select(array("CONCAT_WS(' ', users.first_name, users.last_name) AS creator"));
    

    转义参数:

    $this->db->select("CONCAT_WS(' ', users.first_name, users.last_name) AS creator", FALSE);
    

    当CI 3.0变得稳定时,应该在CI 3.0中更正此错误。它尚未在开发版中修复,但问题是已知的,它只需要解决和合并。如果您有任何反馈,you can contribute here

    选择问题:查询只返回creator concat结果,因为这就是您要求的全部内容。 get_all()方法不会自动选择所有内容,这只是查询构建器的标准默认值。指定select()电话后,它会使用该电话而非默认*

    您应该修改select()(或添加另一个)以确保正确调用其他列。