MySQL 函数和 CodeIgniter 活动记录
Posted
技术标签:
【中文标题】MySQL 函数和 CodeIgniter 活动记录【英文标题】:MySQL Function and CodeIgniter Active Record 【发布时间】:2011-10-22 23:46:43 【问题描述】:CodeIgniter Active Record 简单、文档齐全且功能强大。但是当我尝试插入 mysql 内置函数 CONCAT
、NOW
、GROUP_CONCAT
、DATEDIFF
、TRIM
等或我的自定义函数时,它会出错。以下代码可以正常工作...
$result = $this->db->select('p.first_name, p.last_name, p.mobile_number, p.email_address')->from('profile p')->get()->result();
但是当我想联系first_name
和last_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 语句