Вызов неопределенной функции query () - использование PDO в PHP - PullRequest
0 голосов
/ 30 марта 2010

У меня написан скрипт на PHP, который читает данные из базы данных MySQL. Я новичок в PHP, и я использую библиотеку PDO. Я занимался разработкой на Windows-машине с использованием WAMP Server 2, и все работало хорошо. Однако, когда я загрузил свой скрипт на сервер 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 голосов
/ 30 марта 2010

Всегда, но всегда, развивайтесь на той же платформе, что и ваша производственная платформа. Старайтесь изо всех сил отражать версии серверного программного обеспечения (PHP, MySQL и т. Д.). Между установками всегда будут различия, особенно в том, как разные ОС работают. Используйте старый скрипт phpinfo () на каждом сервере, чтобы сравнить различия, если они есть.

В любом случае, даже если на обеих платформах Win и Linux установлены одинаковые версии всего, проверили ли вы свою конфигурацию? Другими словами, является ли имя хоста MySQL в вашем DSN локальным хостом MySQL (связанным с вашей платформой разработки Win) или реальным хостом, который использует сервер Ubuntu? Или они оба "localhost" в любом случае? Дважды проверьте это. Кроме того, вы зеркалировали все данные на обоих серверах?

Знаете ли вы, что на сервере 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 .

Также обратитесь к руководству , насколько это возможно.

0 голосов
/ 30 марта 2010

Обычно, когда это происходит, объект, на который вы пытаетесь ссылаться, на самом деле не является экземпляром класса.

Поскольку вы разрабатываете на WAMP и тестируете на LAMP, сразу же приходят на ум пути включения.

Убедитесь, что путь php включает правильный путь в вашем стеке LAMP. Убедитесь, что все необходимые библиотеки установлены (просто откройте страницу phpinfo () или вы можете использовать php -i из командной строки).

И последнее, но не менее важное: сделайте:

echo var_dump($dbconn);

подтвердите, что это действительно тот объект, о котором вы думаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...