PHP: обновление дублирующего запроса MySQL без причины - PullRequest
1 голос
/ 22 мая 2010

Код ниже - это сначала код клиента, а затем файл класса.

По какой-то причине метод 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)"

Я понимаю, что здесь явно что-то не так. Но я не могу понять, откуда поступает второй запрос.

Ответы [ 3 ]

1 голос
/ 22 мая 2010

Линия:

header('location: account.php');

Пересылает браузер, но не завершает скрипт php .
Это может быть хорошо, фрагмент кода, который вы дали, ничего не делает после этой строки.

Другим вариантом может быть двойной щелчок
Если дважды щелкнуть кнопку «Отправить», форма будет отправлена ​​дважды.
Мы использовали JavaScript, чтобы отключить кнопку отправки после первого клика.

0 голосов
/ 22 мая 2010

Еще один длинный выстрел, но он случился со мной однажды в Firefox - двойное выполнение страниц, в результате чего удвоенные вставки и обновления - закрыли браузер и перезапустите.

0 голосов
/ 22 мая 2010

Я знаю, это будет звучать странно, но убедитесь, что у вас нет тега с пустым атрибутом src = "" или какого-либо стиля CSS, ссылающегося на пустой URL (например, background: url ();) на вашем сайте, когда у вас есть код, который запускается дважды.

Прочтите о некоторых проблемах, которые могут возникнуть, здесь: http://hi.baidu.com/zhenyk/blog/item/38a1051fc63b96c3a686698f.html

...