переменная не определена - обработка ошибок (E_ALL)

usascha

Новичок
переменная не определена - обработка ошибок (E_ALL)

У меня есть вполне рабочий код:
PHP:
while ($row=mysql_fetch_array($book_data)) {
	$id = $row['book_id'];
	$data_l = $row['data'];
	}
if ($data_l) {echo "Есть!<br>";
} else {
echo "<font color=#FF0000><strong>Анонс!</strong></font><br>";
}
Что мне нужно он делает, но если включить обработку ошибок:
PHP:
ini_set("display_errors", "1");
error_reporting(E_ALL);
то выскакивает сообщение что переменная $data_l не определена. При этом выполняется условие и слова "Есть" и "Анонс" появляются там где надо.

Вопрос: это нормально или я криво написал код? Что сделать чтобы убрать (отключать обработку ошибок пока не хочу)?
 

Profic

just Profic (PHP5 BetaTeam)
По большому счету - криво :)
В общем оно болжно было выглядеть где-то так :)
PHP:
while ($row = mysql_fetch_array ($book_data)) {}
if (isset ($row['data']))) {
    echo 'Есть!<br>';
} else {
    echo '<font color=#FF0000><strong>Анонс!</strong></font><br>';
}
Но все равно криво, т.к. если запрос может вернуть (я то его не вижу) только одну строку, то цикл тут не особо нужен, если может вернуть не одну (судя по коду используется то одна), то нужно пофиксить запрос :)

А вообще если нужно использовать отдельные переменные, то следует их всегда определять. Т.е. перед своим циклом присваиваешь им пустые значения и все :)
 

usascha

Новичок
Вот сам запрос:
PHP:
$book_data = mysql_query("SELECT book_id, data
			FROM book 
			WHERE data < CURDATE()
			AND book_id = $id") 
or die(mysql_error());
Этот вариант не работает. Всегда только "есть" показывается.

Спасибо
 

Profic

just Profic (PHP5 BetaTeam)
Такс, а что собственно нужно?
В смысле задача какая? На словах, а не в коде :)
 

usascha

Новичок
Нужно выбрать все записи, в которых data меньше, чем текущая и через пхп назвать ее "есть". Остальные - "анонс".
data не м.б. 0000-00-00
 

Profic

just Profic (PHP5 BetaTeam)
Все рано не ничерта понял :) Просил же словами :)
book_id у тебя уникальный или как?
Насколько я понял, твоя задача сводится к: нужно узнать есть ли в базе записи с data < текущей - и если есть то вывести "есть", если нет то вывести "анонс". Я правильно понял? :)

ЗЫ. Мну сегодня телепатит что-то неподетски :)
 

Profic

just Profic (PHP5 BetaTeam)
Frol
Скорее всего именно это ему и нужно, а может и вообще COUNT() :)
Но блин пока поймешь, что именно ему нужно :)
 

Frol

Новичок
Profic
если не понял -- то зачем писать столько лишнего?
желательнее в таком случае попросить переформулировать вопрос или промолчать.
 

Screjet

Новичок
В названии переменной ниче не напутал?

зы. Вообще то похожие символы типа "маленькая L" и "1" и "большая i", "буква О" и "ноль" и .т.д. не рекомендуется использовать в названиях, логинах и паролях:)
 

usascha

Новичок
Автор оригинала: Profic
Frol
Скорее всего именно это ему и нужно, а может и вообще COUNT() :)
Но блин пока поймешь, что именно ему нужно :)
Что именно тебе не понятно? Задача состоит в выборе одного вида записей и присваивание им одного значения, а всем остальным - другого.
 

SelenIT

IT-лунатик :)
Простите, кажется, тут выводится информация о товарах (по-видимому, книгах), и для каждой из них делается дополнительный запрос, чтобы определить, есть каждая из них в наличии или только будет?

Почему бы прямо в том запросе, которым выбираются строки для показа, не вычислять разность табличной даты и текущей и при выводе очередной строки проверять: разность отрицательна - "Есть", иначе - "Анонс"? Пример (не для копирования, а только для иллюстрации идеи):
PHP:
$book_data = mysql_query("SELECT book_id, data, ... , (/*тут я пытался определить разность дат*/) AS rel_date
            FROM book 
            WHERE ограничения_выборки 
            ORDER BY параметр_сортировки
            LIMIT сколько_надо") or die(mysql_error());
while ($row = mysql_fetch_assoc ($book_data)) {
    if ($row['rel_date']<0) echo 'Есть!<br>';
    else echo '<font color="#FF0000"><strong>Анонс!</strong></font><br>';
    // вывести остальную инфу про книгу
}
 

Frol

Новичок
Код:
(UNIX_TIMESTAMP(data) - UNIX_TIMESTAMP()) AS rel_date
просьба не приводить таких примеров.
у базы есть свои методы работы с датами.
 

SelenIT

IT-лунатик :)
Frol, прошу прощения, сам нутром чуял, что метод хреновый. А как, используя ф-ции базы, оптимально определить, является ли дата "прошлой" или "будущей"?
 

usascha

Новичок
Автор оригинала: Frol
Код:
(UNIX_TIMESTAMP(data) - UNIX_TIMESTAMP()) AS rel_date
просьба не приводить таких примеров.
у базы есть свои методы работы с датами.
Так какие же они эти методы? Человек дал пример, а ему сразу говорят, чтобы он так не делал!

Почему мой пример и SilenIT неправильные?
 

SelenIT

IT-лунатик :)
Ох... намудрил я в прошлый раз, конечно... и как это мне сразу не пришло в голову запросить из базы готовое логическое значение "было - не было"?

Рискну предпринять вторую попытку:
PHP:
$book_data = mysql_query("SELECT book_id, data, ... , (data <= NOW()) AS already FROM ..... ") or die(mysql_error());
while ($row = mysql_fetch_assoc ($book_data)) {
    if ($row['already']) echo 'Есть!<br>';
    else echo '<font color="#FF0000"><strong>Анонс!</strong></font><br>';
    // ....
}
А общая идея та же.

usascha, ИМХО, правильность либо неправильность кода определяется тем, справляется ли он со своими функциями. Так что, раз твой запрос работает, неправильным его назвать нельзя. Другое дело, что он жутко неоптимален даже с виду и наводит на мысли, что тебе стоит лучше продумать алгоритм.

Нельзя ли немного уточнить твою задачу?
 

usascha

Новичок
Ваш предыдущий код тоже заработал когда я вместо
предложенного
if (isset ($row['data']))

написал :
if (isset ($data_l))

А сама задача сводится к простой информации для постителя - есть ли показываемая книга в продаже или она только анонсируется. Если указанная в базе data_l в будущем, то это анонс, а если она в прошлом, то книгу уже можно купить.
 
Сверху