powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / odbc_result() или odbc_fetch_array() возвращают "No tuples available at this result index"
6 сообщений из 6, страница 1 из 1
odbc_result() или odbc_fetch_array() возвращают "No tuples available at this result index"
    #38597264
Teslenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть вопроса в следующем по порядку открываем соединение с MSSQL2005 (это неважно так как на 2008 та же хрень!)
отправляем на него запрос.
$query = "select count(*) from dbo.Admin_name_table where [login] = '".$_REQUEST['new_login']."';";
Получаем результат,
проверяем его.
if(odbc_result($res, 1) > 0)
Всё круто и хорошо, всё работает.
Выполняем внутренний код, готовимся к занесению данных о пользователе в таблицу


готовим второй запрос:
$query = "Declare @a bigint, @tex_id bigint;
set @tex_id=(select distinct top 1 [tex_id] from dbo.tex_par_table);
set @a=@tex_id+1;
while(@a in (select [ID] from dbo.Admin_name_table))
begin; set @a=@a+1; end;
select @a as [New_ID];";
который должен вернуть первый свободный ID в таблице.
Один единственный результат!!! НО!!!
odbc_result($res, 1) выдаёт No tuples available at this result index, что означает что нет результата по данному индексу.
В чём здесь может быть проблема, в самом MSSQL всё выполнятется
...
Рейтинг: 0 / 0
odbc_result() или odbc_fetch_array() возвращают "No tuples available at this result index"
    #38597274
Teslenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл указать запрос выполняю odbc_exec($db_conn, $query);

второй запрос пробовал выполнять с помощью odbc_do($db_conn, $query); или odbc_execute(odbc_prepare($db_conn, $query), array());
...
Рейтинг: 0 / 0
odbc_result() или odbc_fetch_array() возвращают "No tuples available at this result index"
    #38613457
Teslenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, как выяснилось, полного, корректного описания по ODBC php нет даже на английском языке. Насколько я понял, при выполнении команд, SQL возвращает определенное кол-во результатов, соответствующее кол-ву операндов выполнения, следовательно, требуется выбирать соответствующий идентификатор результата, который нужен, и стараться не пользоваться odbc_result(), так как данный метод берёт тольпо первый результат в списке и подходит для простых запросов, состоящих из одного select.... . Для получения результата сложного запроса, следует использовать odbc_fetch_into() с помощью которого, можно получить массив результатов

int odbc_fetch_into ( resource $result_id , array &$result_array [, int $rownumber ] ),

соответствующей строки. И даже если не пытаться разобраться в его номере, метод возвращает пустую строку в случае ошибки. Если номер идентификатора верный, то вернёт кол-во результатов в строке.
...
Рейтинг: 0 / 0
odbc_result() или odbc_fetch_array() возвращают "No tuples available at this result index"
    #38866566
Teslenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Teslenko Sergey,

Дополнительные наблюдения по данному вопросу:
В простых запросах типа SELECT при возникновении этой ошибки рекомендуется поменять порядок выдачи результатов, то есть.
Сначала [поле 1],[поле 2],[поле 3]
Потом [поле 2],[поле 1],[поле 3]
При этом следует скомпановать запрос таким образом, чтобы сначала отдать исключительно числовые результаты а потом текст и в конку UTF "(Cast [поле 3] as text) as [поле_3_echo]"

Также следует отметить что желательно выполнение select отдельным запросом к серверу, так как, в основном такие ошибки наблюдаются именно при сложных запросах к серверу.

Есть ещё один возможность выполнение команд с помощью хранимой процедуры в которую вы передаёте строку запроса, довольно эффективно работает так как промежуточные результаты, типа обновили 1-2-3 строки не выводится и в следствии этого odbc получает единичный ответ от selectов
...
Рейтинг: 0 / 0
odbc_result() или odbc_fetch_array() возвращают "No tuples available at this result index"
    #38867326
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ты напоролся на особенность ODBC для MS SQL.
Когда ты посылаешь пакет команд через ODBC, на сервере создается хранимая процедура с текстом этого батча, выполняется и тут же удаляется. При этом срабатывают все неявные фишки хранимых процедур.

В общем, методов лечения тут два:
1) Оформить все что надо в виде нормальной хранимой процедуры и вызывать ее. Это на мой взгляд самое удобное и надежное.
2) Избавится от пакета и запускать все что нужно по очереди из внешнего скрипта.


Teslenko SergeyВ общем, как выяснилось, полного, корректного описания по ODBC php нет даже на английском языке.
Зато есть MDAC с описанием самого ODBC, а php модуль к нему это почти прямое отображение.

Teslenko SergeyНасколько я понял, при выполнении команд, SQL возвращает определенное кол-во результатов, соответствующее кол-ву операндов выполнения,В общем случае это не так.
Количество результатов зависит от количества результато-генерирующих запросов. Запросы типа insert/delete/set резултата не генерируют. Но могут генерировать информационные результаты (сколько строк обработано, за какое время, из-за чего обработка остановилась, и тп). И эта информация может выдаваться клиенту как отдельный резалтсет. В MS SQL мире ее обычно выключают через SET NOCOUNT ON. Но это для ленивых.

Teslenko Sergey следовательно, требуется выбирать соответствующий идентификатор результата, который нужен, и стараться не пользоваться odbc_result(), так как данный метод берёт тольпо первый результат в списке и подходит для простых запросов, состоящих из одного select.... .А для много-резалтсетных запросов/пакетов/хранимых процедур есть очень простая команда: odbc_next_result(). Получил первый резалтсет, выбрал из него все записи, запросил следующий резалтсет... и так пока odbc_next_result() не ответит: "больше нету".
...
Рейтинг: 0 / 0
odbc_result() или odbc_fetch_array() возвращают "No tuples available at this result index"
    #38947128
Teslenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

Спасибо. Посмотрю. Вообще ещё заметил такой момент, что ошибка иногда возникает если в результате выдачи форматы полей идут вперемешку. Например: bigint, text, varchar, int. Во многих случаях проблема решалась перестановкой порядка выдачи результирующего набора полей в запросе и всё. Но это так наблюдение!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / odbc_result() или odbc_fetch_array() возвращают "No tuples available at this result index"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]