2012-11-14 56 views
0

這是通過Kevin Yank繁忙的PHP連接到MYSQL?

通常,當我們執行一個SELECT查詢,我們使用 的條件而循環或foreach循環來檢索結果中的每一行,一個 的 PHP & MySQL Novice to Ninja, 5th Edition的一部分在時間:

while ($row = $result->fetch()) foreach ($result as $row) 

當我們處理查詢這樣的結果,其實PHP檢索 EAC h循環請求數據庫中的數據,並在移動到下一行時將其丟棄 。這節省了PHP必須使用大量內存來同時保存所有結果行。

大部分是 的時候,我們開發者沒有必要知道PHP是採取這個巧妙的快捷方式。但是,在我們完成前一個查詢的所有 結果之前,我們都希望發送另一個 SQL查詢到MySQL服務器。

那是什麼'這個代碼是關於以 發生,如果我們不小心:我們剛剛運行SELECT查詢 索要屬於某個作者的所有笑話的列表, 和當我們處理該列表時,我們希望爲每個列表執行DELETE查詢 。問題是,據MySQL知道,它仍然是 忙給我們發送SELECT查詢的結果;我們不能只是 中斷它,並要求它開始運行DELETE!如果這樣做, 會導致我們的DELETE失敗並顯示錯誤。

那就是在使用fetchall 方法的用武之地。通過調用我們事先準備好的聲明 ($ S)這個方法,我們要求PHP檢索整個結果集的查詢 的並將它們存儲在一個PHP數組($結果):

我的問題是,爲什麼我可以執行MYSQL語句,而我有PDOStatementresult sets在我的PHP代碼中使用了一個或多個? 連我都delete在那些result sets

<?php 
    include_once $_SERVER["DOCUMENT_ROOT"] . '/DBconnection.inc.php'; 

     $pds1 = $dbi->query("SELECT name FROM tbl1"); 
     $row = $pds1->fetch(); 
     var_dump($row['name']); 

     $pds2 = $dbi->query("SELECT user FROM tbl2"); 
     $row = $pds2->fetch(); 
     var_dump($row['user']); 

     $row = $pds1->fetch(); 
     var_dump($row['name']); 

     $row = $pds2->fetch(); 
     var_dump($row['user']); 

     $pds3= $dbi->prepare("DELETE FROM tbl1;"); 
     $pds3->execute(); 

     $row = $pds1->fetch(); 
     var_dump($row['name']); 

     $row = $pds2->fetch(); 
     var_dump($row['user']); 



?> 

回答

1

被引用的所有行這是PDO的行爲將取決於你正在使用的數據庫和PDO驅動程序實現的區域。您可能能夠在獲取select語句的結果時執行新的查詢,即or you might not

一般情況下,使用PDO連接的最安全和最兼容的方式是:

  1. 執行SELECT語句
  2. 獲取所有你需要
  3. 關閉遊標(如行:與$pds1->closeCursor()
  4. 執行您的下一個查詢