|
发表于 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;
} 复制代码 |
|