繁体   English   中英

PHP:MySQL查询无缘无故地复制更新

[英]PHP: MySQL query duplicating update for no reason

下面的代码首先是客户端代码,然后是类文件。

由于某种原因,“ 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)"

我知道这里显然有问题。 但是我不知道第二个请求是从哪里来的。

该行:

header('location: account.php');

转发浏览器,但不结束php脚本
这可能很好,您提供的代码段在此行之后不会“执行”任何操作。

另一个选择可能是双击
如果双击“提交”按钮,则该表单将发送两次。
第一次单击后,我们使用了一些JavaScript来禁用“提交”按钮。

我知道这听起来很奇怪,但是请确保在您拥有网站时,周围的网站上没有带空src =“”属性的标记或任何引用空URL的CSS样式(例如background:url();)运行两次的代码。

在此处了解可能会引起的一些麻烦: http : //hi.baidu.com/zhenyk/blog/item/38a1051fc63b96c3a686698f.html

另一个远景,但是在Firefox中发生在我身上-页面执行次数翻了一番,导致插入和更新次数翻了一番-关闭浏览器并重新启动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM