2014-01-12 132 views
0

我有这个功能,如果我只有一个参数,它工作正常。 但是,如果我有多个我得到上述错误。SQLSTATE [42000]:语法错误或访问冲突:更新时为1064

version for the right syntax to use near 'usr_lastname','usr_login'='firstname','lastname' at line 1 in

public function updateById($id, $data) 
{ 
    #print_r($data); 
    foreach ($data as $field => $value){ 
     $fields[] = '`'.$field.'`'; 
     $targets[] = ':'.$field; 
     $values[] = $value; 
    } 

    $stmt = $this->db->prepare("UPDATE ".$this->table." SET ".join(',', $fields)."=".join(',', $targets)." WHERE id = $id"); 

    foreach ($targets as $pos => $target){ 
     switch (true){ 
      case is_int($values[$pos]) : $type = PDO::PARAM_INT; break; 
      case is_bool($values[$pos]) : $type = PDO::PARAM_BOOL; break; 
      case is_string($values[$pos]) : $type = PDO::PARAM_STR; break; 
      case is_null($values[$pos]) : $type = PDO::PARAM_NULL; break; 
      default : $type = PDO::PARAM_STR; break; 
     } 


     $stmt->bindValue($target, $values[$pos], $type); 
     print_r($stmt); 
    } 

    $stmt->execute(); 
    $json = array(
     'success' => true, 
     'result' => $value 
    ); 
    echo json_encode($json); 
} 

我不看任何 “” 错误。

任何建议我错了或失踪?

感谢您的帮助。

回答

0

你的问题是在这里:

SET ".join(',', $fields)."=".join(',', $targets)." 

语法UPDATE是这样的:

col1 = :col1, col2 = :col2, col3 = :col3 ... 

现在你的代码做这样的:

col1,col2,col3 = :col1, :col2, :col3 

所以如果你有只有1个参数它工作正常(col1 =:col1)

最简单的解决办法是改变你,例如准备$fields$targets方式:

foreach ($data as $field){ 
    $updateFields[] = '`'.$field.'` = '.':'.$field 
} 

那么你的SQL应该是这样的:

"UPDATE ".$this->table." SET ".join(',', $updateFields)." WHERE id = $id" 
+0

非常感谢马克! 这解决了我的问题,并缩短了更新查询中的代码! – ToTe

相关问题