Как сделать повсеместное подключение PDO PHP

#php #pdo #odbc #pervasive #pervasive-sql

#php #pdo #odbc #повсеместное #pervasive-sql

Вопрос:

Я пытаюсь установить соединение с моей базой данных Pervasive SQL works. Я пытался использовать odbc_connect (не сработало), но мне сказали, что PDO проще и лучше (ХА, тоже не сработало). Это моя строка подключения $dbh = new PDO("odbc:Driver={Pervasive ODBC Client Interface};ServerName=192.168.43.19;dbq=GLOBALTST");

Я пробовал odbc: DSNname (https://www.php.net/manual/en/ref.pdo-odbc.connection.php ), ODBC: имя сервера (ip и имя хоста) и odbc: имя базы данных. Ничего не сработало. Это ошибка, которую я получаю:

 Fatal error: Uncaught PDOException: SQLSTATE[IM003] SQLDriverConnect: 160 Specified driver could not be loaded due to system error 1114: A dynamic link library (DLL) initialization routine failed. (Pervasive ODBC Client Interface, C:PSQLbinw3odbcci.dll). in C:inetpubwwwrootdefault.php:4 Stack trace: #0 C:inetpubwwwrootdefault.php(4): PDO->__construct() #1 {main} thrown in C:inetpubwwwrootdefault.php on line 4
 

DLL, которую он ищет, на самом деле находится в том месте, на которое он ссылается. насколько я могу судить, проблем с этим нет. ODBC правильно настроен на сервере, и я могу подключиться к БД в центре управления PSQL. может ли кто-нибудь помочь в определении моей проблемы или указать на строку подключения, которая работает либо с odbc_connect, либо с PDO?

Комментарии:

1. Ваш PHP 32 или 64-разрядный? Как насчет IIS? Как насчет PSQL? Обычно системная ошибка 1114 вызвана несоответствием 32/64 бит или проблемой пути. Убедитесь, что c:psqlbin каталог находится в системном пути.

Ответ №1:

Этот код работал для меня с использованием 64-разрядного ODBC PSQL v11, 64-разрядного PHP 7.2 на компьютере с Windows.

 <?php
try {
    // Connect to the data source
    //$dbh = new PDO($dsn);
    $dbh = new PDO("odbc:Driver={Pervasive ODBC Interface};ServerName=192.168.43.19;dbq=demodata");

    $stmt = $dbh->prepare('SELECT * FROM class');

    // Execute the prepared statement for each name in the array
    $stmt->execute();

    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    $numResults = count($result);
    echo ('<b>Total Results: </b> ' . $numResults . '<br>');
    if ($numResults > 0) {
        // Output the table header
        echo '<table><tr>';
        foreach ($result[0] as $fieldName=>$value) {
            echo '<th>' . htmlspecialchars($fieldName) . '</th>';
        }
        echo '</tr>';

        // Now output all the results
        foreach($result as $row) {
            echo '<tr>';
            foreach ($row as $fieldName=>$value) {
                echo '<td>' . htmlspecialchars($value) . '</td>';
            }
            echo '</tr>';
        }

        // Close the table
        echo '</table>';
    } else {
        echo 'No results';
    }
        

    // Close statement and data base connection
    $stmt = NULL;
    $dbh = NULL;
}

catch(PDOException $e) {
    echo $e->getMessage();
}
?>