PHP echo和PDO - 如何解决成员函数查询错误?

时间:2011-08-26 16:58:59

标签: php mysql pdo echo

这是我在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>

它显示数据,但不在下表中。

4 个答案:

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