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

[版本 2.x] CI 数据库Active Record 类使用,让我很想不明白的几个问题

[复制链接]
发表于 2014-5-19 23:45:04 | 显示全部楼层 |阅读模式
ci使用的是最新官网下载的2.1.4版本
下面是我在modles目录下文件中的三个操作数据库的函数
PHP复制代码
function add_user($openID,$mac='')
        {
                $data = array('user_openid' => $openID,'user_mac' => $mac,'reg_time' => date("Y-m-d H:i:s"),);
                $status = $this->user_status($openID);
                if('ok'==$status){//mac 和openId都有说明可能是换手机了,需要重新绑定
                        $this->db->update('tb_weixin_user', array('user_mac' => $mac), array('user_openid' => $openID));
                }else if('no_mac'==$status){//关注后没有mac,这次是认证添加,只更新mac地址
                        $this->db->update('tb_weixin_user', array('user_mac' => $mac), array('user_openid' => $openID));                
                }else if('no_user'==$status){
                        $this->db->insert('tb_weixin_user', $data);
                }
        }
        function user_status($openid)
        {
                $query=$this->db->get_where('tb_weixin_user', array('user_openid' => $openid));
                $ret='';
                if($query->num_rows()>0)
                {
                        foreach($query->result() as $row)
                        {
                                if($row->user_mac ==''){
                                        $ret='no_mac';
                                }else{
                                        $ret='ok';
                                }
                        }
                }else{
                        $ret='no_user';
                }
                return $ret;
        }
        function del_user($oepnID)
        {
                $data = array('user_openid' => $oepnID);//比较要加上引号,
                $this->db->delete('tb_weixin_user', $data);
        }
//这是我在controllers中写的测试函数并通过浏览器测试可以通过
        //调用时按下面方式调用多数时候都测试通过
        public function is_auth($mac)
        {
                $this->load->model('weixin_user');
                echo $this->weixin_user->is_auth($mac);
        }
        public function del_user($openID)
        {
                $this->load->model('weixin_user');
                $this->weixin_user->del_user($openID);
                echo $this->db->last_query();
        }
        public function add_user($openID)
        {
                $this->load->model('weixin_user');
                $this->weixin_user->add_user($openID);
                echo $this->db->last_query();
        }
 
复制代码

下面是我在浏览器中测试有时会出现下面问题,del的时候会丢掉两个字符


下面还有更让我想不明白的
我在这个 那三个测试函数的文件中添加一个函数
用下面两中方法调用都失败

PHP复制代码
//提示如下错误
//Query error: Unknown column 'oaw3DjtjpjnvQPXDJAepJjpM138k' in 'where clause'  而且这里和传进去的还少两个字符
//oaw3DjtjpjnvQPXDJAepJjpM138k是微信关注后的openID
//但是通过浏览器传参调用时没有这个错误
$this->db->where('uid',$id);
$this->db->delete('user');
//即使写成上面这种也还是报Query error: Unknown column 错误。
复制代码


求大哥指导一二,万分感谢
 楼主| 发表于 2014-5-19 23:50:20 | 显示全部楼层
下面是我在浏览器中测试有时会出现下面问题,del的时候会丢掉两个字符


用下面两中方法调用都失败
发表于 2014-5-20 08:26:57 | 显示全部楼层
这个没遇到过
试着判断下是哪一步截取了字符串
AR模型只做安全性处理和负责组装sql
 楼主| 发表于 2014-5-20 11:26:27 | 显示全部楼层
一叶扁舟 发表于 2014-5-20 08:26
这个没遇到过
试着判断下是哪一步截取了字符串
AR模型只做安全性处理和负责组装sql ...

标准插入(insert)$sql = "INSERT INTO mytable (title, name)
        VALUES (".$this->db->escape($title).", ".$this->db->escape($name).")";

$this->db->query($sql);

echo $this->db->affected_rows();按照手册里这个写也是报哪个错,应该是escape函数有问题直接用sql语句插入是没有问题的function add_user($openID,$mac=''){       $sql = "INSERT INTO tb_weixin_user (user_openid, user_mac, reg_time) VALUES ('".$openID."', '".$mac."','".date("Y-m-d H:i:s")."')";        $this->db->query($sql);} 本想着简单方便,结果被它搞死了,一个简单的插入语句都不行,浪费我三五天时间,第一次用php,突然觉得ci和php很烂,这次用完估计再也不会用了
发表于 2014-5-20 13:48:37 | 显示全部楼层
这个,你的问题诡异了点,你可以用这种url看看 index.php/weixin/add_user/?openid=xxxxx,微信我没搞过,不知道query string方式行不行。调用错误的问题,看样子是把openid的值当成字段了,条件你可能携程了array(openid,value)而不是array(openid=>value),代码不完整看不太出来。

我用ci做了很多东西了,也没见出现这些问题啊,一般的网站,一般的webservice都做过,都挺正常的啊
发表于 2014-5-20 16:10:37 | 显示全部楼层
www2t 发表于 2014-5-20 11:26
标准插入(insert)$sql = "INSERT INTO mytable (title, name)
        VALUES (".$this->db->escape($ti ...

你用的哪个数据库驱动
在对应的数据库/driver里看看escape_str()是怎么处理字符串的
发表于 2014-5-20 20:39:39 | 显示全部楼层
首先不要使用 URI 分段的形式传递这么复杂的参数,请使用 GET 传参。
 楼主| 发表于 2014-5-21 20:51:06 | 显示全部楼层
sunboat 发表于 2014-5-20 13:48
这个,你的问题诡异了点,你可以用这种url看看 index.php/weixin/add_user/?openid=xxxxx,微信我没搞过, ...

手册是这么写,这样也不行,本来图个方便快捷,结果还被搞到里面了
标准插入(insert)$sql = "INSERT INTO mytable (title, name)
        VALUES (".$this->db->escape($title).", ".$this->db->escape($name).")";

直接写sql语句就是正常的
$sql = "INSERT INTO tb_weixin_user (user_openid, user_mac, reg_time) VALUES ('".$openID."', '".$mac."','".date("Y-m-d H:i:s")."')";
发表于 2014-5-22 09:06:41 | 显示全部楼层
...$this->db->insert($tablename,array());这样 就可以了。。。

本版积分规则