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

[数据库] 数据库批量更新问题

[复制链接]
发表于 2012-12-20 19:49:26 | 显示全部楼层 |阅读模式
$this->db->update_batch会导致下面这个问题啊
————————————————————
A PHP Error was encountered
Severity: Notice
Message: Array to string conversion
Filename: database/DB_active_rec.php
Line Number: 1407
—————————————————————
有谁碰到过没,这应该是个BUG吧
发表于 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的弱类型,我们其实不关心这些了。总之,可以将其作为合法字符串。)

拿官方的例子来说,
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 在一次循环中,就可以是
PHP复制代码
 array(
      'title' => 'Another title' ,
      'name' => 'Another Name 2' ,
      'date' => 'Another date 2'
   )
复制代码

,而 $k2 => $v2 就可以是  'title' => 'Another title' ,而源码作者想保存下来的$not 数组,最终应该是
PHP复制代码
array(
       0 =>'title-Another title' ,
       1 => 'name-Another Name 2' ,
       2 => 'date-Another date 2'
   )
复制代码


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


      
PHP复制代码
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
[b]$not[] = $k2.'-'.$v2;[/b]//我修改源码后得到的内容
                                }
 
                                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
我也遇到了这个问题,我仔细研究了源码,首先,同意楼上“游走的鱼”的说法,$not在代码中最后没有用到。但 ...

我也认为是这边代码有误
发表于 2013-5-20 09:11:09 | 显示全部楼层
这不是Bug,是你程序问题

本版积分规则