есть код программы PHP: $qq1 = "SELECT Vopros.Kod_Predmet, Vopros.TabN, FROM Vopros WHERE ((Vopros.Kod_Predmet=".$_SESSION['KPred'].") AND (Vopros.TabN=".$_SESSION['TabN']."));"; $intres=mssql_query($qq1, $srs); if (is_resource($intres)&&(mssql_num_rows($intres)>0)){ echo ("Данные получены"); } else { //иначе пустые данные echo ("Данные не получены"); } здесь он постоянно при отсутствии записи в $intres выдает Warning: mssql_result(): Bad row offset (0) никак не могу решить эту проблему. Помогите как верно написать условие, что бы в отсутствии строк в БД в место ошибки выдавал сообщение.
PHP: <?php session_start(); $srs = mssql_connect("localhost","sa",""); if (!$srs) {echo "Non connect";} else{ mssql_select_db("Общая",$srs); //запрос на получения вопроса $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']."'));"; $intres=mssql_query($qq1, $srs); if (is_resource($intres)&&(mssql_num_rows($intres)>0)){ $DataV=trim (mssql_result($intres,$_SESSION['NumVopr'],4)); $KodVopr = mssql_result($intres,$_SESSION['NumVopr'],3); //Запрос на получения вариантов ответа $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."'))"; $intres1=mssql_query($DataO, $srs); $DataO1=trim(mssql_result($intres1,0,4)); $DataO2=trim(mssql_result($intres1,1,4)); $DataO3=trim(mssql_result($intres1,2,4)); $DataO4=trim(mssql_result($intres1,3,4)); $DataO5=trim(mssql_result($intres1,4,4)); if (trim(mssql_result($intres1,0,5))==0){$СDataO1=0;} else {$СDataO1="checked";} if (trim(mssql_result($intres1,1,5))==0){$СDataO2=0;} else {$СDataO2="checked";} if (trim(mssql_result($intres1,2,5))==0){$СDataO3=0;} else {$СDataO3="checked";} if (trim(mssql_result($intres1,3,5))==0){$СDataO4=0;} else {$СDataO4="checked";} if (trim(mssql_result($intres1,4,5))==0){$СDataO5=0;} else {$СDataO5="checked";} } else { //иначе пустые данные $DataV=""; $DataO1=""; $DataO2=""; $DataO3=""; $DataO4=""; $DataO5=""; $KodVopr=1; } echo (... //происходит подстановка полученных данный в HTML код //например <td style="border-style: none; border-width: medium" width="91%"> <p align="center"><font size="5"> </font><textarea rows="2" name="Otvet1" cols="70">'.[u]$DataO1[/u].'</textarea></td> <td style="border-style: none; border-width: medium" width="7%"> <font size="5"><b>1 </b> <input type="checkbox" name="Ch1" value="ON" '.[u]$СDataO1[/u].' style="font-weight: 700"></font></td> ); // весь код программы очень большой ....?> интересно а php есть перехват ошибок[/php]
А ты уверен, что второй запрос возвращает 5 строк из б.д.? Проверь. PHP: <?php // ... $intres1=mssql_query($DataO, $srs); // Тут можно временно разместить вывод количества строк, чтобы проверить echo(mssql_num_rows($intres1)); $DataO1=trim(mssql_result($intres1,0,4)); $DataO2=trim(mssql_result($intres1,1,4)); $DataO3=trim(mssql_result($intres1,2,4)); $DataO4=trim(mssql_result($intres1,3,4)); $DataO5=trim(mssql_result($intres1,4,4)); // ... ?> Ты из каждой строки результата $intres1 получаешь более одного значения (используешь более одного столбца). Я бы в данном случае использовал mssql_fetch_assoc() или типа того - функцию, которая получает сразу строку и записывает в массив, а не дёргал бы по многу раз результат запроса. Зачем в запросах фигурируют лишние поля, которые потом нигде не используются? Или ты используешь эти данные в остальном (очень большом) коде программы? На какую конкретно строку ругается PHP? (он там пишет, когда ругается - и файл и номер строки...)
да если данные есть в базе. да ты прав. но не в этом дело. Лишних полей нет в запросе все используются по назначению. конкретная ошибка 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: if ((mssql_num_rows($intres)>0)&& is_resource($intres)){ $DataV=trim (mssql_result($intres,$_SESSION['NumVopr'],4)); $KodVopr = mssql_result($intres,$_SESSION['NumVopr'],3); //Запрос на получения вариантов ответа $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."'))"; $intres1=mssql_query($DataO, $srs); $DataO1=trim(mssql_result($intres1,0,4)); $DataO2=trim(mssql_result($intres1,1,4)); $DataO3=trim(mssql_result($intres1,2,4)); $DataO4=trim(mssql_result($intres1,3,4)); $DataO5=trim(mssql_result($intres1,4,4)); if (trim(mssql_result($intres1,0,5))==0){$СDataO1=0;} else {$СDataO1="checked";} if (trim(mssql_result($intres1,1,5))==0){$СDataO2=0;} else {$СDataO2="checked";} if (trim(mssql_result($intres1,2,5))==0){$СDataO3=0;} else {$СDataO3="checked";} if (trim(mssql_result($intres1,3,5))==0){$СDataO4=0;} else {$СDataO4="checked";} if (trim(mssql_result($intres1,4,5))==0){$СDataO5=0;} else {$СDataO5="checked";} } если же данных в таблице Vopros не найдено, должна просто загрузиться текущая форма с пустыми полями PHP: else { //иначе пустые данные $DataV=""; $DataO1=""; $DataO2=""; $DataO3=""; $DataO4=""; $DataO5=""; $KodVopr=1; } вместо пустых полей у меня выводиться выше указанная ошибка. Если записи в таблице вопрос существуют то форма загружается без проблем и без всяких ошибок.
Я, конечно, не буду утверждать - я не вижу, что там в б.д., какие данные передаются в запрос, как добавляются вопросы и т.п. Но мне всё-таки кажется, что нету нужных записей в таблице `Otvet`. Ты же проверяешь только есть ли запись в таблице `Vopros`, и если есть - делаешь запрос на получение данных из таблицы `Otvet` и, не проверив, а есть ли они - сразу начинаешь их использовать. А может быть возможна такая ситуация, что в таблице с вопросами запись есть, а в таблице с ответами для этого вопроса - записей нет. Да ты и сам когда описываешь проблему - пишешь, что: Когда пользователь создаёт новый тест - может быть сперва создаётся только вопрос? Или и ответы на этот вопрос тоже сразу создаются? Может быть ответы в б.д. записались, но связь с вопросом некорректно установилась (на сколько я понимаю, поле `Kv` - может в него записалось что-то другое, не код вопроса?)
Напиши так: PHP: <?php // ... //Запрос на получения вариантов ответа $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."'))"; echo('<script type="text/javascript">alert(\'' . str_replace('\'', '\\\'', $DataO) . '\');</script>'); // ... ?> Выскочит SQL-запрос на получение ответов, который твой PHP-скрипт отправляет SQL-серверу. Посмотри, всё ли верно в нём, скопируй его и попробуй сделать этот запрос - через консоль или что там есть у MS SQL - я не знаю, не пользовался. Посмотри, какой результат вернёт.
Когда пользователь создает тест, данные записываются строго только в одну таблицу "test" (в которой формируется код теста, название теста), я не однократно проверял это. никаких лишних записей в таблицу "vopros" не попадает тем более в таблицу 'otvet'. Соответственно при поиске вопроса, на только что созданный тест, (первый SQL запрос ) результат должен быть равен 0 'mssql_num_rows($intres)' и т.к. записей для данного теста нет (т.е. нет ни одного вопроса) выполнение второго SQL запроса не должно быть, и тем более загрузки ответов. Для этого я и пытаюсь проверить существует ли запись по указанному SQL запросу в таблице Vopros. А вот при сохранении первого вопроса пользователем, будет происходить запись в таблицу 'Vopros' и в таблицу 'otvet'.
если записей нет в БД он все равно выводит ошибку 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'. тогда он точно будет работать.
Используй echo, var_dump(), смотри, какие приходят значения в скрипт, что подставляется в запрос, какой получается запрос. Скопируй его символ-в-символ и сделай такой запрос не из PHP, а через какую-нибудь программу для работы с MSSQL, посмотри какой результат и т.д.
Проверил я разными программами, в том числе и MSAccess, сам запрос тут не причем, он возвращает ровно то, что есть в базе данных. Если данные есть, возвращает результат, если данных нет ничего не возвращает. Для большей уверенности, удалил все данные из таблиц 'Vopros' и 'otvet', теперь эти две таблицы полностью пустые Дабы исключить лишние ошибки в программе, я убрал часть кода и оставил только один запрос на выборку данных из таблицы 'Vopros'. PHP: <?php $srs = mssql_connect("localhost","sa",""); if (!$srs) {echo "Non connect";} else{ mssql_select_db("Общая",$srs); //запрос на получения вопроса echo "<br><br>"; $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'));"; $intres=mssql_query($qq1, $srs); if (!mssql_num_rows($intres)){ echo "данных нет"; } else { echo "данные есть"; }}?> проверил этот запрос, результат был пуст, т.к. записей в таблице 'Vopros' нет, а ошибка все равно выскакивает. Может быть где-то в настройка самого php.ini надо что-то включить или выключить. Зашел на сайт где разбирают примеры аналогичные моей, пробовал как там написано, ничего не получается. http://php5.kiev.ua/manual/ru/function.mssql-fetch-assoc.html (((((
ааааааааааааааааааа вот я ......, ошибка была не в это форме, а в той которая вызывала эту форму, та условие было написано не верно. и именно в 19 строке. sobachnik огромное тебе спасибо за помощь, если бы не ты, я бы, наверное, еще искал ошибку ведь не даром говорят, что в споре рождается истинна. Все тему можно считать закрытой.