2014-03-12 6 views
0

변수를 반복적으로 바인딩하는 함수를 만들려고합니다. 이것은 내가 지금까지 무엇을 가지고 :PDO - 반복 바인딩 변수

function prepareQuery($db, $query, $args) { 
    // Returns a prepared statement 
    $stmt = $db->prepare($query); 
    foreach ($args as $arg => $value) { 
     $stmt->bindParam($arg, $value); 
     } 
    return $stmt; 
    } 

이것은 내가 그것을 사용하고 방법은 다음과 같습니다

$stmt = prepareQuery($db, "SELECT * FROM `Licenses` WHERE `verCode`=:verCode", Array(":verCode" => $verCode)); 
$verCode = "some_string"; 
$stmt->execute(); 
while ($info = $stmt->fetch()) { 
    print_r($info); 
    } 

은 아무것도 인쇄되지 않지만. 나는 데이터베이스 항목이 존재하며 PHPMyAdmin에서 동일한 쿼리가 작동한다는 것을 알고 있습니다. 그래서, 필자는 함수가 바인딩을 생성하는 방법에 문제가 있다고 생각합니다. 이 문제를 어떻게 해결할 수 있습니까? 감사!

+2

가 왜 그냥'execute'를 사용하고 매개 변수를 전달을? – bitWorking

+0

@bitWorking, 저는 PDO를 사용하는 사람들의 90 %가 bindParam()을 사용해야한다고 생각하기 때문에 같은 것을 궁금해합니다. 필자는 [PDOStatement :: execute()] (http://us1.php.net/manual/en/pdostatement.execute.php) 문서에서 bindParam() 메서드가 먼저 설명되고 pass- array-to-execute() 메소드가 두 번째로 설명됩니다. 만약 더 많은 사람들이 먼저 문서화 되었다면 execute() 메소드를 배우게 될까? –

+1

아마도 $ verCode **에 값을 주어야합니다. ** 사용하기 전에 ... – Olvathar

답변

1
  1. 변수를 반복적으로 바인딩하는 함수를 만들지 마십시오. 그것은 아무것도 인쇄되지 않으면 PDO는 다음 아무것도 찾지 못했습니다, 그것을 이미

    function prepareQuery($db, $query, $args) { 
        $stmt = $db->prepare($query); 
        $stmt->execute($args); 
        return $stmt; 
    } 
    
  2. 을 할 수 있습니다. 저것과 같이 쉬운.

  3. 실제로이 준비 쿼리 기능이 필요하지 않습니다. 그냥이

    class myPDOStatement extends PDOStatement 
    { 
        function execute($data = array()) 
        { 
         parent::execute($data); 
         return $this; 
        } 
    } 
    
    $user = 'root'; 
    $pass = ''; 
    $dsn = 'mysql:charset=utf8;dbname=test;host=localhost'; 
    $opt = array(
        PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
        PDO::ATTR_EMULATE_PREPARES => TRUE, 
        PDO::ATTR_STATEMENT_CLASS => array('myPDOStatement'), 
    ); 
    $pdo = new PDO($dsn, $user, $pass, $opt); 
    

처럼 아주 작은 PDO을 개정하고는 깔끔한 체인 쓸 수 있습니다 :

$sql = "SELECT * FROM `Licenses` WHERE `verCode`=:verCode"; 
$code = "some_string"; 
$data = $pdo->prepare($sql)->execute([$code])->fetchAll(); 
foreach ($data as $info) { 
    print_r($info); 
} 
+0

PHPMyAdmin에서 쿼리를 직접 실행했기 때문에 행이 있다는 사실을 알고 있습니다. –

+0

음, 그 오류를 일으키는 바보 같은 실수는 발견하지 못했지만, 내가 작성한 코드는 그것에 대한 증거입니다 –

+0

'parent :: execute ($ data);'가 아니어야합니까? – bitWorking