2011-08-26 113 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无关。您必须使用模板,并将所有代码划分为获取数据部分和显示数据部分

相关问题