Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Несуществующий адрес - выдаётся ошибка
 
 автор: Радосвет   (11.05.2006 в 00:20)   письмо автору
 
 

Если набираю в строке несуществующий адрес статьи ( ./doc/index.php?id_page=5 ), выводится ПЕРЕД шапкой сайта такая ошибка:

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 3 in /home/site/public_html/doc/index.php on line 14

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 4 in /home/site/public_html/doc/index.php on line 15

На эти строках у меня такой код:


  if(!empty($_GET['id_page'])) 
  { 
    if(!preg_match("|^[\d]+$|",$_GET['id_page'])) exit("Недопустимый формат URL"); 
    $query = "SELECT title_html FROM artpage WHERE id_artpage = ".$_GET['id_page']." LIMIT 1"; 
    $query2 = "SELECT name FROM artpage WHERE id_artpage = ".$_GET['id_page']." LIMIT 1"; 
    $pag = mysql_query($query); 
    $pag_name = mysql_query($query2);
    if(!$pag) exit("Ошибка при обращении к таблице разделов"); 
    $title = mysql_result($pag,0); 
    $ttl_name = mysql_result($pag_name,0);
  } 

Эти две строки последине:
$title = mysql_result($pag,0);
$ttl_name = mysql_result($pag_name,0);

Как можно избавиться от ошибки? И в чём её суть?

Заранее спасибо! :)

   
 
 автор: mtxd   (11.05.2006 в 00:45)   письмо автору
 
   для: Радосвет   (11.05.2006 в 00:20)
 

Суть в том, что зачем переходить в полю 0 если у тебя и так LIMIT 1?
Попробуй
$title = mysql_result($pag);
И проверка у тебя не даст правильного ответа, так как в $pag будет записано Resource #
Если я конечно правильно понял. Вообще криво как-то... почему не сделать так?

<?
$request  
mysql_query(SELECT title_html,name FROM artpage WHERE id_artpage ".$_GET['id_page']." LIMIT 1";) or die (mysql_error());
if (
$request) {
   
$result = mysql_fetch_object($request);
   
$title = $result->title_html;
   
$ttl_name = $result->name;
}
?>

   
 
 автор: Радосвет   (11.05.2006 в 01:10)   письмо автору
 
   для: mtxd   (11.05.2006 в 00:45)
 

mtxd, спасибо за ответ, за советы! :)

Попробовал вот так: $title = mysql_result($pag); , выдаёт иную ошибку:

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 3 in /home/site/public_html/doc/index.php on line 14

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 4 in /home/site/public_html/doc/index.php on line 15

А вот этот код вообще синтаксическую ошибку выдаёт:


$request  = mysql_query(SELECT title_html,name FROM artpage WHERE id_artpage = ".$_GET['id_page']." LIMIT 1";) or die (mysql_error()); 
if ($request) { 
   $result = mysql_fetch_object($request); 
   $title = $result->title_html; 
   $ttl_name = $result->name; 
}


Ошибка в этой строке $request = mysql_query(SELECT title_html,name FROM artpage WHERE id_artpage = ".$_GET['id_page']." LIMIT 1";) or die (mysql_error());

Вообще, то что у меня - оно, может, и криво, но исправно работает вроде.. :)

   
 
 автор: cheops   (11.05.2006 в 01:43)   письмо автору
 
   для: Радосвет   (11.05.2006 в 01:10)
 

Строку
<?php
$request  
mysql_query(SELECT title_html,name FROM artpage WHERE id_artpage ".$_GET['id_page']." LIMIT 1";) or die (mysql_error());
?>

следует заменить на
<?php
$request  
mysql_query("SELECT title_html,name FROM artpage WHERE id_artpage = ".$_GET['id_page']." LIMIT 1";) or die (mysql_error());
?>

   
 
 автор: Радосвет   (11.05.2006 в 02:08)   письмо автору
 
   для: cheops   (11.05.2006 в 01:43)
 

cheops, спасибо! Я записал вот так:


<?php
    $request 
mysql_query("SELECT title_html,name FROM artpage WHERE id_artpage = ".$_GET['id_page']." LIMIT 1") or die (mysql_error());
    if (
$request
    { 
   
$result mysql_fetch_object($request); 
   
$title $result->title_html
   
$ttl_name $result->name
    }
?>

Но в данном случае на странице статьи (./doc/index.php?id_article=1) выводит вот что:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 1' at line 1

Убираю из функции код " or die (mysql_error()); " - всё работает!

   
 
 автор: cheops   (11.05.2006 в 10:24)   письмо автору
 
   для: Радосвет   (11.05.2006 в 02:08)
 

Так писать
<?php
$request 
mysql_query("SELECT title_html,name FROM artpage WHERE id_artpage = ".$_GET['id_page']." LIMIT 1") or die (mysql_error());
?>

нельзя, либо так
<?php
mysql_query
("SELECT title_html,name FROM artpage WHERE id_artpage = ".$_GET['id_page']." LIMIT 1") or die (mysql_error());
?>

либо так
<?php
$request 
mysql_query("SELECT title_html,name FROM artpage WHERE id_artpage = ".$_GET['id_page']." LIMIT 1");
if(!
$request) exit(mysql_error());
?>

Так как операция присваивания всегда даёт 1 и второй оператор or будет вычисляться всегда.

   
 
 автор: mtxd   (11.05.2006 в 10:35)   письмо автору
 
   для: cheops   (11.05.2006 в 10:24)
 

>>>Так писать нельзя
Нельзя в смысле вообще нельзя, или это не правильно? У меня такая конструкция работает в нескольких местах, причем при возникновении ошибки делает то же самое, что и приведенный вами код.

   
 
 автор: cheops   (11.05.2006 в 12:47)   письмо автору
 
   для: mtxd   (11.05.2006 в 10:35)
 

Так писать не правильно, дело в том, что это перловские штучки - оператор or не вычисляет второй аргумент, если первый равен true. Когда мы пишем
mysql_query() or die()

Всё нормально, если mysql_query() возвращает дескриптор второй аргумент or - die() не вычисляется и программа продолжает работать, если возвращается NULL, второй оператор вычисляется и останавливает работу.
Если мы пишем
$res = mysql_query() or die()

то, даже в случае возникновения ошибки die() срабатывать не будет, так как or - имеет меньший приоритет чем =, а операция = всегда возвращает true, поэтому второй аргумент можно не вычислять.

PS Вообще or die() - пример самого дурного тона, так как мало того, предложение малочитабельное, провоцирует на ошибки - оно ещё зависит от реализации оператора or, т.е. нарушает инкапсуляцию. В Perl это простительно - это хакерский язык, сложная, запутанная программа, которая тем не менее работает - там доблесть, в PHP, который ориентируется на промышленный код, а следовательно, программы должный быть максимально надёжными и читабельными - таких хакерских штучек лучше избегать.

   
 
 автор: Trianon   (11.05.2006 в 13:29)   письмо автору
 
   для: cheops   (11.05.2006 в 12:47)
 

Cheops, попробуйте выполнить вот такой скрипт:

<?
   $a 
0;   $b 1;   $c 2;   $d 3;
   
$b $a or $d $c;
   
var_dump($b);    var_dump($d);

   
$c = ($b "Joy");
   
var_dump($c);
?>

а потом заменить or на || и выполнить его еще раз.

И Вы убедитесь, что
1. операция or отличается от операции || приоритетом. Первая по приоритету ниже операции = , а вторая выше. О чем, кстати, написано в мануале, здесь и здесь.

2. Операция присваивания возвращает значение своего правого аргумента. О чем написано здесь

Я согласен с Вами в том, что уважающий себя программист хакерских штучек должен избегать.
Но не согласен с тем, что можно называть хакерскими штучками, а что нельзя.
Если идти по Вашему пути, можно любой язык выхолостить до уровня сабсет-алгола.
То-то надежный код будет....

   
 
 автор: cheops   (11.05.2006 в 22:09)   письмо автору
 
   для: Trianon   (11.05.2006 в 13:29)
 

1) Я в курсе.
2) Да это так.

PS Я не выступаю против упрощения конструкций и языка, просто философия Perl - это философия Perl и она идёт в другую сторону, нежели PHP. Perl - это поэзия, утопия, попытка говорить языком машины с красотой и сложностью обычного языка. PHP - это инструмент и средство зарабатывания денег, вся романтика в нём от Perl (но в кастрированном и урезанном виде). Язык предназначен для решения задач, задачей PHP никогда не будет сочинение на нём стихов, а на Perl по этому поводу устраиваются конкурсы. В Perl - коммуна, в PHP - коммунити, которое развалится как только оно перестанет быть выгодным членам.

   
 
 автор: Trianon   (11.05.2006 в 12:42)   письмо автору
 
   для: cheops   (11.05.2006 в 10:24)
 

>Так писать
>$request = mysql_query(".......") or die (mysql_error());
>нельзя, ....так как операция присваивания всегда даёт 1 и второй
>оператор or будет вычисляться всегда.

Это почему же? Операция присваивания даст то, что вернул mysql_query.
Если mysql_query вернул ошибку (т.е. false) то or даст выполнить вторую часть с диагностикой.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования