Что нужно Apache для поддержки mysqli и PDO? - PullRequest
0 голосов
/ 26 октября 2009

Я рассматриваю вопрос об изменении некоторого PHP-кода для использования PDO для доступа к базе данных вместо mysqli (потому что синтаксис PDO для меня более понятен и не зависит от базы данных). Чтобы сделать это, мне нужно, чтобы оба метода работали, пока я делаю замену.

Моя проблема заключается в следующем: , пока один или другой метод приведет к аварийному завершению работы Apache .

Сейчас я использую XAMPP в Windows XP и PHP версии 5.2.8. Mysqli работает нормально, и так же:

$dbc = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
echo 'Connected to database';
$sql = "SELECT * FROM `employee`";

Но эта строка приводит к краху Apache:

$dbc->query($sql);

Я не хочу повторять всю мою установку Apache или XAMPP, но я бы хотел, чтобы PDO работал. Поэтому я попытался обновить libmysql.dll с здесь , как рекомендует oddvibes здесь . Это заставило мой простой запрос PDO работать, но затем запросы mysqli привели к краху Apache.

(Я также попробовал предложение после этого, чтобы обновить php_pdo_mysql.dll и php_pdo.dll, но безрезультатно.)

Контрольный пример

Я создал этот тестовый скрипт для сравнения PDO с mysqli. При старой копии libmysql.dll происходит сбой, если значение $use_pdo равно true, и нет, если значение равно false С новой копией libmysql.dll все наоборот.

if ($use_pdo){
  $dbc = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
  echo 'Connected to database<br />';
  $sql = "SELECT * FROM `employee`";
  $dbc->query($sql);
  foreach ($dbc->query($sql) as $row){
    echo $row['firstname'] . ' ' . $row['lastname'] . "<br>\n";
  }

}
else {
  $dbc = @mysqli_connect($hostname, $username, $password, $dbname) OR die('Could not connect to MySQL: ' . mysqli_connect_error());
  $sql = "SELECT * FROM `employee`";
  $result = @mysqli_query($dbc, $sql) or die(mysqli_error($dbc));

  while ($row = mysqli_fetch_array($result,MYSQLI_ASSOC)) {
    echo $row['firstname'] . ' ' . $row['lastname'] . "<br>\n";
    }
}

Что нужно Apache для поддержки обоих методов запроса к базе данных?

Ответы [ 5 ]

1 голос
/ 26 октября 2009

Не прямой ответ, но, возможно, он может помочь вам в поиске:

Устаревшее расширение mysql (функция с префиксом mysql_) является тонкой оболочкой над libmysqlclient. Новое расширение mysqli по сути то же самое, но оно реализует некоторые функциональные возможности, которые были представлены в более поздних версиях libmysqlclient. PDO также использует libmysqlclient, но не отображает его так же напрямую, как другие расширения. Все это составляет 3 разных php-расширения, которые все ссылаются на одну и ту же нативную библиотеку. Если некоторые из них делают предположения о версии библиотеки, это может привести к их конфликту.

Я бы посоветовал вам установить новейшую версию libmysqlclient.dll, которую вы можете найти, и попытаться отключить устаревшее расширение mysql (если вы этого еще не сделали).

Если у вас есть код, использующий расширение mysql, вы можете связать mysqli с этими функциями, и он должен работать так же.

Также убедитесь, что у вас по какой-то причине не установлен новый драйвер mysqlnd. mysqlnd - это альтернативная реализация libmysqlclient, которая на самом деле просто все усложняет.

Да, это большой беспорядок.

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

Хорошо, у меня очень плохое, но работающее решение: p)

Откройте ext \ php_pdo_mysql.dll с помощью Hex Editor

Поиск смещения "83 C3 50" 0x000024d5 (в php 5.2.12 vc6)

Заменить на 83 C3 "54"

Проблема в неправильном размере структуры ... (struct pdo_column_data)

Я пытался исправить это в libmysql.dll, но это сбой php_mysqli;)

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

Уникальное решение, которое я нашел:

Установить пакет LibMySQL.DLL ОТ 5.0.51a (работает с последней версией MySQL 5.1.44)

http://www.netfulvpc.fr/files/libmysql_dll.zip

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

так же, как Почему этот код pdo :: mysql падает на Windows?

, но пока нет решения

Сбой происходит только при запросе «SELECT * FROM xxx» () и подготовке / выполнении

0 голосов
/ 25 февраля 2010

Похоже, все, что вам нужно, это раскомментировать правильные директивы extension в php.ini, например extension=php_mysqli.dll и extension=php_pdo_mysql.dll.

Я никогда не подтверждал это с помощью XAMPP, потому что разочаровался в этом и решил установить Apache, PHP и MySQL по отдельности. В процессе, я научился делать вышеуказанные шаги, наряду со многими другими вещами. Поэтому я не подтвердил, что это будет работать с XAMPP, но я не понимаю, почему нет, если только он не поставляется с правильными драйверами.

Два драйвера (файлы .dll) в приведенных выше примерах директив - это те, которые я использую. Я также установил extension_dir = "c:/php/ext" в php.ini - вы должны убедиться, что путь указывает на каталог, в котором находятся ваши расширения php. (Обратите внимание, что одна из приятных особенностей установки этих компонентов по отдельности заключается в том, что я могу поместить PHP в c:\php вместо того, чтобы он был похоронен на несколько уровней в глубине c:\xampp.)

Если кто-то захочет выполнить установку компонентов вашего сервера отдельно, я задокументировал весь процесс со скриншотами в моем блоге.

...