用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2880|回复: 6
收起左侧

[已解决] 新手求助

[复制链接]
发表于 2010-10-11 18:05:12 | 显示全部楼层 |阅读模式
请问:
$this->db->where();
函数有四种方法来设置 WHERE 子句,其中:
PHP复制代码
 
4.自定义字符串:
手动的编写子句:
 
$where = "name='Joe' AND status='boss' OR status='active'";
 
$this->db->where($where);
 
 
复制代码

但是在使用第四种方法时总会出现错误,报错时查看错误提示如下
SELECT `id` FROM (`fa_user`) WHERE `role='admin'` OR role='superadmin'
貌似引号的地方有错误,改成其他方法不会出现错误,求教!
注:下的最新版本。
发表于 2010-10-11 19:27:32 | 显示全部楼层
字段名称后至少留一个空格应该就可以了吧
$where = "name = 'Joe' AND status = 'boss' OR status = 'active'";
 楼主| 发表于 2010-10-12 08:31:20 | 显示全部楼层
回复 2# qi_ruo


    正解,多谢。请问是何缘故?php也是刚接触,是sql语句要求有空格还是ci的原因?
发表于 2010-10-12 17:18:41 | 显示全部楼层
本帖最后由 qi_ruo 于 2010-10-12 17:25 编辑

一般在sql语句中的表名和字段名上需要加上反引号(`)防止因为字段出现关键字而发生错误,
默认情况下$this->db->where() 会给表名和字段名自动加上反引号

codeIgniter中可以通过$this->db->last_query();查看最后一次查询语句

关于$this->db->where()函数的四种用法;

1 简单的 key/value 方法:
codeIgniter中$this->db->where()默认是给字段加上反引号的
比如$this->db->where('name','Joe')将生成 WHERE `name` = 'Joe'

2 自定义 key/value 方法:
codeIgniter是通过找key的第一个空格来找出字段名的,并给字段名加上反引号
所以 $this->db->where('name!=','Joe');这样写会变成 `name!=` 'Joe'引发错误
正确的写法应该是 $this->db->where('name !=','Joe');

3 关联数组方法:
也可以包含运算符,但同样需要在各个字段名后留下至少一个空格

4 自定义字符串:
这个貌似有点问题,codeIgniter依然是找第一个空格,然后把空格前的看成字段名,所以
$this->db->where("name = 'Joe' AND age = '23'");
转换为`name` = 'Joe' AND age = '23',
age字段名并没有加上反引号,所以不推荐这种写法,

如果一定要这种写法,可以自己手动加上反引号,比如
$this->db->where("`name` = 'Joe' AND `age` = '23'",NULL,FALSE);

第3个参数为FLASE时,系统不会为字段自动加反引号,这个时候字段名后的空格就不是必需的了,
所以你也可以$this->db->where("`name`='Joe' AND `age`='23'",NULL,FALSE);
但最好还是留个空格吧,又美观,又不容易引发错误,何乐而不为呢?
 楼主| 发表于 2010-10-13 14:46:55 | 显示全部楼层
回复 4# qi_ruo


    多谢赐教!很详细!
发表于 2010-10-13 15:01:38 | 显示全部楼层
连接查询怎么办?
这个东西能有用吗?
 楼主| 发表于 2010-10-14 16:27:23 | 显示全部楼层
回复 4# qi_ruo


    如果加上括号也可以解决问题,比如:

$this->db->where("(name='Joe' AND status='boss' OR status='active')");

本版积分规则