2011-11-02 2 views
2

스크립트를 작성하면서 $ db-> prepare() 및 $ stmt-> bindParam()을 지속적으로 입력했습니다. 나는 그것을 모든 기능에 통합하는 방법을 찾고있다. 이것은 내가 지금까지 가지고있는 것이다.PDO를위한 쿼리 함수 생성 시도

$sql = "SELECT (name, email) FROM users WHERE VALUES (:name, :email)" 
$values = array(':name' => 'my_name', ':email' => '[email protected]',); 

    function db_query($sql, $values) { 
    global $db; //Database object 

     $stmt = $db->prepare($sql); 

     foreach($values as $placeholder => $value) { 
      $stmt->bindParam($placeholder, $value); 

     } 

     $stmt->execute(); 

     $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

     return $result; 
     } 

대부분의 쿼리에 충분합니까? 이 작업을 수행하는 안전한 방법입니까?

쿼리가 실행되고 반환되는 모든 항목 (NULL, 값, 오류 등)을 반환하기 만하면됩니다.

감사합니다.

+2

foreach 루프를'$ stmt-> execute ($ values);로 대체 할 수 없습니다. –

+0

작동하는 한 충분해야합니다. 가져 오기/삽입/삭제/업데이트 할 각 항목에 대한 몇 가지 테스트 사례를 작성하십시오. 나는 "질의"를 실제 질의로하는 경향이 있으며, IE fetchAll'' fetchOne'을 가져 오는 별도의 함수를 작성하지만, PDO 클래스를 내 자신의 래퍼로 확장하기 때문에 엉망이 될 필요가 없다. 글로벌 비즈니스. :) 그것이 충분하고 작동하는지 확인하는 가장 좋은 방법은 테스트하고 보는 것입니다. –

+0

+1 여기는 극히 드문 종류의 질문입니다. –

답변

0

bindParam()은 두 번째 인수에있는 참조 변수에 자리 표시 자 이름 (첫 번째 인수)을 바인딩하기 때문에 코드가 예상대로 작동하지 않습니다.

예제를 사용하면 모든 매개 변수가 루프의 마지막 $value이므로 [email protected]으로 설정됩니다.

의견에 언급 된대로 $stmt->execute($values)을 사용하면됩니다. http://php.net/manual/en/pdostatement.execute.php

루프를 계속 진행하려면 PDOStatement::bindValue()을 대신 사용하십시오.

+0

좋아, 고마워. $ result 변수는 SELECT, UPDATE, DELETE 등과 같은 쿼리가 반환하는 값을 반환한다는 의미에서 "correct"가됩니까? mysql 함수를 사용하여이 작업을 수행했습니다 : $ result = mysql_query ($ query); 도움 주셔서 감사합니다. – Brandon

+0

@Brandon 내 대답은 정보를 감안할 때, 나는이 래퍼 함수를 ​​전혀 만들지 않으려 고합니다. – Phil

+0

확인. 중복 PDO 코드 톤을 제거하는 "모범 사례"가 있습니까? 나는 실제로 Drupal의 db_query를 영감으로보고 있습니다. 내 코드의 많은 부분은 그냥 준비()와 execute()의 곳곳에 있습니다. 감사. – Brandon