2014-04-23 80 views
0

我試圖用PHP實現分頁。我發現調用exec到連接的數據庫會阻止進一步的查詢調用。 手頭的一段代碼:PDO :: exec()阻止進一步查詢

<?php 
    // Pagination logic 
    //Here we count the number of results 
    $query = "SELECT COUNT(*) as num FROM gig"; 
    $total_pages = $db->exec($query); 
    $total_pages = $total_pages[num]; 
?> 

它之後,如果我嘗試使用查詢如:

<?php> 
foreach ($db->query("SELECT sname, start, venue FROM gig WHERE start = '0000-00-00 00:00:00'") as $a) { 
    $row="<tr><td>$a[sname]</td><td>To be announced</td><td>$a[venue]</td></tr>\n"; 
    print $row; 
} 
?> 

它返回

警告:提供的foreach無效的參數( )

只要第一個代碼塊被刪除,查詢工作很好。當我檢查$ total_pages的值時,它的值爲0,所以一路上一定有問題。據我所知,我以與查詢相同的方式使用它(它自己工作),所以有什麼理由不起作用?

的PDO被初始化以下列方式:

try { 
    $db = new PDO("mysql:dbname=$db_name;host=$db_server", $db_user, $db_pw); 
} catch (PDOException $e) { 
    die('Connection failed: ' . $e->getMessage()); 
} 

session_start(); 

回答

0

使用語句對象的功能,使用查詢計數行而不是Exec之後有:

$dbq = $db->query("SELECT * FROM gig"); 
$rows = $dbq->rowCount(); 

關於後者的代碼塊不會因爲EXEC失敗的工作 - 它似乎只是php查詢的工作方式,如果失敗,都會失敗。 foreach()錯誤是因爲它提供的對象不是數組,因爲它失敗了。

0

Manual

PDO :: EXEC()不從SELECT語句返回結果。對於 SELECT語句,您只需在程序中發出一次, 考慮發出PDO :: query()。對於需要多次發出 的語句,請使用PDO :: prepare()準備PDOStatement對象,並使用PDOStatement :: execute()發出語句 。

+0

我已經讀過,但假設我可以使用,因爲我不需要從select語句返回任何結果。將其替換爲查詢STATEMENT對象的調用,而不是使其工作。 – insideClaw