2014-01-12 2 views
0

이 함수가 있는데 하나의 매개 변수 만있는 경우 제대로 작동합니다. 하지만 둘 이상의 경우 위의 오류가 발생합니다.SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 업데이트시 1064

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); 
} 

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

나는 어떤 ","오류가 표시하지는.

어떤 제안이 잘못되었거나 누락 되었습니까?

도움 주셔서 감사합니다.

답변

0

귀하의 문제가 여기에 있습니다 : UPDATE에 대한

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

구문은 다음과 같이이다 : 대한

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

관련 문제