游走的鱼 发表于 2012-12-20 19:49:26

数据库批量更新问题

$this->db->update_batch会导致下面这个问题啊
————————————————————
A PHP Error was encounteredSeverity: Notice
Message: Array to string conversion
Filename: database/DB_active_rec.php
Line Number: 1407
—————————————————————
有谁碰到过没,这应该是个BUG吧

seedo 发表于 2012-12-21 01:01:05

Message: Array to string conversion
你是不是把只能接受字符串的字段弄成数组了?
你发下你传递的值吧。

游走的鱼 发表于 2012-12-21 12:32:30

Filename: database/DB_active_rec.php
Line Number: 1407
$not[] = $k.'-'.$v;
$v就是个数组
而且$not 这个变量在这个函数中 根本就没用到。。

子木小乔 发表于 2013-3-28 16:50:39

我也遇到了这个问题,我仔细研究了源码,首先,同意楼上“游走的鱼”的说法,$not在代码中最后没有用到。但是我认为,源码作者的意图可能是这样子的。
1、$not[] 数组回收了(ci中认为的)传入参数中格式错误的内容,但是它仅仅是回收了该“错误”,并没有进行后续处理。
2、按照ci官方手册 http://codeigniter.org.cn/user_guide/database/active_record.html 的说明,传入的参数$key 应该最多是哥二维数组,那么也就是说,当执行到 foreach ($v as $k2 => $v2) { } 时,$vj就是最底层的真实数据,$k2 和 $v2 这个时候已经是字符串了,当然也可能是整形之类的。(PHP的弱类型,我们其实不关心这些了。总之,可以将其作为合法字符串。)

拿官方的例子来说,
$data = array(
   array(
      'title' => 'My title' ,
      'name' => 'My Name 2' ,
      'date' => 'My date 2'
   ),
   array(
      'title' => 'Another title' ,
      'name' => 'Another Name 2' ,
      'date' => 'Another date 2'
   )
);

$this->db->update_batch('mytable', $data, 'title');

这里边,其实 $v 在一次循环中,就可以是
array(
      'title' => 'Another title' ,
      'name' => 'Another Name 2' ,
      'date' => 'Another date 2'
   )
,而 $k2 => $v2 就可以是'title' => 'Another title' ,而源码作者想保存下来的$not 数组,最终应该是
array(
       0 =>'title-Another title' ,
       1 => 'name-Another Name 2' ,
       2 => 'date-Another date 2'
   )

3、$not[] = $k.'-'.$v; 我认为是源码作者的错误,应该改为 $not[] = $k2.'-'.$v2;


      public function set_update_batch($key, $index = '', $escape = TRUE)
        {
                $key = $this->_object_to_array_batch($key);

                if ( ! is_array($key))
                {
                        // @todo error
                }

                foreach ($key as $k => $v)
                {
                        $index_set = FALSE;
                        $clean = array();

                        foreach ($v as $k2 => $v2)
                        {
                                if ($k2 == $index)
                                {
                                        $index_set = TRUE;
                                }
                                else
                                {
                  
//                                        $not[] = $k.'-'.$v;//ci源代码中是这一句,denniszhu认为它本身就有误,应该是 $not[] = $k2.'-'.$v2
$not[] = $k2.'-'.$v2;//我修改源码后得到的内容
                                }

                                if ($escape === FALSE)
                                {
                                        $clean[$this->_protect_identifiers($k2)] = $v2;
                                }
                                else
                                {
                                        $clean[$this->_protect_identifiers($k2)] = $this->escape($v2);
                                }
                        }

                        if ($index_set == FALSE)
                        {
                                return $this->display_error('db_batch_missing_index');
                        }

                        $this->ar_set[] = $clean;
                }

                return $this;
        }

我是我 发表于 2013-5-18 21:01:43

子木小乔 发表于 2013-3-28 16:50 static/image/common/back.gif
我也遇到了这个问题,我仔细研究了源码,首先,同意楼上“游走的鱼”的说法,$not在代码中最后没有用到。但 ...

我也认为是这边代码有误

muction 发表于 2013-5-20 09:11:09

这不是Bug,是你程序问题
页: [1]
查看完整版本: 数据库批量更新问题