【问题标题】:Call to undefined function query() - using PDO in PHP调用未定义函数 query() - 在 PHP 中使用 PDO
【发布时间】:2010-03-30 18:40:03
【问题描述】:

我用 PHP 编写了一个脚本,它从 MySQL 数据库中读取数据。我是 PHP 新手,我一直在使用 PDO 库。我一直在使用 WAMP Server 2 在 Windows 机器上进行开发,并且一切运行良好。但是,当我将脚本上传到将使用它的 LINUX 服务器时,运行脚本时出现以下错误。

Fatal error: Call to undefined function query()

这是发生错误的行...

foreach($dbconn->query($sql) as $row)

变量 $dbconn 首先在我的 dblogin.php 包含文件中定义,我在下面列出。

<?php 
// Login info for the database
$db_hostname = 'localhost';
$db_database = 'MY_DATABASE_NAME';
$db_username = 'MY_DATABASE_USER';
$db_password = 'MY_DATABASE_PASSWORD';
$dsn = 'mysql:host=' . $db_hostname . ';dbname=' . $db_database . ';';

try
{
   $dbconn = new PDO($dsn, $db_username, $db_password);
   $dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
  echo 'Error connecting to database: ' . $e->getMessage();
}
?>

在发生错误的函数内部,我将数据库连接定义为超全局...

global $dbconn;

我对正在发生的事情感到有些困惑,因为一切都在我的开发机器上运行良好。我想知道是否安装了 PDO 库,但我认为它是作为 PHP v5 的一部分默认安装的。

脚本在 Ubuntu (5.0.51a-3ubuntu5.4) 机器上运行,PHP 版本为 5.2.4。感谢您的任何建议。我真的很迷茫。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    始终,但始终,在与您的生产平台相同的平台上进行开发。尽量镜像服务器软件的版本(PHP、MySQL 等)。安装之间总是存在差异的,尤其是在不同的操作系统平台处理事情的方式上。使用每台服务器上的旧 'phpinfo()' 脚本来比较差异(如果有)。

    无论如何,即使这里的 Win 和 Linux 平台都有完全相同的版本,你检查过你的配置了吗?换句话说,您的 DSN 中的 MySQL 主机名是本地 MySQL 主机(链接到您的 Win 开发平台),还是 Ubuntu 服务器使用的实际主机?还是在任何一种情况下它们都是“本地主机”?仔细检查一下。另外,您是否在两台服务器上都镜像了所有数据?

    你知道 Ubuntu 服务器有 PDO 吗?你基本上说你假设它们是相同的。不要假设,验证。

    正如sobedai提到的,查看var_dump($dbconn)的输出,检查它实际上是一个PDO对象,然后从那里开始。

    这对我来说是一个典型的 PDO 部署:

    // 'logger' is a custom error logging function with email alerts
    try {
        $dbh= new PDO(dsn);
        if ( is_a($dbh, "PDO") ) {
          $sql= 'SELECT field FROM table';
          $stmt= $dbh->query($sql);
          if ( is_a($stmt, "PDOStatement") ) {
              // handle resultset
          }
          else {
              // weirdness, log it
              logger("Error with statement: {$sql}" .$dbh->errorCode());
          }
        }
        else {
          // some weirdness, log it
          logger('Error making connection: '. $dbh->errorCode());
        }
    }
    catch (PDOException $e) {
      logger('PDOException caught in '.__FILE__.' : '. $e->getMessage());
    }
    catch (Exception $e) {
      logger('General Exception caught in '.__FILE__.' : '. $e->getMessage());
    }
    

    请注意,我在那里使用 PDO::errorCode,引用 SQL-92 state codes

    另外,请尽可能参考the manual

    【讨论】:

    • 你的观点非常好。一旦发生这种情况,我就因为没有在我要部署的服务器上进行开发而自责。我将使用您的代码作为我未来功能的模板。我想我需要添加更好的错误记录。对我来说最困难的事情是试图找出文件系统中的东西(例如日志)。从 Windows 过来。再次感谢。
    【解决方案2】:

    通常发生这种情况时,您尝试引用的对象实际上并不是类的实例。

    由于您一直在 WAMP 上进行开发并在 LAMP 上进行测试,因此您会立即想到包含路径。

    检查您的 LAMP 堆栈上的 php 包含路径是否正确。 检查是否安装了所有必需的库(只需快速执行 phpinfo() 页面,或者您可以从命令行使用 php -i)。

    最后但并非最不重要 - 做:

    echo var_dump($dbconn);
    

    确认它确实是您认为的对象。

    【讨论】:

    • 非常感谢您花时间回答。我添加了您提到的 var_dump 代码并显示为“object(PDO)#1 (0) { }”。令我惊讶的是,我的脚本的其余部分没有错误地执行。我不明白!再次感谢关于 PATHS 的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2014-06-15
    • 2013-08-22
    相关资源
    最近更新 更多