Код ниже – это первый клиентский код, а затем файл класса.
По какой-то причине метод deductTokens () вызывается дважды, тем самым взимая двойную учетную запись. Я программировал всю ночь, поэтому мне может понадобиться вторая пара глаз:
if ($action == 'place_order') { if ($_REQUEST['unlimited'] == 200) { $license = 'extended'; } else { $license = 'standard'; } if ($photograph->isValidPhotographSize($photograph_id, $_REQUEST['size_radio'])) { $token_cost = $photograph->getTokenCost($_REQUEST['size_radio'], $_REQUEST['unlimited']); $order = new ImageOrder($_SESSION['user']['id'], $_REQUEST['size_radio'], $license, $token_cost); $order->saveOrder(); $order->deductTokens(); header('location: account.php'); } else { die("Please go back and select a valid photograph size"); } } ######CLASS CODE####### <?php include_once('database_classes.php'); class Order { protected $account_id; protected $cost; protected $license; public function __construct($account_id, $license, $cost) { $this->account_id = $account_id; $this->cost = $cost; $this->license = $license; } } class ImageOrder extends Order { protected $size; public function __construct($account_id, $size, $license, $cost) { $this->size = $size; parent::__construct($account_id, $license, $cost); } public function saveOrder() { //$db = Connect::connect(); //$account_id = $db->real_escape_string($this->account_id); //$size = $db->real_escape_string($this->size); //$license = $db->real_escape_string($this->license); //$cost = $db->real_escape_string($this->cost); } public function deductTokens() { $db = Connect::connect(); $account_id = $db->real_escape_string($this->account_id); $cost = $db->real_escape_string($this->cost); $query = "UPDATE accounts set tokens=tokens-$cost WHERE id=$account_id"; $result = $db->query($query); } } ?>
Когда я умираю («$ query»); непосредственно после запроса, он печатает правильный оператор, и когда я запускаю этот запрос в MySQL, он работает отлично.
$ action = $ _REQUEST ['action'];
account.php – это всего лишь список заказов, поэтому он не вызывает downloads.php. Просто попробовал комментировать редирект, но у меня такая же проблема. Я не понимаю, как это вызвано дважды, операторы die отображают правильный запрос, и скрипт не перезагружает себя.
Вот мои журналы доступа apache:
71.*** - - [22/May/2010:13:14:35 +0000] "POST /download.php?action=confirm_download&photograph_id=122 HTTP/1.1" 200 1951 "http://***.com/viewphotograph.php?photograph_id=122" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)" 71.*** - - [22/May/2010:13:14:36 +0000] "GET /download.php?action=place_order&photograph_id=122&size_radio=xsmall&unlimited=0 HTTP/1.1" 302 453 "http://*** .com/download.php?action=confirm_download&photograph_id=122" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)" 71.*** - - [22/May/2010:13:14:36 +0000] "GET /download.php?action=place_order&photograph_id=122&size_radio=xsmall&unlimited=0 HTTP/1.1" 302 453 "http://*** .com/download.php?action=confirm_download&photograph_id=122" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)" 71.*** - - [22/May/2010:13:14:36 +0000] "GET /account.php HTTP/1.1" 200 2626 "http://***.com/download.php?action=confirm_download&photograph_id=122" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)"
Я понимаю, что здесь явно что-то не так. Но я не могу понять, откуда приходит второй запрос.
Еще один длинный снимок, но это случилось со мной однажды в Firefox – удвоенные исполнения страниц, что привело к удвоению вложений и обновлений – закройте браузер и перезапустите.
Линия:
header('location: account.php');
Пересылает браузер, но не заканчивает сценарий php .
Это может быть хорошо, фрагмент кода, который вы дали, не делает «ничего» после этой строки.
Другим вариантом может быть двойной щелчок
Если вы дважды щелкните по кнопке отправки, форма будет отправлена дважды.
Мы использовали javascript для отключения кнопки отправки после первого щелчка.
Я знаю, что это будет звучать странно, но убедитесь, что у вас нет тега с атрибутом src = "" или любым стилем css, ссылающимся на пустой URL-адрес (например, background: url ();) на вашем сайте по всему месту, когда у вас есть код, который выполняется дважды.
Читайте о некоторых проблемах, которые могут возникнуть здесь: http://hi.baidu.com/zhenyk/blog/item/38a1051fc63b96c3a686698f.html