PHP: головоломка
24 Авг 2007Хотите поломать голову над задачкой по веб-программированию ? Пожалуйста. Есть код:
<table><tr><td background=#fff7eb id=message>
<?php mysql_query("INSERT INTO `res_action` (`type`, `date`, `id`, `from`, `to`, `text`, `viewed`, `hidden`)
VALUES ('hate', '08/08/07 12:15', 1070808121557, 'foo', 'bar', '', '0', '0')"); ?>
</td></tr></table>
При обработке такого кода происходит ошибка — запись добавляется в базу два раза. Стоит убрать из таблицы цвет фона — ошибка исчезает. В продолжении — ответ на задачу. Кто сообразит без подсказки ?
Программист перепутал атрибуты background и bgсolor. В результате td background=#fff7eb вызывает страницу еще раз с якорем #fff7eb, а страница добавляет ещё одну запись в базу. Имхо, шикарный пример ошибки, возникшей на грани HTML и PHP.
Забавно…
На самом деле атрибута background для TD не предусмотрено. Поэтому наверное сильно умный браузер думает, что это из css пришло и пытается его так обработать. По идее не должны исправить положение даже кавычки. И на самом деле ошибка все-таки не в PHP а в html. Хотя если бы в php была проверка, к примеру, на IP в течение определенного времени, то повторный просмотр можно было бы игнорировать. Но это уже друга история, а пример поучительный…
Абсолютно верно. Добавлю, что background — свойство элементов в CSS, поэтому перепутать было вполне реально.
У меня выполняется один раз всегда.
Там ещё от понимания браузером бэкграунда зависит на самом деле =)
Поучительно…
Владимир!! Благодетель!! :)
Несколько дней назад писал плагин к cms — как раз с показом форм и записью в базу — и не мог понять, почему записи дублируются при сохранении. Похоже, дело как раз в этом :))
Ржу всем офисом :-D
Картинку нашёл :-D :
Вова, извини, но ответ дан не совсем полно.
Во-первых, ошибка не в PHP, а в HTML.
Во-вторых, атрибут background — задает фоновый рисунок,в данном случае ячейки (к сожалению не помню в какой версии стандарта HTML это описано). Например:
.
В-третьих, решетка, как ты правильно заметил, в урле используется как якорь. Например:
…
Теперь ответить на вопрос почему приведенные код грузит страницу два раза совсем просто, для этого достаточно переписать его текст так:
Очевидно, что если empty_url=»» (пустой урл) то браузер автоматически подставит урл текущей страницы.
Так же рекомендую ответить для себя на вопрос почему , тоже загрузит страницу два раза, а уже нет! :-)
Блин, косяк с кодом на HTML получился :-(
Смысл в том, что <td background=»some_url#tess»< будет грузить текущую страницу повторно (вместо фона!) если some_url будет пустым (по умолчанию браузер подставит текущий location)
Ну теги у тебя вырезало (спецсимволы рулят), но я тебя понял =)
Прекрасно понимаю, что ты имел в виду, я просто не стал расписывать это, считая, что все поймут намёк ;-)
И еще раз, в догонку.
Возможно более понятно будет на таком примере:
>img src=#fff7eb /<
при таком раскладе тоже бы дублировались записи в БД
Все… Мне пора спать!!! :-))
>img src=#fff7eb /<
Теперь вроде правильно!
Блин… Опять не правильно… РРРРРРРРРРРРРРРРРРРРР…
<img src=#fff7eb >
Все… Теперь спать… А то после пива у меня уже голова еле варит!
Очень забавно :) Серьезно )
Для тех, у кого стало один раз писаться в базу замечу, что броузера могут кэшировать ресурсы, и ресурс «someurl##fff7eb», которая как фон кэшируется броузером и при следующих запросах может не закружатся.
это понятно )
bgcolor — цвет
background — рисунок
в данном случае использовать background для цвета является ошибкой
1. Нет, как в голову взбредёт.
2. Прекратить линк-спам.
И этот некорректный код все браузеры обрабатывают одинаково? IE, Opera, Firefox?
>Прекратить линк-спам.
Вам не кажется, что это паранойя, своеобразная мания преследования комментаторами :)
Может стоит отключить комментарии :)
Да нет, просто когда человек вместо своего блога пишет какой-нить hentai — bondge — xxx — giperhard porno — паранойя уже уместна =)
Ну если так, то конечно.
Ну тогда следовало бы конкретней писать о том, к кому имено адресовалось замечание про «линк-спам».
Ибо каждый мог воспринять его на свой счёт.
Ну здесь если всмотреться, то можно заметить древовидную структуру комментариев, а моё сообщение про линк-спам — ответное на сообщение Андрея, именно ему и адресовано.
Не переживайте вы так, может у мну просто настроение было плохое )))
Супер пример, всем начал загадывать, еще никто правильно не ответил.
А помоему ничего необычного, вы насильно пытаетесь запутать браузер, Валидней верстать и выносить всё оформление в цсс.