【问题标题】:MySQL Function and CodeIgniter Active RecordMySQL 函数和 CodeIgniter 活动记录
【发布时间】: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 函数?希望我清楚。提前致谢。

【问题讨论】:

标签: mysql codeigniter activerecord php


【解决方案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
            )
    
    )
    

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2013-06-15
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多