2014-11-02 3 views
0

내 값을 업데이트하려고하면 다음 오류가 발생합니다. SQLSTATE [HY093] : 잘못된 매개 변수 번호 : 매개 변수가 정의되지 않았습니다. 예 : (hello)와 같이 특수 문자가있는 경우에만 사용 () 특수 문자로 값을 찾을 수없고 을 삽입하고 데이터베이스에서 업데이트하거나 제거 할 수 없습니다 .pdo의 특수 문자

그리고 데이터베이스는 이미 utf8에 설정되어 있습니다.

public function update($data, $key, $value) { 
    try { 

     $this->query = 'UPDATE ' . $this->table . ' SET '; 

     array_walk($data, function($index, $key) { 
      $this->query .= $key . ' = ' . ':' . $key . ', '; 
     }); 

     $this->query = rtrim($this->query, " ,"); 

     $this->query .= " WHERE $key = :$value"; 

     $stmt = $this->db->prepare($this->query); 

     $stmt->execute(array_merge($data, array($value => $value))); 

     return true; 

    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
} 

예 나는 그것을 사용하는 방법 :

배열 업데이트 할 수있는 키와 새로운 가치를 부여하는 것입니다
if(isset($oldValue, $newValue)) { 
$data['database']->update(array("name" => $newValue), "name", $oldValue); 
} 

쉼표 테이블 '이름'의 값을 검색 후 .

누군가이 솔루션을 알고 있다면 나는 매우 행복 할 것입니다. 미리 감사드립니다.

+0

'update '를 어떻게 호출하는지 예를 들려 줄 수 있습니까? – icktoofay

+0

': $ value'에서'$ '기호를 제거해야합니다. 또한 말하기는 어렵지만'key'라는 단어를 사용하면'-key'는 MySQL 예약어입니다. * 통찰력. * –

+0

@icktoofay 위의 게시물을 참조하십시오. 내가 편집했습니다. – user3139504

답변

0

부분적으로는입니다. 괜찮습니다. 그러나 을 완전히으로 매개 변수화해야합니다. 좀 더 명쾌하게 설명하기 위해 update(array("occupation" => "poet"), "name", "Horace")$this->table으로 설정하고 "persons"으로 설정한다고 가정 해 보겠습니다.

UPDATE persons SET occupation = :occupation WHERE name = : Horace 

우리는 이들 매개 변수 값으로 실행 것 : 우리는이 SQL 구성 할 것

occupation => poet 
:Horace => Horace 

occupation = :occupation 부분은 우수하고 정확한입니다; 그러나 name = : Horace:Horace => Horace은 잘못되었습니다.

UPDATE persons SET occupation = :occupation WHERE name = :name 

그리고이 매개 변수 값 : 혹시 당신이 update(array("occupation" => "unemployed"), "occupation", "poet")처럼 부르는 경우가있는 경우

occupation => poet 
name => Horace 

것은, 그러나, 당신은 몇 가지 문제가있을 수 있습니다 대신 아마이 같은 쿼리를 구성해야 occupation (이전 하나, 새 하나)에 대해 두 개의 다른 매개 변수가 필요하므로 둘 다 occupation을 호출해야합니다. 사람은 다른 사람보다 우승하고 당신의 UPDATE는 아무 것도하지 않을 것입니다. 그래서 당신은 그 사건을 다루어야 만합니다. 그렇지 않으면, 그것은 꽤 간단해야합니다.