2013-01-17 31 views
1

我想知道爲什麼您可以在查詢執行之前和之後設置提取模式,並且結果仍然使用給定的提取模式...?PDO提取模式 - 查詢之前/之後

這意味着PDO從數據庫服務器中檢索查詢結果爲數字和關聯?嗯...

是否有可能只能檢索一個..?數字結果還是關聯結果?

這兩個例子返回同樣的結果。如果我離開setFetchMode出兩個數字和assoc命令結果打印

之前執行

$sth = $dbh->prepare("SELECT REFERENCED_TABLE_NAME table_name, REFERENCED_COLUMN_NAME column_name\n" 
    ."FROM KEY_COLUMN_USAGE\n" 
    ."WHERE REFERENCED_TABLE_NAME IS NOT NULL && REFERENCED_COLUMN_NAME IS NOT NULL\n" 
    ."GROUP BY REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME"); 
$sth->setFetchMode(PDO::FETCH_ASSOC); 
$sth->execute(); 

echo '<pre>'; 
foreach($sth as $row){ 
    print_r($row); 
} 
echo '</pre>'; 

執行後

$sth = $dbh->prepare("SELECT REFERENCED_TABLE_NAME table_name, REFERENCED_COLUMN_NAME column_name\n" 
    ."FROM KEY_COLUMN_USAGE\n" 
    ."WHERE REFERENCED_TABLE_NAME IS NOT NULL && REFERENCED_COLUMN_NAME IS NOT NULL\n" 
    ."GROUP BY REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME"); 
$sth->execute(); 
$sth->setFetchMode(PDO::FETCH_ASSOC); 

echo '<pre>'; 
foreach($sth as $row){ 
    print_r($row); 
} 
echo '</pre>'; 

回答

5

您的示例使用簡化:執行後,但在可以使用記錄之前,還需要獲取它們。這些是PDOStatement class中的fetch和fetchAll方法。

但是,在使用foreach構造時,您正在使用PDOStatement的Traversable接口,該接口在foreach循環的開始處調用fetchAll方法而不是您。

因此,在這兩個示例中,設置獲取模式後fetchAll被調用。

編輯:

這意味着,PDO檢索查詢結果既作爲數字和從DB服務器 assoc命令?嗯......

PDO不會從數據庫中以一種或兩種方式獲取記錄,它總是以相同的方式執行 - 不同之處在於它如何向您呈現結果。如果您指定提取模式,則PDO將爲您建立請求的結構。如果使用默認值,或者指定FETCH_BOTH,它會爲您創建兩種不同的表示形式,但是來自相同的結果集。這個參數在發送給SQL服務器的命令中不會有所不同。

+0

好的,所以我需要調用'$ row = $ sth-> fetch(PDO :: FETCH_ASSOC)'而不是? – clarkk

+0

取決於你想要的東西。 fetch只從服務器獲取一行,而不是全部 - 而foreach和fetchAll每行都會回退你。如果您擔心性能問題,那麼使用foreach和setFetchMode(執行前或執行後)不會更慢,因爲您在實際讀取之前設置了獲取模式 - PDO不會以任何方式爲您創建數值數組。 – Dutow

+0

謝謝..寫得很好的說明:) – clarkk

相關問題