[英]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.