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

转载于:https://www.cnblogs.com/lynn995/archive/2010/07/27/1786215.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值