当前位置:Gxlcms > PHP教程 > CodeIgniterphpsql

CodeIgniterphpsql

时间:2021-07-01 10:21:17 帮助过:4人阅读

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 <', $id);

// 生成: WHERE name != 'Joe' AND id < 45 关联数组方法: $array = array('name' => $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了吧

人气教程排行