2009-10-22 3 views
2

Zend_Db_Table->update() 메서드를 사용하여 데이터로 테이블을 업데이트하려면 "where"절에서 바인드 변수를 사용할 수 없습니다.Zend_Db_Table-> update() with where 절에서 바인드 변수를 사용하는 방법

방법 서명은 다음과 같습니다

int update($data, array|string $where) 

보통이 같은 방법을 호출합니다 :

$table = new Bugs(); 

$data = array(
    'updated_on'  => '2007-03-23', 
    'bug_status'  => 'FIXED' 
); 

$where = $table->getAdapter()->quoteInto('bug_id = ?', 1234); 

$table->update($data, $where); 

quoteInto

단지 그것을 결합하지, 변수를 탈출하는 것입니다.

바인드 변수를 사용하는 방법이 필요합니다. 그렇지 않으면 DBMS가이 쿼리를 효과적으로 캐시하지 않습니다.

나는 뭔가를 놓치고 있습니까, 아니면 젠드의 부분을 감독하고 있습니까?

답변

4

데이터 만 업데이트하면 RDBMS (MySQL은 추측)가 UPDATE 쿼리를 캐시하지 않습니다. (? 보안 성능) :

$db = Zend_Db_Table_Abstract::getDefaultAdapter(); 
$stmt = $db->prepare("UPDATE table SET key = :key, value = :value"); 

foreach ($data as $key=>$value) { 
    $stmt->bindParam('key', $key); 
    $stmt->bindParam('value', $value); 
    $stmt->execute(); 
} 

하지만 일괄 UPDATE 쿼리의 수백만을 가지고하지 않는 한 당신이 귀찮게한다고 생각하지 않습니다 당신은 여전히 ​​바인드 변수를 사용하려면, 당신은 준비된 문을 사용해야합니다 이걸로. $ table-> update ($ data, $ where)를 사용하십시오.

+0

감사합니다. 필자는 내부 기업용 애플리케이션에서 Oracle을 사용하고 있습니다. 당신은 정확합니다. 성능은 그런 문제가 아닙니다. 가능하면 모범 사례를 따르기를 원하기 때문에이 질문을 던졌습니다. Zend_Db_Table을 사용하여이 제한을 제안하거나 수락 할 때 코드를 다시 작성할 수 있습니다. 바인딩되지 않은 WHERE 절이기 때문에 disapointing입니다. SET 절은 바인딩 된 변수를 사용합니다. 쿼리의 모든 부분에 대해 바운드 변수를 사용하는 방법을 제공한다고 생각할 것입니다. – asgeo1

관련 문제