php pdo для Postgres: «не удалось найти драйвер» - PullRequest
1 голос
/ 01 июня 2019

Я установил php на новый сервер Ubuntu 18.04 для Postgres, и у меня проблема с php. Вот мои шаги установки php 7.3:

sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php]
sudo systemctl restart apache2

После установки PHP 7.3 я установил pgsql.

sudo apt install php-pgsql
sudo service apache2 reload

Затем я отредактировал файл php.ini в /etc/php/7.3/apache2 и удалил точки с запятой из следующих строк:

extension=pdo_pgsql
extension=pgsql

Я сохранил файл и сделал sudo systemctl перезапустите apache2.

Наконец я включил модули:

sudo phpenmod -v 7.3 pgsql
sudo phpenmod -v 7.3 pdo_pgsql
sudo systemctl restart apache2

Затем я создал скрипт для использования pdo для входа в мою базу данных Postgres (учетные данные для входа здесь заменяются значениями-заполнителями.)

<?php

$params = [
    'host' => '[IP Address]',
    'user' => '[username]',
    'pwd' => '[password]',
    'db' => '[dbname]'
];

$dsn = sprintf('pgsql:host=%s;dbname=%s;user=%s;password=%s',
    $params['host'],
    $params['db'],
    $params['user'],
    $params['pwd']);

try {
    $dsn = sprintf('pgsql:host=%s;dbname=%s;unix_socket=%s',
        $params['host'], $params['db'], $params['sock']);
    $opts = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
    $pdo = new PDO($dsn, $params['user'], $params['pwd'], $opts);
} catch (PDOException $e) {
    echo $e->getMessage();
} catch (Throwable $e) {
    echo $e->getMessage();
}

?>

Но консоль разработчика Firefox повторяет: «не удалось найти драйвер».

Одна подсказка в том, что php 7.3 находится в / etc / apache2 / mods-available, но не в / etc / apache2 / mods-enabled, что говорит о том, что он не включен. Но когда я пытаюсь использовать phpenmod -v 7.3 php7.3.conf, я получаю: ПРЕДУПРЕЖДЕНИЕ: ini-файл модуля php7.3.conf не существует в /etc/php/7.3/mods-available.

Я провел много исследований по этому вопросу, и вот шаги, которым нужно следовать. Большая часть этого исследования была посвящена MySQL, но это не должно иметь значения для PDO.

Спасибо за любые идеи о том, почему я получаю сообщение "Не удалось найти драйвер".

UPDATE:

Я создал скрипт для запуска phpinfo ():

<?php
ob_start();
phpinfo();
$info = ob_get_clean();
echo $info;
?>

но возвращает только HTML-код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<style type="text/css">
body {background-color: #fff; color: #222; font-family: sans-serif;}
pre {margin: 0; font-family: monospace;}
a:link {color: #009; text-decoration: none; background-color: #fff;}
a:hover {text-decoration: underline;}
table {border-collapse: collapse; border: 0; width: 934px; box-shadow: 1px 2px 3px #ccc;}
.center {text-align: center;}
.center table {margin: 1em auto; text-align: left;}
.center th {text-align: center !important;}
td, th {border: 1px solid #666; font-size: 75%; vertical-align: baseline; padding: 4px 5px;}
h1 {font-size: 150%;}
h2 {font-size: 125%;}
.p {text-align: left;}
.e {background-color: #ccf; width: 300px; font-weight: bold;}
.h {background-color: #99c; font-weight: bold;}
.v {background-color: #ddd; max-width: 300px; overflow-x: auto; word-wrap:  break-word;}
.v i {color: #999;}
img {float: right; bo…
jquery.min.js line 2 > eval:12:21
?

Но это не то, что я ожидал.

1 Ответ

2 голосов
/ 01 июня 2019

Начиная с нашего разговора, проблема была вызвана установкой нескольких версий PHP, и Apache загружал версию PHP (7.2), отличную от ожидаемой версии PHP 7.3.

Для решения проблемы выполните следующие команды:

sudo a2dismod php7.2
sudo a2enmod php7.3

Это отключит загрузку php7.2 с помощью Apache и загрузит вместо него php7.3.


Для вашего DSN (имя источника данных) ваша текущая конфигурация использует unix_socket, который не подходит для DSG postgresql. Кроме того, $params['socket'], который будет использоваться для параметра unix_socket, отсутствует.

Подробнее см .: https://www.php.net/manual/en/ref.pdo-pgsql.connection.php

Если сервер базы данных прослушивает порт по умолчанию (5432) , вы можете использовать:

try {
    $dsn = vsprintf('pgsql:host=%s;port=%s;dbname=%s;user=%s;password=%s', [
        'host' => '[IP Address]',
        'port' => '5432',
        'dbname' => '[dbname]',
        'user' => '[username]',
        'password' => '[password]',
    ]);
    $pdo = new PDO($dsn);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo $e->getMessage();
} catch (Throwable $e) {
    echo $e->getMessage();
}

DSN должен привести к: https://3v4l.org/aFKAW

pgsql:host=[IP Address];port=5432;dbname=[dbname];user=[username];password=[password]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...