За последние 24 часа нас посетили 30548 программистов и 1793 робота. Сейчас ищут 1284 программиста ...

Bad row offset (0)

Тема в разделе "PHP и базы данных", создана пользователем Genrih, 18 дек 2011.

  1. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    есть код программы
    PHP:
    1.  
    2. $qq1 = "SELECT Vopros.Kod_Predmet, Vopros.TabN,  FROM Vopros WHERE ((Vopros.Kod_Predmet=".$_SESSION['KPred'].") AND (Vopros.TabN=".$_SESSION['TabN']."));";
    3.     $intres=mssql_query($qq1, $srs);
    4.     if (is_resource($intres)&&(mssql_num_rows($intres)>0)){        
    5.         echo ("Данные получены");
    6.     }
    7.     else {
    8.     //иначе пустые данные
    9.               echo ("Данные не получены");
    10.     }
    здесь он постоянно при отсутствии записи в $intres выдает
    Warning: mssql_result(): Bad row offset (0)
    никак не могу решить эту проблему.
    Помогите как верно написать условие, что бы в отсутствии строк в БД в место ошибки выдавал сообщение.
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
  3. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    PHP:
    1. if (mssql_num_rows($intres)>0){....}
    выдает туже самую ошибку
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Приведи полностью код.
     
  5. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    PHP:
    1. <?php
    2. $srs = mssql_connect("localhost","sa","");
    3. if (!$srs) {echo "Non connect";}
    4. else{
    5.     mssql_select_db("Общая",$srs);
    6.     //запрос на получения вопроса
    7.     $qq1 = "SELECT Vopros.Kod_Predmet, Vopros.TabN, Vopros.Kt, Vopros.Kv, Vopros.Test FROM Vopros WHERE ((Vopros.Kod_Predmet=".$_SESSION['KPred'].") AND (Vopros.TabN=".$_SESSION['TabN'].") AND (Vopros.Kt='".$_SESSION['KTesta']."'));";
    8.     $intres=mssql_query($qq1, $srs);
    9.     if (is_resource($intres)&&(mssql_num_rows($intres)>0)){        
    10.         $DataV=trim (mssql_result($intres,$_SESSION['NumVopr'],4));
    11.         $KodVopr = mssql_result($intres,$_SESSION['NumVopr'],3);
    12.         //Запрос на получения вариантов ответа
    13.         $DataO = "SELECT Otvet.Kod_Predmet, Otvet.TabN, Otvet.Kt, Otvet.Kv, Otvet.text, Otvet.VNV FROM Otvet WHERE (((Otvet.Kod_Predmet)=".$_SESSION['KPred'].") AND ((Otvet.TabN)=".$_SESSION['TabN'].") AND ((Otvet.Kt)='".$_SESSION['KTesta']."') AND ((Otvet.Kv)='".$KodVopr."'))";
    14.         $intres1=mssql_query($DataO, $srs);
    15.         $DataO1=trim(mssql_result($intres1,0,4));
    16.         $DataO2=trim(mssql_result($intres1,1,4));
    17.         $DataO3=trim(mssql_result($intres1,2,4));
    18.         $DataO4=trim(mssql_result($intres1,3,4));
    19.         $DataO5=trim(mssql_result($intres1,4,4));
    20.         if (trim(mssql_result($intres1,0,5))==0){$СDataO1=0;} else {$СDataO1="checked";}
    21.         if (trim(mssql_result($intres1,1,5))==0){$СDataO2=0;} else {$СDataO2="checked";}
    22.         if (trim(mssql_result($intres1,2,5))==0){$СDataO3=0;} else {$СDataO3="checked";}
    23.         if (trim(mssql_result($intres1,3,5))==0){$СDataO4=0;} else {$СDataO4="checked";}
    24.         if (trim(mssql_result($intres1,4,5))==0){$СDataO5=0;} else {$СDataO5="checked";} 
    25.     }
    26.     else {
    27.     //иначе пустые данные
    28.         $DataV="";
    29.         $DataO1="";
    30.         $DataO2="";
    31.         $DataO3="";
    32.         $DataO4="";
    33.         $DataO5="";
    34.         $KodVopr=1;
    35.     }
    36. echo (...  //происходит подстановка полученных данный в HTML код
    37. //например
    38. <td style="border-style: none; border-width: medium" width="91%">
    39.                     <p align="center"><font size="5">&nbsp;</font><textarea rows="2" name="Otvet1" cols="70">'.[u]$DataO1[/u].'</textarea></td>
    40.                     <td style="border-style: none; border-width: medium" width="7%">
    41.                     <font size="5"><b>1 </b>
    42.                     <input type="checkbox" name="Ch1" value="ON" '.[u]$СDataO1[/u].' style="font-weight: 700"></font></td>
    43.  
    44.  );
    45.  
    46. // весь код программы очень большой
    47. ....?>
    интересно а php есть перехват ошибок[/php]
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    А ты уверен, что второй запрос возвращает 5 строк из б.д.? Проверь.
    PHP:
    1. <?php
    2. // ...
    3. $intres1=mssql_query($DataO, $srs);
    4. // Тут можно временно разместить вывод количества строк, чтобы проверить
    5. echo(mssql_num_rows($intres1));
    6. $DataO1=trim(mssql_result($intres1,0,4));
    7. $DataO2=trim(mssql_result($intres1,1,4));
    8. $DataO3=trim(mssql_result($intres1,2,4));
    9. $DataO4=trim(mssql_result($intres1,3,4));
    10. $DataO5=trim(mssql_result($intres1,4,4));
    11. // ...
    12. ?>
    Ты из каждой строки результата $intres1 получаешь более одного значения (используешь более одного столбца). Я бы в данном случае использовал mssql_fetch_assoc() или типа того - функцию, которая получает сразу строку и записывает в массив, а не дёргал бы по многу раз результат запроса.

    Зачем в запросах фигурируют лишние поля, которые потом нигде не используются? Или ты используешь эти данные в остальном (очень большом) коде программы?

    На какую конкретно строку ругается PHP? (он там пишет, когда ругается - и файл и номер строки...)
     
  7. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    да если данные есть в базе.

    да ты прав. но не в этом дело.
    Лишних полей нет в запросе все используются по назначению.

    конкретная ошибка
    Warning: mssql_result() [function.mssql-result]: Bad row offset (0) in C:\www\SpiTest.php on line 19

    Warning: Cannot modify header information - headers already sent by (output started at C:\www\SpiTest.php:19) in C:\www\SpiTest.php on line 36

    вторая в следствии первой.

    Я попробую еще раз объяснить суть проблемы.

    Предположим пользователь зарегистрировался и создает новый тест. ввел тему теста и сохранил в базе данных. Жмет кнопку редактировать и у загружается текущая форма. далее проверяется если записи в таблице Vopros если есть то происходит загрузка данных и в пустые поля подставляются полученные данные

    PHP:
    1. if ((mssql_num_rows($intres)>0)&& is_resource($intres)){           
    2.         $DataV=trim (mssql_result($intres,$_SESSION['NumVopr'],4));
    3.         $KodVopr = mssql_result($intres,$_SESSION['NumVopr'],3);
    4.         //Запрос на получения вариантов ответа
    5.         $DataO = "SELECT Otvet.Kod_Predmet, Otvet.TabN, Otvet.Kt, Otvet.Kv, Otvet.text, Otvet.VNV FROM Otvet WHERE (((Otvet.Kod_Predmet)=".$_SESSION['KPred'].") AND ((Otvet.TabN)=".$_SESSION['TabN'].") AND ((Otvet.Kt)='".$_SESSION['KTesta']."') AND ((Otvet.Kv)='".$KodVopr."'))";
    6.         $intres1=mssql_query($DataO, $srs);
    7.         $DataO1=trim(mssql_result($intres1,0,4));
    8.         $DataO2=trim(mssql_result($intres1,1,4));
    9.         $DataO3=trim(mssql_result($intres1,2,4));
    10.         $DataO4=trim(mssql_result($intres1,3,4));
    11.         $DataO5=trim(mssql_result($intres1,4,4));
    12.         if (trim(mssql_result($intres1,0,5))==0){$СDataO1=0;} else {$СDataO1="checked";}
    13.         if (trim(mssql_result($intres1,1,5))==0){$СDataO2=0;} else {$СDataO2="checked";}
    14.         if (trim(mssql_result($intres1,2,5))==0){$СDataO3=0;} else {$СDataO3="checked";}
    15.         if (trim(mssql_result($intres1,3,5))==0){$СDataO4=0;} else {$СDataO4="checked";}
    16.         if (trim(mssql_result($intres1,4,5))==0){$СDataO5=0;} else {$СDataO5="checked";} 
    17.     }
    если же данных в таблице Vopros не найдено, должна просто загрузиться текущая форма с пустыми полями

    PHP:
    1. else {
    2.     //иначе пустые данные
    3.         $DataV="";
    4.         $DataO1="";
    5.         $DataO2="";
    6.         $DataO3="";
    7.         $DataO4="";
    8.         $DataO5="";
    9.         $KodVopr=1;
    10.     }
    вместо пустых полей у меня выводиться выше указанная ошибка. Если записи в таблице вопрос существуют то форма загружается без проблем и без всяких ошибок.
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я, конечно, не буду утверждать - я не вижу, что там в б.д., какие данные передаются в запрос, как добавляются вопросы и т.п. Но мне всё-таки кажется, что нету нужных записей в таблице `Otvet`. Ты же проверяешь только есть ли запись в таблице `Vopros`, и если есть - делаешь запрос на получение данных из таблицы `Otvet` и, не проверив, а есть ли они - сразу начинаешь их использовать. А может быть возможна такая ситуация, что в таблице с вопросами запись есть, а в таблице с ответами для этого вопроса - записей нет.

    Да ты и сам когда описываешь проблему - пишешь, что:
    Когда пользователь создаёт новый тест - может быть сперва создаётся только вопрос? Или и ответы на этот вопрос тоже сразу создаются? Может быть ответы в б.д. записались, но связь с вопросом некорректно установилась (на сколько я понимаю, поле `Kv` - может в него записалось что-то другое, не код вопроса?)
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Напиши так:

    PHP:
    1. <?php
    2. // ...
    3. //Запрос на получения вариантов ответа
    4. $DataO = "SELECT Otvet.Kod_Predmet, Otvet.TabN, Otvet.Kt, Otvet.Kv, Otvet.text, Otvet.VNV FROM Otvet WHERE (((Otvet.Kod_Predmet)=".$_SESSION['KPred'].") AND ((Otvet.TabN)=".$_SESSION['TabN'].") AND ((Otvet.Kt)='".$_SESSION['KTesta']."') AND ((Otvet.Kv)='".$KodVopr."'))";
    5.  
    6. echo('<script type="text/javascript">alert(\'' . str_replace('\'', '\\\'', $DataO) . '\');</script>');
    7.  
    8. // ...
    9. ?>
    Выскочит SQL-запрос на получение ответов, который твой PHP-скрипт отправляет SQL-серверу. Посмотри, всё ли верно в нём, скопируй его и попробуй сделать этот запрос - через консоль или что там есть у MS SQL - я не знаю, не пользовался. Посмотри, какой результат вернёт.
     
  10. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    Когда пользователь создает тест, данные записываются строго только в одну таблицу "test" (в которой формируется код теста, название теста), я не однократно проверял это. никаких лишних записей в таблицу "vopros" не попадает тем более в таблицу 'otvet'. Соответственно при поиске вопроса, на только что созданный тест, (первый SQL запрос ) результат должен быть равен 0 'mssql_num_rows($intres)' и т.к. записей для данного теста нет (т.е. нет ни одного вопроса) выполнение второго SQL запроса не должно быть, и тем более загрузки ответов. Для этого я и пытаюсь проверить существует ли запись по указанному SQL запросу в таблице Vopros.
    А вот при сохранении первого вопроса пользователем, будет происходить запись в таблицу 'Vopros' и в таблицу 'otvet'.
     
  11. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    если записей нет в БД он все равно выводит ошибку
    Warning: mssql_result() [function.mssql-result]: Bad row offset (0) in C:\www\SpiTest.php on line 19

    Warning: Cannot modify header information - headers already sent by (output started at C:\www\SpiTest.php:19) in C:\www\SpiTest.php on line 36

    если записи есть
    то выдает ровно 5 записей которые занесены в таблицу 'otvet'
    просто у меня такое ощущение, что при сохранении темы теста мне придется автоматически заносить хотя бы по одной пустой записи в таблицу 'vopros' и 'Otvet'.
    тогда он точно будет работать.
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Используй echo, var_dump(), смотри, какие приходят значения в скрипт, что подставляется в запрос, какой получается запрос. Скопируй его символ-в-символ и сделай такой запрос не из PHP, а через какую-нибудь программу для работы с MSSQL, посмотри какой результат и т.д.
     
  13. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    Проверил я разными программами, в том числе и MSAccess, сам запрос тут не причем, он возвращает ровно то, что есть в базе данных. Если данные есть, возвращает результат, если данных нет ничего не возвращает.
    Для большей уверенности, удалил все данные из таблиц 'Vopros' и 'otvet', теперь эти две таблицы полностью пустые
    Дабы исключить лишние ошибки в программе, я убрал часть кода и оставил только один запрос на выборку данных из таблицы 'Vopros'.
    PHP:
    1.  
    2. <?php
    3. $srs = mssql_connect("localhost","sa","");
    4. if (!$srs) {echo "Non connect";}
    5. else{
    6.     mssql_select_db("Общая",$srs);
    7.     //запрос на получения вопроса
    8.     echo "<br><br>";
    9.     $qq1 = "SELECT Vopros.Kod_Predmet, Vopros.TabN, Vopros.Kt, Vopros.Kv, Vopros.Test FROM Vopros WHERE ((Vopros.Kod_Predmet=1) AND (Vopros.TabN=1) AND (Vopros.Kt='T1118112011'));";
    10.     $intres=mssql_query($qq1, $srs);
    11.    
    12.     if (!mssql_num_rows($intres)){         
    13.             echo "данных нет";
    14.     }
    15.     else {
    16.         echo "данные есть";
    17.     }}?>
    проверил этот запрос, результат был пуст, т.к. записей в таблице 'Vopros' нет, а ошибка все равно выскакивает.
    Может быть где-то в настройка самого php.ini надо что-то включить или выключить.
    Зашел на сайт где разбирают примеры аналогичные моей, пробовал как там написано, ничего не получается.
    http://php5.kiev.ua/manual/ru/function.mssql-fetch-assoc.html (((((
     
  14. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    причем самое интересное все равно ругается на 19 строку
     
  15. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    ааааааааааааааааааа
    вот я ......,
    ошибка была не в это форме, а в той которая вызывала эту форму, та условие было написано не верно. и именно в 19 строке.
    sobachnik огромное тебе спасибо за помощь, если бы не ты, я бы, наверное, еще искал ошибку
    ведь не даром говорят, что в споре рождается истинна.

    Все тему можно считать закрытой.
     
  16. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО