2011-08-26 58 views
0

這是在Using PDO to replace mysql_connect - formatting correctly?PHP echo和PDO - 如何解決成員函數查詢錯誤?

這是本身將被回顯到另一個頁面較大的頁面的一部分,我剛纔的問題的延續

<?php 
/*** mysql hostname ***/ 
$hostname = 'localhost'; 

/*** mysql username ***/ 
$username = 'root'; 

/*** mysql password ***/ 
$password = 'MYPASSWORD'; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=radiotest", $username, $password); 
    /*** echo a message saying we have connected ***/ 

    /*** The SQL SELECT statement ***/ 
    $sql = "SELECT * FROM presenters"; 
    foreach ($dbh->query($sql) as $row) 
     { 
     } 

    /*** close the database connection ***/ 
    $dbh = null; 
} 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
    } 
?> 
<?php foreach ($dbh->query($sql) as $row) ?> 
<table> 
<td> 
<tr><?php echo $row['presenter'] ?><?php echo $row['show'] ?> </tr> 
</table> 

它給了這個錯誤:

Fatal error: Call to a member function query() on a non-object in C:\www\vhosts\localhost\radio1.php on line 29 

我想避免這個錯誤,並能夠回顯行,如果我可以...不使用此代碼(我的原始編碼 - 它的工作,但我試圖使用PDO與回聲如上例):

<?php 
/*** mysql hostname ***/ 
$hostname = 'localhost'; 

/*** mysql username ***/ 
$username = 'root'; 

/*** mysql password ***/ 
$password = 'MYPASSWORD'; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=radiotest", $username, $password); 
    /*** echo a message saying we have connected ***/ 

    /*** The SQL SELECT statement ***/ 
    $sql = "SELECT * FROM presenters"; 
    foreach ($dbh->query($sql) as $row) 
     { 
     echo $row['presenter'] .' - '. $row['show'] . '<br />'; 
     } 

    /*** close the database connection ***/ 
    $dbh = null; 
} 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
    } 
?> 

什麼可能導致此錯誤,爲什麼?

我應該用代碼做保證,這是循環:

<table> 
<td> 
<tr><?php echo $row['presenter'] ?><?php echo $row['show'] ?> </tr> 
</table> 

基本上,我試圖用PDO來代替的mysql_connect的迴響在HTML表中的行或定義列出了我測試網站。

下面是編輯後的版本現在:

<?php 
/*** mysql hostname ***/ 
$hostname = 'localhost'; 

/*** mysql username ***/ 
$username = 'root'; 

/*** mysql password ***/ 
$password = 'MYPASSWORD'; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=radiotest", $username, $password); 
    /*** echo a message saying we have connected ***/ 

    /*** The SQL SELECT statement ***/ 
    $sql = "SELECT * FROM presenters"; 
    foreach ($dbh->query($sql) as $row) 
     { 
       echo $row['presenter'] .' - '. $row['show'] . '<br />'; 

     } 

    /*** close the database connection ***/ 
    $dbh; 
} 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
    } 
?> 

<table> 
<td> 
<tr><?php echo $row['presenter'] ?><?php echo $row['show'] ?> </tr> 
</table> 

它顯示的數據,但不低於表中。

+0

1)在關閉try塊中的連接之前創建表格內容。 || 2)用'$ dbh = null'關閉頁面底部的連接。 – afuzzyllama

回答

2

您正在設置$dbh = null;。因此$dbh在第29行不再可用。

此外,在第一個示例中,您正在執行的操作相當低效。您正在查詢數據庫兩次。第一次更好保存結果集,如有必要,稍後再使用。

你可能需要類似以下內容:

try 
{ 
    $dbh = new PDO("mysql:host=$hostname;dbname=radiotest", $username, $password); 

    $sql = "SELECT * FROM presenters"; 
    $result = $dbh->query($sql); 

    // not really necessary 
    $dbh = null; 
} 
catch(PDOException $e) 
{ 
    echo $e->getMessage(); 
} 
?> 

<?php 
    // using alternative foreach syntax 
    foreach($result as $row): 
?> 
<table> 
<tr> 
<td><?php echo $row['presenter']; ?><?php echo $row['show']; ?> </td> 
</tr> 
</table> 
<?php 
    // using alternative syntax 
    endforeach; 
?> 
+0

好吧,我只是編輯它到$ dbh?至於回聲部分,我該怎麼做才能確保它循環(這是foreach,是不是,或者我錯了?) – radiogeek86

+0

也許你可以編輯你的問題,並詳細說明你試圖達到的目標。這可能會節省我們來回評論。 ;-) 謝謝。 –

+0

@ radiogeek86:我編輯了我的問題。這應該做你想要的東西。請注意,你只能遍歷'$ result'一次。如果你再次需要它,那麼首先將'$ result'行保存到一個數組中(通過遍歷$ result),在'try'塊中。稍後再遍歷保存的數組。 –

0

你定義$dbh try塊內。 Out不在外面,但你正在嘗試使用它。擺脫try塊。如果拋出異常,腳本將自動停止。

另外,您在減速結束時將其設置爲null

此外,你爲什麼要嘗試訪問嘗試塊外的dbh?我看不到任何目的。

+0

如果您查看PDO的文檔,如果您沒有嘗試捕獲,它會顯示一個可能會公開所有數據庫信息的回溯。 – afuzzyllama

+0

確實如此,但它在開發階段沒有任何目的。只在生產現場。 –

+0

@Rikudo Sennin - 編輯更多一點來展開它。 – radiogeek86

1

您正在查找try塊底部的數據庫句柄。您打開一個連接,運行查詢,獲取結果,丟棄結果,然後關閉連接。

因此,當PHP達到第29行時,$ dbh現在爲NULL,不能再用作PDO對象。

0

PDO並不比mysql分機更好
您需要更智能的抽象層。

另外,echo與PDO無關。您必須使用模板,並將所有代碼劃分爲獲取數據部分和顯示數據部分

相關問題