CodeIgniter php sql

CI对数据库句的操作有时很方便有时却让人为难,例如括号的问题。括号的问题来自于处理and和or的优先级关系。

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

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

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

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

手册中有这样一段:

 

$this->db->where();

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

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

  1. 简单的 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'
  2. 自定义 key/value 方法:

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

    $this->db->where('name !=', $name);
    $this->db->where('id <', $id);

    // 生成: WHERE name != 'Joe' AND id < 45
  3. 关联数组方法: $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);
  4. 自定义字符串:

    你可以手动的编写子句:

    $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了吧

posted @ 2010-07-27 17:41  lynn995  阅读(1713)  评论(1编辑  收藏  举报