2014-03-27 93 views
0

我有如下代碼:嵌套的PDO查詢失敗?

$sql = $pdo->query("SELECT pageid FROM webpages WHERE ISNULL(deleted) ORDER BY sortindex"); 
while ($row = $sql->fetch(PDO::FETCH_ASSOC)) { 
    switch ($row["pageid"]) { 
    case "information": 
    Write(" <li class='top'><a href='index.php?m=info' id='info' class='top_link'><span class='down'>Information</span></a>"); 
    Write(" <ul class='sub'>"); 
    Write("  <li><a href='index.php?m=info&submode=n'>News</a></li>"); 
    Write("  <li><a href='index.php?m=info&submode=e'>Events</a></li>"); 
    Write("  <li><a href='index.php?m=info&submode=m'>Minutes</a></li>"); 
    $subsql = $pdo->query("SELECT * FROM categories WHERE visible = 1 ORDER BY sortindex,category"); 
    while ($catrow = $subsql->fetch(PDO::FETCH_ASSOC)) Write("  <li><a href='index.php?m=info&cat={$catrow["cid"]}'>{$catrow["category"]}</a></li>"); 
    Write(" </ul>"); 
    break; 
    } 
} 

當我運行它,我得到「致命錯誤:調用一個成員函數取()在/ chroot /家庭/網絡/ HTML /測試一個非對象第29行「第29行是」while($ catrow ...「)行

在我的開發服務器上,雖然它有效,應該怎麼檢查才能弄清楚如何使它在生產環境中工作服務器?我不知道爲什麼它會失敗,如果我將代碼移出第一個SQL循環,它在生產中可以正常工作,這是沒有問題的:

$sql = $pdo->query("SELECT pageid FROM webpages WHERE ISNULL(deleted) ORDER BY sortindex"); 
while ($row = $sql->fetch(PDO::FETCH_ASSOC)) { 
    switch ($row["pageid"]) { 
    case "information": 
    Write(" <li class='top'><a href='index.php?m=info' id='info' class='top_link'><span class='down'>Information</span></a>"); 
    Write(" <ul class='sub'>"); 
    Write("  <li><a href='index.php?m=info&submode=n'>News</a></li>"); 
    Write("  <li><a href='index.php?m=info&submode=e'>Events</a></li>"); 
    Write("  <li><a href='index.php?m=info&submode=m'>Minutes</a></li>"); 
    Write(" </ul>"); 
    break; 
    } 
} 
$subsql = $pdo->query("SELECT * FROM categories WHERE visible = 1 ORDER BY sortindex,category"); 
while ($catrow = $subsql->fetch(PDO::FETCH_ASSOC)) Write("Cat: {$catrow["category"]}<br/>"); 

當我運行它時,第一個循環運行,然後我得到類別列表罰款。我知道我不能確切的堆棧溢出來解決我的服務器故障,但如果有人有一個想法什麼樣的配置調整或其他問題會導致這種行爲,我將不勝感激任何提示:)

+0

什麼是'ISNULL(刪除)'? –

+0

已刪除的是MySQL中的日期時間字段,以讓我知道內容人員將其標記爲已刪除的日期/時間。我不喜歡真正刪除東西,我只是將其標記爲隱藏起來。我想是一種「回收站」。如果我將查詢複製到phpMyAdmin並在那裏執行,我會得到很好的結果。 – Ken

+0

我想知道Write()函數做了什麼。無法想象它可能包含哪些代碼。 –

回答

0

未完全提取的語句可能會阻止其他語句實際發生(因此$subsql不是有效的PDO對象)。這可能工作:

$rows = $pdo->query("SELECT pageid FROM webpages WHERE ISNULL(deleted) ORDER BY sortindex")->fetchAll(PDO::FETCH_ASSOC); 
foreach ($rows as $row) { 
    switch ($row["pageid"]) { 
    case "information": 
    Write(" <li class='top'><a href='index.php?m=info' id='info' class='top_link'><span class='down'>Information</span></a>"); 
    Write(" <ul class='sub'>"); 
    Write("  <li><a href='index.php?m=info&submode=n'>News</a></li>"); 
    Write("  <li><a href='index.php?m=info&submode=e'>Events</a></li>"); 
    Write("  <li><a href='index.php?m=info&submode=m'>Minutes</a></li>"); 
    $subsql = $pdo->query("SELECT * FROM categories WHERE visible = 1 ORDER BY sortindex,category"); 
    while ($catrow = $subsql->fetch(PDO::FETCH_ASSOC)) Write("  <li><a href='index.php?m=info&cat={$catrow["cid"]}'>{$catrow["category"]}</a></li>"); 
    Write(" </ul>"); 
    break; 
    } 
} 
+0

謝謝!這就是問題所在,你的修改在我的prod服務器上是完美的。我想知道它爲什麼在我的開發工程中起作用。我的開發人員運行一個較老的PHP,也許這是他們修復/更改後的版本?那麼,無論如何,謝謝一堆! – Ken

+0

hmmm,可能在你的開發服務器中只有一行由第一條語句返回?這可能會幫助你:http://php.net/manual/en/mysqlinfo.concepts.buffering.php –

+0

那麼,兩者之間的數據庫是相同的。我會閱讀文檔,謝謝。 – Ken