Не получается выполнить прцедуру

Подготовительная часть:

$database   = "*************************";
$user       = "SYSDBA";
$ps   = "*";

$dbh = ibase_connect($database, $user, $ps, 'utf8') or die(json_encode(array('message' => 'not connection', 'successed' => false)));

$stmt = "SELECT * FROM RPT_KMN_BILL(null,190, null, null, null, null, null, 209214, 1) WHERE IS_PRINT = 1";
$result = ibase_query($stmt) or die("Ошибка " . ibase_errcode($link));

Все что вверху выполняется за секунду (и через php и через IBExpert), и без ошибок. Если дальше добавить:

$mass;
if ($result )
{
    while(true)
    {
        $r = ibase_fetch_assoc($result );
        if (!$r) break;
        $mass[] = $r;
    }
}

То при отправке ajax запрос виснет и в конце концов прилетает результат через минут 5:

введите сюда описание изображения

введите сюда описание изображения

В FireFox на тот же самый запрос приходит:

введите сюда описание изображения

Методом проб, понял, что зависание появляется если я использую ibase_fetch_assoc или ibase_fetch_row.

В IBExpert этот-же запрос работает, под тем же пользователем.

В чем может быть причина не выполнения запроса?


Ответы (1 шт):

Автор решения: astax

На вопрос ответить не могу, но процесс дебага могу предложить.

Варианта два:

  • либо ibase_fetch_assoc блокируется на чтении
  • либо получается бесконечный цикл

Чтобы проверить, что происходит, добавить отдельный счетчик вокруг цикла и выводить результат на каждой итерации.

if ($result )
{
    // формат цикла, действительно, странный, но менять не буду
    $cnt = 0;
    while(true)
    {
        $r = ibase_fetch_assoc($result );
        if (!$r) break;
        $mass[] = $r;
        if (++$cnt > 100) break; // число можно поменять, если надо
        echo var_export($r, true) . "\n";
    }
}

(всесто echo в цикле можно писать в лог - см. https://www.php.net/manual/en/function.error-log.php , особенно destination = 3 (file) )

Запустив этот код, можнно понять, что возвращает функция ibase_fetch_assoc и почему код зацикливается. Может там просто данных очень много и надо добавить ограничение в запрос? Если же она ничего не возвращает, а зависает, то ... вот тут я не знаю толком, что делать. Разве что проверить, что доступ к базе по сети есть нормальный.

→ Ссылка