欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

CodeIgniter php sql

程序员文章站 2024-01-09 18:07:16
...
CI对数据库句的操作有时很方便有时却让人为难,例如括号的问题。括号的问题来自于处理and和or的优先级关系。

有时需要or高于and。$this->db->where()和$this->db->orwhere()要如何做到呢。

第一种:自己写sql语句。可是有时候已经写好的程序要这样改动很难。

第二种:自己写where语句,有可能会遇到这样的问题。

where()和orwhere()其实是雷同的函数。

手册中有这样一段:

$this->db->where();

本函数允许你使用四种方法中的一种来设置 WHERE 子句:

说明: 传递给本函数的所有值都会被自动转义,以便生成安全的查询。

简单的 key/value 方法: $this->db->where('name', $name);

// 生成: WHERE name = 'Joe'

请注意等号已经为你添加。

如果你多次调用本函数,那么这些条件会被 AND 连接起来:

$this->db->where('name', $name);
$this->db->where('title', $title);
$this->db->where('status', $status);

// WHERE name = 'Joe' AND title = 'boss' AND status = 'active' 自定义 key/value 方法:

你可以在第一个参数中包含一个运算符,以便控制比较:

$this->db->where('name !=', $name);
$this->db->where('id
// 生成: WHERE name != 'Joe' AND id $name, 'title' => $title, 'status' => $status);

$this->db->where($array);

// 生成: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'

使用这个方法时你也可以包含运算符:

$array = array('name !=' => $name, 'id $id, 'date >' => $date);

$this->db->where($array); 自定义字符串:

你可以手动的编写子句:

$where = "name='Joe' AND status='boss' OR status='active'";

$this->db->where($where);

$this->db->where() 接受可选的第三个参数。如果你将它设置为 FALSE, CodeIgniter 将不会为你那些包含反勾号的字段名或表名提供保护。

$this->db->where('MATCH (field) AGAINST ("value")', NULL, FALSE);

标红的地方很重要,第4所说的:

$where = "name='Joe' AND status='boss' OR status='active'";

$this->db->where($where);

其实是行不通的。where()会给语句加上``,然后说:

"`name='Joe' AND status='boss' OR status='active'`"sql语句有错。

第三种:

改源代码:

CI论坛里有这样一段:

... ...

给like数组加上括号即可。
修改system\database\DB_active_rec.php
约第1559行

PHP

if ( count ( $this -> ar_like ) > 0 )
{
if ( count ( $this -> ar_where ) > 0 )
{
$sql .= "nAND " ;
}

$sql .= implode ( "n" , $this -> ar_like ) ;

}


改为

PHP

if ( count ( $this -> ar_like ) > 0 )
{
if ( count ( $this -> ar_where ) > 0 )
{
$sql .= "nAND (" ;
}

$sql .= implode ( "n" , $this -> ar_like ) ;

if ( count ( $this -> ar_where ) > 0 )
{
$sql .= ")" ;
}
}


希望CI开发者尽快修补or_like无法内部形成括号的BUG
这个论坛很脑残,显示回车符\n会掉一个斜杠,懂PHP的自己加上。

源自:http://codeigniter.org.cn/forums/thread-1270-1-1.html

同理,可以对where修改,但是这种只是对where语句的开始和末尾加。

对于实际的需要,几种合起来用基本情况都能解决了。不知道是不是还有更好的。呵呵,那应该就是直接修复CI源代码内部形成括号的BUG了吧