【问题标题】:displaying mysql select statement using PHP PDO使用 PHP PDO 显示 mysql 选择语句
【发布时间】:2026-02-16 12:00:02
【问题描述】:

来自新手的问题:-)

我正在尝试将我的 MySQL 查询语法转换为 PDO,但在开始时遇到了一些问题。

我的页面中有一个名为 dbc.php 的包含文件。包含代码:

define ("DB_HOST", "localhost"); // set database host
define ("DB_USER", "dbuser"); // set database user
define ("DB_PASS","dbpass"); // set database password
define ("DB_NAME","dbname"); // set database name

$link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die("Couldn't make connection.");
$db = mysql_select_db(DB_NAME, $link) or die("Couldn't select database");

我的页面代码是:

<?php
include 'dbc.php';
page_protect();

function get_users($db) {   
$getusers = $db->query('SELECT employeeid, fullname FROM Persons order by fullname asc');
}

?>

我想用以下代码显示表格输出:

<table>
    <tr>
        <th> Full Name</th>
    </tr>
    <?                      
        while($row = $getusers->fetch(PDO::FETCH_ASSOC)) 
        {
    ?>
    <tr>
        <td>
        <?
        echo $row['fullname'];
        ?>
        </td>
    </tr>
        <?
        }
        ?>
</table>

这当前输出错误:

Fatal error: Call to a member function fetch() on a non-object in /home/she/public_html/versionfour/people.php on line 170

第 170 行是我的“while($row = $getusers->fetch(PDO::FETCH_ASSOC))”语句。

我知道我在这里遗漏了一些简单的东西,可能是因为还没有完全理解 PDO。

感谢任何帮助。

感谢和问候, 回复

【问题讨论】:

    标签: php mysql pdo fetch


    【解决方案1】:

    您的页面代码将 $db 视为 PDO 对象,但实际上并非如此。您的设置必须包含类似$db = new PDO('CONNECTION STRING HERE'); 的行(请参阅the documentation 以确定您的数据库类型的连接字符串;您没有提及这是mysql、mssql 还是其他),而不是mysql_connect 调用.

    【讨论】:

      【解决方案2】:

      您遇到的这个问题与“$getUsers”变量的范围有关。由于函数不返回其值,HTML 文件无法访问它,并且 fetch() 方法试图在未定义的值上调用,因此错误中的“非对象”部分。

      <?php
        /** Include the db file which should define a connection as so
        $db = new PDO('dblib:host=$hostname;dbname=$dbName', $user, $pass); etc
        **/
        include 'dbc.php';
      
        page_protect();
      
        function get_users($db) 
        {   
          $result = $db->query("SELECT employeeid, fullname FROM Persons order by fullname asc");
          return $result;
        }
        $users = get_users($db);
      
        /** $users->fetch() can now be used **/
      
      ?>
      

      您还应该考虑一些错误检查,以确保返回的 db 结果实际上是 PDO 结果,否则您可能仍然会遇到此问题。

      【讨论】:

      • 谢谢@Alex。快速提问,我知道 PDO 可以在失败时显示数据库连接详细信息。我添加了 '$db = new PDO('mysql:host=localhost;dbname=she_she', $username, $password);'到我的 dbc.php。我是否需要进行任何更改以“捕获”异常?再次感谢。
      • @Smudger 没问题,很高兴能帮上忙。在某些情况下,您必须有一个有效的结果,因为您依赖该结果才能正确执行剩余的代码。当涉及到数据库连接(如您的情况)时,您必须始终假设它们会出错并相应地编码。看看 try/catch 语句 这些是什么让我们能够优雅地降级
      • 谢谢@Alex,非常感谢。