MySQL 函数和 CodeIgniter 活动记录

Posted

技术标签:

【中文标题】MySQL 函数和 CodeIgniter 活动记录【英文标题】:MySQL Function and CodeIgniter Active Record 【发布时间】:2011-10-22 23:46:43 【问题描述】:

CodeIgniter Active Record 简单、文档齐全且功能强大。但是当我尝试插入 mysql 内置函数 CONCATNOWGROUP_CONCATDATEDIFFTRIM 等或我的自定义函数时,它会出错。以下代码可以正常工作...

$result = $this->db->select('p.first_name, p.last_name, p.mobile_number, p.email_address')->from('profile p')->get()->result();

但是当我想联系first_namelast_name并使用MySQL CONCAT这样的函数时......

$result = $this->db->select('CONCAT(p.first_name, " ", p.last_name) fullname, p.mobile_number, p.email_address')->from('profile p')->get()->result();

显示数据库错误

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 '", `p`.`last_name)` fullname, `p`.`mobile_number`, `p`.`email_address` FROM (`pr' at line 1

SELECT CONCAT(p.first_name, `"` ", `p`.`last_name)` fullname, `p`.`mobile_number`, `p`.`email_address` FROM (`profile` p)

Filename: D:\xampp\htdocs\example\system\database\DB_driver.php

Line Number: 330

有没有办法在 CodeIgniter Active Record 中插入 MySQL 函数?希望我清楚。提前致谢。

【问题讨论】:

可能重复:CONCAT() function in a SELECT field list 和示例:concat in php codeigniter。 【参考方案1】:

由于我不知道您的确切错误:

来自用户指南:

$this->db->select() 接受可选的第二个参数。如果您将其设置为 FALSE,CodeIgniter 将不会尝试使用反引号保护您的字段或表名称。如果您需要复合选择语句,这很有用。

$result = $this->db->select('CONCAT(p.first_name, " ", p.last_name) fullname, p.mobile_number, p.email_address', FALSE)->from('profile p')->get()->result();

【讨论】:

@Madan 我倾向于同意 Bernhard 的观点——如果你仔细观察你的错误,你会注意到在 " 之前和 CONCAT 方法完成之后额外的 `。这似乎是问题所在。 @Madan 您的选择是使用 FALSE 或不使用 select 方法。【参考方案2】:

将您“选择”放在数组中 $this->db->select(array('CONCAT(p.first_name, " ", p.last_name) 全名, p.mobile_number, p.email_address'))

由。

【讨论】:

【参考方案3】:

对于使用活动记录进行更新的情况,您可以使用

$this->db->set("date_read", "NOW()", FALSE);

会输出类似这样的东西

`SET `date_read` = NOW(),

【讨论】:

@Goodluck,我知道FALSE 参数。我在没有FALSE 的情况下搜索,我也已经更新了答案。 FALSE 在这里需要,否则你不想被转义的东西会被转义。因此,请避免使用此注入“动态”(用户输入 = 不受信任)数据,因为 ($someFooPostData) 将导致 SQJ 注入攻击。 始终小心使用它。在这里,我使用 SQL 函数更新列的基于 Active-Record-Pattern 的方法确实适用于此。【参考方案4】: 已修复问题

在活动记录数组中添加字段名称可以解决此问题。在数组内部,您可以使用任何 mysql 函数。上面的修复。

MySQL 表:

fullname             mobile_number  email_address                 
-------------------  -------------  ------------------------------
sitaramaiah javvadi  9989403339     gnt.sitaramaiah@mstonline.in  
raja kumar guthula   9949526012     gnt.rajkumar@mstonline.in     
chandra sekhar k.l   9912144556     gnt.sekhar@mstonline.in       
khadar  basha        98884884584    khadar333332@gmail.com        
super administrator  9841866445     admin@gmail.com

CodeIgniter 活动记录:

$result = $this->db->select(array('CONCAT(p.first_name, " ", p.last_name) `fullname`', 'p.mobile_number', 'p.email_address'))->from('profile `p`')->get()->result();
echo '<pre>';
print_r($result);

输出:

Array
(
    [0] => stdClass Object
        (
            [fullname] => sitaramaiah javvadi
            [mobile_number] => 9989403339
            [email_address] => gnt.sitaramaiah@mstonline.in
        )

    [1] => stdClass Object
        (
            [fullname] => raja kumar guthula
            [mobile_number] => 9949526012
            [email_address] => gnt.rajkumar@mstonline.in
        )

    [2] => stdClass Object
        (
            [fullname] => chandra sekhar k.l
            [mobile_number] => 9912144556
            [email_address] => gnt.sekhar@mstonline.in
        )

    [3] => stdClass Object
        (
            [fullname] => khadar  basha
            [mobile_number] => 98884884584
            [email_address] => khadar333332@gmail.com
        )

    [4] => stdClass Object
        (
            [fullname] => super administrator
            [mobile_number] => 9841866445
            [email_address] => admin@gmail.com
        )

)

【讨论】:

以上是关于MySQL 函数和 CodeIgniter 活动记录的主要内容,如果未能解决你的问题,请参考以下文章

使用 CodeIgniter Active Record 函数将子句添加到不带引号的 MySQL 语句

Mysql查询转换为codeigniter活动记录

Codeigniter 活动记录从 mysql 获取记录,其中 id 等于数组中的记录

mysql codeigniter 活动记录 m:m 删除

Codeigniter 活动记录 - 插入点列

codeigniter 活动记录左连接