下面的代码首先是客户端代码,然后是类文件。
由于某种原因,'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)"
我明白这里显然有些不对劲。但我无法弄清楚第二个请求的来源。
答案 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)
另一个很长的镜头,但它曾经发生在我身上的一次火狐 - 双倍的页面执行,导致双倍的插入和更新 - 关闭浏览器并重新启动。