PHP: MySQL sorgusu için hiçbir neden güncelleştirme çoğaltarak

3 Cevap php

Aşağıdaki kod ilk istemci kod, o sınıf dosyasıdır.

For some reason the 'deductTokens()' method is calling twice, thus charging an account double. I've been programming all night, so I may just need a second pair of eyes:

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

    }

}

?>

Ben ("$ sorgu") öldüğümde; doğrudan sorgu sonra, uygun bir bildirimde baskı, ve ben MySQL içinde bu sorguyu çalıştırdığınızda mükemmel çalışıyor.

$ Action = $ _REQUEST ['action'];

account.php o downloads.php çağırmak yok asla, siparişlerin sadece bir listesidir. Sadece yönlendirme dışında yorum çalıştım, ama ben aynı sorunu yaşıyorum. Ben iki kez, kalıp ifadeler doğru sorguyu gösteriyoruz denir alıyorum nasıl anlamıyorum, ve senaryo kendi kendini yeniden değildir.

İşte benim apache erişim günlükleri:

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

Ben yanlış bir şey burada tabii ki var anlıyorum. İkinci istek nereden geliyor ama ben çözemiyorum.

3 Cevap

Başka bir uzun atış, ancak Firefox kez başıma - iki sayfa infazlar, iki katına ekler ve güncellemeleri sonuçlanan - tarayıcınızı ve yeniden kapatın.

Satır:

header('location: account.php');

Forwards the browser, but doesn't end the php script.
This might be fine, the code-snippet you gave doens't "do" anything after this line.

Another option might be a double-click
If you double-click on the submit button, the form will be sent twice.
We used some javascript to disable the submit button after the first click.

Eğer sizin varsa url () ;) yeri çevresinde sitenizde: Ben bu garip gelebilir ama arka planda gibi boş src = "" nitelik veya boş url için herhangi bir css stil atıfta (etiketi ile yok emin olun biliyorum kodu iki kez çalıştırır.

Bazı sorun hakkında okuyun, bu neden olabilir burada: http://hi.baidu.com/zhenyk/blog/item/38a1051fc63b96c3a686698f.html