www2t 发表于 2014-5-19 23:45:04

CI 数据库Active Record 类使用,让我很想不明白的几个问题

ci使用的是最新官网下载的2.1.4版本
下面是我在modles目录下文件中的三个操作数据库的函数
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的时候会丢掉两个字符
http://codeigniter.org.cn/forums/data/attachment/album/201405/19/233037dq444z44a9czuqha.jpg
http://codeigniter.org.cn/forums/data/attachment/album/201405/19/233036xz9vb7luvtl9r4mr.jpg
下面还有更让我想不明白的
我在这个 那三个测试函数的文件中添加一个函数
用下面两中方法调用都失败
http://codeigniter.org.cn/forums/data/attachment/album/201405/19/233809lgg7e1grv7r1okvv.jpg
//提示如下错误
//Query error: Unknown column 'oaw3DjtjpjnvQPXDJAepJjpM138k' in 'where clause'而且这里和传进去的还少两个字符
//oaw3DjtjpjnvQPXDJAepJjpM138k是微信关注后的openID
//但是通过浏览器传参调用时没有这个错误
$this->db->where('uid',$id);
$this->db->delete('user');
//即使写成上面这种也还是报Query error: Unknown column 错误。

求大哥指导一二,万分感谢

www2t 发表于 2014-5-19 23:50:20

下面是我在浏览器中测试有时会出现下面问题,del的时候会丢掉两个字符
http://codeigniter.org.cn/forums/data/attachment/album/201405/19/233037dq444z44a9czuqha.jpg
http://codeigniter.org.cn/forums/data/attachment/album/201405/19/233036xz9vb7luvtl9r4mr.jpg
用下面两中方法调用都失败
http://codeigniter.org.cn/forums/data/attachment/album/201405/19/233809lgg7e1grv7r1okvv.jpg

一叶扁舟 发表于 2014-5-20 08:26:57

这个没遇到过
试着判断下是哪一步截取了字符串
AR模型只做安全性处理和负责组装sql

www2t 发表于 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很烂,这次用完估计再也不会用了

sunboat 发表于 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()是怎么处理字符串的

Hex 发表于 2014-5-20 20:39:39

首先不要使用 URI 分段的形式传递这么复杂的参数,请使用 GET 传参。

www2t 发表于 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")."')";

ljc 发表于 2014-5-22 09:06:41

...$this->db->insert($tablename,array());这样 就可以了。。。
页: [1]
查看完整版本: CI 数据库Active Record 类使用,让我很想不明白的几个问题