PHP:MySQL查询无故重复更新

时间:2010-05-22 12:01:21

标签: php mysql duplicates

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

由于某种原因,'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 个答案:

答案 0 :(得分:1)

该行:

header('location: account.php');

转发浏览器,但不会结束php脚本 这可能没问题,你提供的代码片段在此行之后并没有“做”任何事情。

另一种选择可能是双击
如果您双击提交按钮,表单将被发送两次 我们使用了一些javascript来在第一次点击后禁用提交按钮。

答案 1 :(得分:0)

我知道这听起来很奇怪,但要确保你没有带有空src =“”属性的标签或任何css样式引用你网站周围的空网址(如background:url();)你的代码运行了两次。

请阅读此处可能导致的一些问题:http://hi.baidu.com/zhenyk/blog/item/38a1051fc63b96c3a686698f.html

答案 2 :(得分:0)

另一个很长的镜头,但它曾经发生在我身上的一次火狐 - 双倍的页面执行,导致双倍的插入和更新 - 关闭浏览器并重新启动。