dil: (Default)
dil ([personal profile] dil) wrote2007-08-22 02:58 pm
Entry tags:

Вебдевелоперам. Очень, ОЧЕНЬ красивая ошибка

Прям хоть на собеседованиях разработчикам предлагай.
Вот этот кусок кода на 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 цвет, как все волшебным образом начинает работать правильно.

Утащено отсюда. Но прежде чем смотреть там правильные ответы, попробуйте понять сами.

[identity profile] motto.livejournal.com 2007-08-22 02:20 pm (UTC)(link)
поясни тупому в трех словах, почему второй раз парсится

[identity profile] dil.livejournal.com 2007-08-22 02:32 pm (UTC)(link)
потому что там вместо background должен быть bgcolor.
Дальше понял? :)

[identity profile] ex-acerbial236.livejournal.com 2007-08-22 02:46 pm (UTC)(link)
Перепутал человек атрибуты background и bgсolor.
В результате td background=#fff7eb вызывает страницу еще раз с якорем #fff7eb

[identity profile] dil.livejournal.com 2007-08-22 03:33 pm (UTC)(link)
правильно :) сколько времени ушло на ответ?

[identity profile] ex-acerbial236.livejournal.com 2007-08-22 04:03 pm (UTC)(link)
Я подсмотрел. =)

Это задача на банальную наблюдательность. Сам навряд ли опишешься так, а если напишешься, то в реальных условиях баг отловить просто.

[identity profile] ivlad.livejournal.com 2007-08-22 03:53 pm (UTC)(link)
классно! понравилось. но сам не догадался.

[identity profile] pzrk.livejournal.com 2007-08-22 04:08 pm (UTC)(link)
Нихера не понял. но при наличии в "боекомплекте" двух десятков remote root против freebsd - это совершенно пофигу.

[identity profile] pzrk.livejournal.com 2007-08-22 04:12 pm (UTC)(link)
И, кстати, закатай код - а то pre ленту рвет.

[identity profile] dil.livejournal.com 2007-08-22 04:49 pm (UTC)(link)
эм. а у тебя экран какой ширины?

[identity profile] pzrk.livejournal.com 2007-08-22 04:58 pm (UTC)(link)
Экран - 1600, окно броузера - 1024.

[identity profile] ex-1smash1100.livejournal.com 2007-08-22 04:19 pm (UTC)(link)
ооооо, надо атрибуты брать в кавычки, в двойные.

[identity profile] bormotov.livejournal.com 2007-08-22 04:20 pm (UTC)(link)
это, как-бы понятно, непонятно почему два раза вставляет :)

[identity profile] dmarck.livejournal.com 2007-08-22 05:15 pm (UTC)(link)
bgcolor != background ;-)

[identity profile] bormotov.livejournal.com 2007-08-22 05:57 pm (UTC)(link)
да я уж почитал ответ :)

[identity profile] dil.livejournal.com 2007-08-22 04:49 pm (UTC)(link)
это да, но на эффект не влияет :)

[identity profile] bormotov.livejournal.com 2007-08-22 05:58 pm (UTC)(link)
кстати, интересно, есть валидатор линков который поймает это?

[identity profile] ex-1smash1100.livejournal.com 2007-08-22 05:11 pm (UTC)(link)
Отличная ошибка.
Браузер-то ждет что ему отдадут урл в атрибуте бекграунд.

[identity profile] webushka.livejournal.com 2007-08-22 04:47 pm (UTC)(link)
Пыхпых тут, действительно, не при чём. Это от незнания хатэмээля. Путают bgcolor с background и потом удивляются - чего оно два раза страницу дёргает :)

[identity profile] dil.livejournal.com 2007-08-22 04:51 pm (UTC)(link)
Правильно :)

[identity profile] dkfl.livejournal.com 2007-08-22 05:00 pm (UTC)(link)
art.lebedev завел моду кавычки опускать.

[identity profile] dil.livejournal.com 2007-08-22 06:48 pm (UTC)(link)
кавычки тут ни при чем, с ними ровно то же самое

[identity profile] dkfl.livejournal.com 2007-08-22 06:58 pm (UTC)(link)
ааа.. bgcolor жесть. никогда бы не додумался.

[identity profile] maxdm.livejournal.com 2007-08-22 10:07 pm (UTC)(link)
+5 to dil

[identity profile] b-a-t.livejournal.com 2007-08-22 11:04 pm (UTC)(link)
Про background заметил, что # напоминает anchor - вспомнил, сложить вместе - не догадался :(

Старею :(

[identity profile] danfe.livejournal.com 2007-08-23 03:00 am (UTC)(link)
Та же фигня.

[identity profile] dz.livejournal.com 2007-08-23 05:59 am (UTC)(link)
Блядь. Саш. Ошибка заключается в том, что стейт кода не должен передаваться через веб-страницу. А не в том, что кто-то ошибся в атрибуте. Но поскольку "не принципиальный язык" PHP не умеет хранить стейт между запросами (кроме как в БД), все пэхапэ-колбасеры пишут вот так, как тут у тебя. И получается гавнокод, поведение которого зависит от числа вызовов страниц.

То есть: если этот код протоколирует показы страниц, то двойная запись - верное поведение.
Если нет - то двойная запись - неверное поведение ВНЕ зависимости от того, вызвал её неправильный атрибут или релоад в броузере.

[identity profile] dil.livejournal.com 2007-08-23 06:52 am (UTC)(link)
Дим, язык _не принципиален_. Не то, чтобы я очень любил PHP, но в данном случае ты на него наехал не по делу. Это могло быть написано на перле, ASP, JSP, чистой джаве, ColdFusion и на любом другом серверном языке. С тем же результатом.

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

Я не знаю точно, чтО имел в виду автор кода, но по-моему, именно протоколирование показов страницы, а не запоминание состояния. Во втором случае был бы какой-нибудь UPDATE или комбинация его с INSERT'ом.
Поведение получилось формально правильное, но не то, которое имелось в виду. Потому что запросов было два, они и посчитались, а показов только один, причем про второй достоверно известно, что его никто никогда увидеть не может :)

[identity profile] dz.livejournal.com 2007-08-24 06:44 am (UTC)(link)
Ну - может. Без знания более общей картины, конечно, трудно разобраться.

[identity profile] kukutz.livejournal.com 2007-08-23 11:51 pm (UTC)(link)
Кажется, сессии были даже в PHP3.

Так давно не перечитывал мануал?

[identity profile] dz.livejournal.com 2007-08-24 06:36 am (UTC)(link)
Давно. Да и зачем. По коду видно, что ход мысли колбасеров от этого не изменился.

[identity profile] kukutz.livejournal.com 2007-08-24 07:12 am (UTC)(link)
Штырит, штырит колбасёра
Наша пати до упора

[identity profile] dil.livejournal.com 2007-08-24 08:42 am (UTC)(link)
Дим, а если б этот mysql_query был закопан глубоко внутри класса на сервере, а background вместо bgcolor - в совершенно отдельном xslt, тебе бы было легче? :)

[identity profile] dz.livejournal.com 2007-09-01 06:07 am (UTC)(link)
Мне - нет, а некоторым страницам Яндекса, состояние которых последние шесть лет теряется при проходе через авторизацию - да.

[identity profile] computer-bug.livejournal.com 2007-10-12 10:12 pm (UTC)(link)
Блин. Надо же. Гениальная ошибка!