php PDO遇到的坑

<?php
$dbConn = new PDO(
    "mysql:host=localhost;dbname=adtuu",'root','root',
    array(
        // 強制 PDO 獲取的表字段字符的大小寫轉換,或原樣使用列信息
        PDO::ATTR_CASE              => PDO::CASE_LOWER,
        // 執行出錯時拋出異常
        PDO::ATTR_ERRMODE           => PDO::ERRMODE_EXCEPTION,
        //  將返回的空字符串轉換爲 SQL 的 NULL
        PDO::ATTR_ORACLE_NULLS      => PDO::NULL_NATURAL,
        // 返回數據的時候不將數值轉換爲字符串
        PDO::ATTR_STRINGIFY_FETCHES => false,
        // 設置爲false禁止PDO模擬預處理語句,而使用真正的預處理語句,即有MySQL執行預處理語句
        PDO::ATTR_EMULATE_PREPARES  => false,
    ));

$sql = 'SELECT adtuu_uuid, adtuu_name FROM blog_adtuu WHERE adtuu_uuid = ? AND adtuu_name = ?';


$q = $dbConn->prepare($sql);
$id = 1;
$name = 'adtuu';

//$q->bindParam(1, $id);
//$q->bindParam(2, $name);

$i = 1;
foreach (array(1, 'adtuu') as &$bind) {
    $q->bindParam($i, $bind);
    $i++;
}

$result = $q->execute() ? $q->fetch(PDO::FETCH_ASSOC) : array();
$q->closeCursor();

var_dump($result);

//假設數據庫中存在有id爲1,name爲adtuu的數據
//你們以爲上面的查詢可以查出數據來嗎???

//答案固然是否認的,爲何呢?

//原來是bindParam中第二個參數要是引用值才行
//須要修改爲下面的
$i = 1;
foreach (array(1, 'adtuu') as &$bind) {
    $q->bindParam($i, $bind);
    $i++;
}

//注意&$bind

//固然還有更簡單的方法,就是拋開循環直接將參數傳入execute中
$result = $q->execute(array(1, "adtuu's")) ? $q->fetch(PDO::FETCH_ASSOC) : array();
相關文章
相關標籤/搜索