调用未定义的函数query() - 在PHP中使用PDO

时间:2010-03-30 18:40:03

标签: php mysql pdo

我在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。谢谢你的任何建议。我真的迷失了。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

echo var_dump($dbconn);

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

答案 1 :(得分:0)

始终(但始终)与您的生产平台在同一平台上进行开发。尽力反映服务器软件的版本(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