November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
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 цвет, как все волшебным образом начинает работать правильно.

Утащено отсюда. Но прежде чем смотреть там правильные ответы, попробуйте понять сами.
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)
Мне - нет, а некоторым страницам Яндекса, состояние которых последние шесть лет теряется при проходе через авторизацию - да.