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

  • Автор темы Автор темы usascha
  • Дата начала Дата начала

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 не определена. При этом выполняется условие и слова "Есть" и "Анонс" появляются там где надо.

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

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

Этот вариант не работает. Всегда только "есть" показывается.

Спасибо
 
Такс, а что собственно нужно?
В смысле задача какая? На словах, а не в коде :)
 
Нужно выбрать все записи, в которых data меньше, чем текущая и через пхп назвать ее "есть". Остальные - "анонс".
data не м.б. 0000-00-00
 
Все рано не ничерта понял :) Просил же словами :)
book_id у тебя уникальный или как?
Насколько я понял, твоя задача сводится к: нужно узнать есть ли в базе записи с data < текущей - и если есть то вывести "есть", если нет то вывести "анонс". Я правильно понял? :)

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

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

Почему бы прямо в том запросе, которым выбираются строки для показа, не вычислять разность табличной даты и текущей и при выводе очередной строки проверять: разность отрицательна - "Есть", иначе - "Анонс"? Пример (не для копирования, а только для иллюстрации идеи):
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>';
    // вывести остальную инфу про книгу
}
 
Код:
(UNIX_TIMESTAMP(data) - UNIX_TIMESTAMP()) AS rel_date
просьба не приводить таких примеров.
у базы есть свои методы работы с датами.
 
Frol, прошу прощения, сам нутром чуял, что метод хреновый. А как, используя ф-ции базы, оптимально определить, является ли дата "прошлой" или "будущей"?
 
Автор оригинала: Frol
Код:
(UNIX_TIMESTAMP(data) - UNIX_TIMESTAMP()) AS rel_date
просьба не приводить таких примеров.
у базы есть свои методы работы с датами.
Так какие же они эти методы? Человек дал пример, а ему сразу говорят, чтобы он так не делал!

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

Рискну предпринять вторую попытку:
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, ИМХО, правильность либо неправильность кода определяется тем, справляется ли он со своими функциями. Так что, раз твой запрос работает, неправильным его назвать нельзя. Другое дело, что он жутко неоптимален даже с виду и наводит на мысли, что тебе стоит лучше продумать алгоритм.

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

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

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