2010-03-30 121 views
0

我在PHP中编写了一个脚本,用于从MySQL数据库读取数据。我是PHP新手,我一直在使用PDO库。我一直在使用WAMP服务器2在Windows机器上开发,并且一直运行良好。但是,当我将脚本上传到将要使用的LINUX服务器时,在运行脚本时出现以下错误。调用未定义的函数查询() - 在PHP中使用PDO

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

回答

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

+0

你说得很好。一旦发生这种情况,我就会因为不在我要部署的服务器上开发而自责。我将使用您的代码作为我未来功能的模板。我想我需要添加更好的错误记录。对我来说最困难的事情是试图找出文件系统中的东西(比如日志)。从Windows开始。再次感谢。 – webworm 2010-03-30 19:22:53

0

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

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

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

最后但并非最 - DO:

echo var_dump($dbconn); 

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

+0

非常感谢您花时间回答。我添加了你提到的var_dump代码,并显示“object(PDO)#1(0){}”。令我惊讶的是我的脚本的其余部分没有错误地执行。我不明白!再次感谢关于PATHS的建议。 – webworm 2010-03-30 19:20:58

相关问题