CodeIgniter ActiveRecord join()方法用反引号包装数字

时间:2013-08-13 11:27:36

标签: codeigniter activerecord codeigniter-2

这是我在CodeIgniter中的活动记录代码:

$this->db->...
$this->db->join('post_likes', 'post_likes.user_id="'.$this->db->escape($online_user).'" AND post_likes.post_id=post.id', 'left');

这就是它的解释方式:

LEFT JOIN `post_likes` ON `post_likes`.`user_id`="`3"` AND post_likes.post_id=post.id

它给出了错误:

`user_id`="`3"` 

如何在活动记录中写一个直接号码?


更新

删除escape

要在您的计算机上测试它,您不需要拥有数据库。只是尝试此代码会显示错误:

$this->db->select('*')
    ->from('mytable')
    ->join('post_likes', 'post_likes.user_id="3" AND  post_likes.post_id=post.id', 'left');
$query=$this->db->get('');
var_dump($this->db->last_query());
exit(0);

结果:

A Database Error Occurred

Error Number: 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 '` AND post_likes.post_id=post.id' at line 3

SELECT * FROM (`mytable`) LEFT JOIN `post_likes` ON `post_likes`.`user_id`="`3"` AND post_likes.post_id=post.id

5 个答案:

答案 0 :(得分:3)

你不应该在SQL查询中使用双引号:

$this->db->join('post_likes', "post_likes.user_id = $online_user AND post_likes.post_id=post.id", 'left');

更新

这是当前CI稳定版本中的一个错误(在v3.0-DEV中修复),CI ActiveRecord方法(实际上并未实现ActiveRecord)为简单用法做好准备。

我之前通过黑客核心文件解决了这个问题(通过添加参数来加入方法来禁用_protect_identifires)。

我们走了:

system/database/DB_active_rec.php第310行中,添加$escape作为第四个参数:

public function join($table, $cond, $type = '', $escape = TRUE)

并将$match[3] = ...更改为:

if ($escape === TRUE)
{
    $match[3] = $this->_protect_identifiers($match[3]);
}

因此,您可以使用join($table, $cond, $type = '', $escape = FALSE)禁用转义

此外,将_protect_identifires全局设置为FALSE的方向不正确。

唯一的选择仍然是使用自定义query()

$sql = "SELECT * FROM some_table WHERE id = ?"
$this->db->query($sql, array(3));

答案 1 :(得分:0)

试试这个

    $this->db->join('post_likes', "post_likes.user_id=$the_userid AND 
     post_likes.post_id=post.id", 'left');

 $this->db->join('post_likes', 'post_likes.user_id="'.$the_userid.'" AND 
         post_likes.post_id=post.id', 'left');

更新

定义

$db['default']['_protect_identifiers']= FALSE; 
最后在“application / config / database.php”中

答案 2 :(得分:0)

简单的解决方案是在加入查询之前暂时将protect_identifiers设置为关闭,例如:

$this->db->_protect_identifiers = false;

进行联接查询后,您可以将其设置回true

在CodeIgniter 2.1.2版中为我工作

答案 3 :(得分:-2)

尝试这个

$this->db->join('post_likes', 'post_likes.user_id="{$online_user}" AND post_likes.post_id=post.id', 'left');

如果您遇到任何问题,请告诉我。

答案 4 :(得分:-2)

不要使用$this->db->escape

$this->db->join('post_likes', 'post_likes.user_id="'.$online_user.'" AND post_likes.post_id=post.id', 'left');