这是我在Using PDO to replace mysql_connect - formatting correctly?
上的上一个问题的延续这是较大页面的一部分,本身将回显到另一页
<?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 :(得分:2)
您正在设置$dbh = null;
。因此,第29行不再提供$dbh
。
此外,你在第一个例子中所做的事情效率非常低。您正在查询数据库两次。最好先保存结果集,如有必要,稍后再使用。
您可能需要以下内容:
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;
?>
答案 1 :(得分:1)
您正在查找try
块底部的数据库句柄。您打开连接,运行查询,获取结果,丢弃结果,然后关闭连接。
因此,当PHP到达第29行时,$ dbh现在为NULL,不能再用作PDO对象。
答案 2 :(得分:0)
您在try块中定义$dbh
。 Out不存在,但你正试图使用它。摆脱try块。如果抛出异常,脚本将自动停止。
此外,您在减速结束时将其设置为null
。
另外,为什么要尝试在try块之外访问dbh?我看不出任何目的。
答案 3 :(得分:0)
PDO并不比mysql ext更好 你需要更智能的抽象层。
此外,echo与PDO无关。您必须使用模板,并将所有代码划分为获取数据部分和显示数据部分