Wednesday, August 22nd, 2007 02:58 pm
Прям хоть на собеседованиях разработчикам предлагай.
Вот этот кусок кода на PHP (на самом деле, язык не принципиален) хронически вызывает двойной вызов функции и, соответственно, двойную вставку данных в базу.

<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>

Но стоит убрать из td цвет, как все волшебным образом начинает работать правильно.

Утащено отсюда. Но прежде чем смотреть там правильные ответы, попробуйте понять сами.
Wednesday, August 22nd, 2007 02:20 pm (UTC)
поясни тупому в трех словах, почему второй раз парсится
Wednesday, August 22nd, 2007 02:32 pm (UTC)
потому что там вместо background должен быть bgcolor.
Дальше понял? :)
Wednesday, August 22nd, 2007 02:46 pm (UTC)
Перепутал человек атрибуты background и bgсolor.
В результате td background=#fff7eb вызывает страницу еще раз с якорем #fff7eb
Wednesday, August 22nd, 2007 03:33 pm (UTC)
правильно :) сколько времени ушло на ответ?
Wednesday, August 22nd, 2007 04:03 pm (UTC)
Я подсмотрел. =)

Это задача на банальную наблюдательность. Сам навряд ли опишешься так, а если напишешься, то в реальных условиях баг отловить просто.
Wednesday, August 22nd, 2007 03:53 pm (UTC)
классно! понравилось. но сам не догадался.
Wednesday, August 22nd, 2007 04:08 pm (UTC)
Нихера не понял. но при наличии в "боекомплекте" двух десятков remote root против freebsd - это совершенно пофигу.
Wednesday, August 22nd, 2007 04:12 pm (UTC)
И, кстати, закатай код - а то pre ленту рвет.
Wednesday, August 22nd, 2007 04:49 pm (UTC)
эм. а у тебя экран какой ширины?
Wednesday, August 22nd, 2007 04:58 pm (UTC)
Экран - 1600, окно броузера - 1024.
Wednesday, August 22nd, 2007 04:19 pm (UTC)
ооооо, надо атрибуты брать в кавычки, в двойные.
Wednesday, August 22nd, 2007 04:20 pm (UTC)
это, как-бы понятно, непонятно почему два раза вставляет :)
Wednesday, August 22nd, 2007 05:15 pm (UTC)
bgcolor != background ;-)
Wednesday, August 22nd, 2007 05:57 pm (UTC)
да я уж почитал ответ :)
Wednesday, August 22nd, 2007 04:49 pm (UTC)
это да, но на эффект не влияет :)
Wednesday, August 22nd, 2007 05:58 pm (UTC)
кстати, интересно, есть валидатор линков который поймает это?
Wednesday, August 22nd, 2007 04:54 pm (UTC)
В ёлочки!
Wednesday, August 22nd, 2007 05:11 pm (UTC)
Отличная ошибка.
Браузер-то ждет что ему отдадут урл в атрибуте бекграунд.
Wednesday, August 22nd, 2007 04:47 pm (UTC)
Пыхпых тут, действительно, не при чём. Это от незнания хатэмээля. Путают bgcolor с background и потом удивляются - чего оно два раза страницу дёргает :)
Wednesday, August 22nd, 2007 04:51 pm (UTC)
Правильно :)
Wednesday, August 22nd, 2007 05:00 pm (UTC)
art.lebedev завел моду кавычки опускать.
Wednesday, August 22nd, 2007 06:48 pm (UTC)
кавычки тут ни при чем, с ними ровно то же самое
Wednesday, August 22nd, 2007 06:58 pm (UTC)
ааа.. bgcolor жесть. никогда бы не додумался.
Wednesday, August 22nd, 2007 10:07 pm (UTC)
+5 to dil
Wednesday, August 22nd, 2007 11:04 pm (UTC)
Про background заметил, что # напоминает anchor - вспомнил, сложить вместе - не догадался :(

Старею :(
Thursday, August 23rd, 2007 03:00 am (UTC)
Та же фигня.
Thursday, August 23rd, 2007 05:59 am (UTC)
Блядь. Саш. Ошибка заключается в том, что стейт кода не должен передаваться через веб-страницу. А не в том, что кто-то ошибся в атрибуте. Но поскольку "не принципиальный язык" PHP не умеет хранить стейт между запросами (кроме как в БД), все пэхапэ-колбасеры пишут вот так, как тут у тебя. И получается гавнокод, поведение которого зависит от числа вызовов страниц.

То есть: если этот код протоколирует показы страниц, то двойная запись - верное поведение.
Если нет - то двойная запись - неверное поведение ВНЕ зависимости от того, вызвал её неправильный атрибут или релоад в броузере.
Thursday, August 23rd, 2007 06:52 am (UTC)
Дим, язык _не принципиален_. Не то, чтобы я очень любил PHP, но в данном случае ты на него наехал не по делу. Это могло быть написано на перле, ASP, JSP, чистой джаве, ColdFusion и на любом другом серверном языке. С тем же результатом.

PHP уже давно умеет хранить state в абстракции под названием "сессия". http://www.php.net/manual/en/ref.session.php

Я не знаю точно, чтО имел в виду автор кода, но по-моему, именно протоколирование показов страницы, а не запоминание состояния. Во втором случае был бы какой-нибудь UPDATE или комбинация его с INSERT'ом.
Поведение получилось формально правильное, но не то, которое имелось в виду. Потому что запросов было два, они и посчитались, а показов только один, причем про второй достоверно известно, что его никто никогда увидеть не может :)
Friday, August 24th, 2007 06:44 am (UTC)
Ну - может. Без знания более общей картины, конечно, трудно разобраться.
Thursday, August 23rd, 2007 11:51 pm (UTC)
Кажется, сессии были даже в PHP3.

Так давно не перечитывал мануал?
Friday, August 24th, 2007 06:36 am (UTC)
Давно. Да и зачем. По коду видно, что ход мысли колбасеров от этого не изменился.
Friday, August 24th, 2007 07:12 am (UTC)
Штырит, штырит колбасёра
Наша пати до упора
Friday, August 24th, 2007 08:42 am (UTC)
Дим, а если б этот mysql_query был закопан глубоко внутри класса на сервере, а background вместо bgcolor - в совершенно отдельном xslt, тебе бы было легче? :)
Saturday, September 1st, 2007 06:07 am (UTC)
Мне - нет, а некоторым страницам Яндекса, состояние которых последние шесть лет теряется при проходе через авторизацию - да.
Friday, October 12th, 2007 10:12 pm (UTC)
Блин. Надо же. Гениальная ошибка!