Не удалось выполнить индексированное чтение для получения следующей строки - PullRequest
0 голосов
/ 07 мая 2020

У меня есть этот класс подключения, где я подключаюсь к нескольким базам данных. Мне нужно адаптироваться так, чтобы база данных Informix выполняла запрос только для чтения. Игнорирование того, заблокирована ли таблица.

Сообщение, возвращаемое с таблицей блокировки, следующее:

Неустранимая ошибка: Uncaught PDOException: SQLSTATE [HY000]: Общая ошибка: -246 [Informix ] [Informix ODB C Driver] [Informix] Не удалось выполнить индексированное чтение для получения следующей строки. sqlerrm (получить строку по идентификатору строки)

В этом отрывке я установил параметр set isolation to dirty read;, но он не работал.

$conn = new PDO("informix:host={$host}; service={$port}; database={$name}; server={$server}; protocol=onsoctcp; set isolation to dirty read;EnableScrollableCursors=1", $user, $pass);

Ниже всего класса:

<?php

class connection {

    public static $conn;
    private static $last;

    public static function open($basename) {
        if (file_exists("config/{$basename}.ini")) {
            $db = parse_ini_file("config/{$basename}.ini");
        } else {
            throw new exception("Error connect '$basename'");
        }

        $user = isset($db['user']) ? $db['user'] : NULL;
        $pass = isset($db['pass']) ? $db['pass'] : NULL;
        $name = isset($db['name']) ? $db['name'] : NULL;
        $host = isset($db['host']) ? $db['host'] : NULL;
        $type = isset($db['type']) ? $db['type'] : NULL;
        $port = isset($db['port']) ? $db['port'] : NULL;


        switch ($type) {
            case 'pgsql':
                $port = $port ? $port : '5432';
                $conn = new PDO("pgsql:dbname={$name}; user={$user}; password={$pass};host=$host;port={$port};");
                break;
            case 'mysql':
                $port = $port ? $port : '3306';
                $conn = new PDO("mysql:host={$host};port={$port};dbname={$name}", $user, $pass);
                break;
            case 'sqlite':
                $conn = new PDO("sqlite:{$name}");
                break;
            case 'ibase':
                $conn = new PDO("firebird:dbname={$name}", $user, $pass);
                break;
            case 'oci8':
                $conn = new PDO("oci:dbname={$name}", $user, $pass);
                break;
            case 'mssql':
                $conn = new PDO("mssql:host={$host},1433;dbname={$name}", $user, $pass);
                break;

            case 'informix':
                $port = $port ? $port : '1528';
                $server = 'ol_standard';
                $conn = new PDO("informix:host={$host}; service={$port}; database={$name}; server={$server}; protocol=onsoctcp; set isolation to dirty read;EnableScrollableCursors=1", $user, $pass);
                break;
        }

        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        self::$conn[$basename] = $conn;
        self::$last = $basename;

    }

    public static function select($sql, $base = null) {

        if (!$base)
            $base = self::$last;

        return self::$conn[$base]->query($sql);

    }

    public static function exec($sql, $ret_id = false, $base = null) {

        if (!$base)
            $base = self::$last;

        $retorno = self::$conn[$base]->exec($sql);
        if ($ret_id)
            $retorno = self::$conn[$base]->lastInsertId();
        return $retorno;

    }

    public static function close($base = null) {

        if (!$base)
            $base = self::$last;

        self::$conn[$base] = null;

    }

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