add 与 addAll的区别
add操作生成的sql语句key与value一一对应,但是有时addAll生成的sql语句key与value不是一一对应的
原因
1.add生成sql 的类是Driver,在循环 data时, d a t a 时 , fields与$values保持一一对应关系
foreach ($data as $key=>$val){
if(is_array($val) && 'exp' == $val[0]){
$fields[] = $this->parseKey($key);
$values[] = $val[1];
}elseif(is_null($val)){
$fields[] = $this->parseKey($key);
$values[] = 'NULL';
}elseif(is_scalar($val)) { // 过滤非标量数据
$fields[] = $this->parseKey($key);
if(0===strpos($val,':') && in_array($val,array_keys($this->bind))){
$values[] = $this->parseValue($val);
}else{
$name = count($this->bind);
$values[] = ':'.$name;
$this->bindParam($name,$val);
}
}
2.addAll生成sql 的类是Mysql,先生成
fields在循环
f
i
e
l
d
s
在
循
环
data,这是当$val
非法时,就会丢失value,导致不匹配
$fields = array_map(array($this,'parseKey'),array_keys($dataSet[0])); //先生成$fields数组
foreach ($dataSet as $data){
$value = array();
foreach ($data as $key=>$val){
if(is_array($val) && 'exp' == $val[0]){
$value[] = $val[1];
}elseif(is_scalar($val) || is_null($val)){
if(0===strpos($val,':') && in_array($val,array_keys($this->bind))){
$value[] = $this->parseValue($val);
}else{
$name = count($this->bind);
$value[] = ':'.$name;
$this->bindParam($name,$val);
}
}
}
$values[] = '('.implode(',', $value).')';
}