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
4

5 回答 5

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为第 4 个参数:

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));
于 2013-08-13T11:47:16.360 回答
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”中。

于 2013-08-13T11:30:36.527 回答
0

简单的解决方案是在连接查询之前暂时关闭protect_identifiers,如下所示:

$this->db->_protect_identifiers = false;

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

在 CodeIgniter 2.1.2 版中为我工作

于 2020-07-21T04:23:05.253 回答
-2

试试这个

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

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

于 2013-08-13T11:32:10.313 回答
-2

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

$this->db->join('post_likes', 'post_likes.user_id="'.$online_user.'" AND post_likes.post_id=post.id', 'left');
于 2013-08-13T11:32:17.330 回答