2014-03-12 93 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

@bit工作中,我經常想知道同樣的事情,因爲90%的人使用PDO似乎認爲他們需要使用bindParam()。我注意到在[PDOStatement :: execute()]文檔(http://us1.php.net/manual/en/pdostatement.execute.php)中,首先描述了bindParam()方法,其次介紹了array-to-execute()方法。我想知道是否有更多的人學習execute()方法,如果它首先被記錄的話? –

+1

也許你應該給$ verCode ** BEFORE **使用它的值... – Olvathar

回答

1
  1. 不要創建迭代綁定變量的函數。 PDO可以做到這一點

    function prepareQuery($db, $query, $args) { 
        $stmt = $db->prepare($query); 
        $stmt->execute($args); 
        return $stmt; 
    } 
    
  2. 如果它不打印任何東西,那麼它沒有找到任何東西。就如此容易。

  3. 實際上你甚至不需要這個準備查詢功能。只需修改PDO很少像這樣

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

,你就可以寫這樣一個整潔的鏈條:

$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