2012-09-02 62 views
3
<html> 
//index.php 

<form action="" method="post"> 
    <label for="item">Item: </label> 
    <select name="item"> 
     <option value="fruit tea">Fruit Tea</option> 
     <option value="strawberries">Strawberries</option> 
     <option value="coffee">Coffee</option> 
    </select><br /> 

    <label for="qty">Qty: </label> 
     <input type="text" name="qty" /> 
     <input type="submit" name="submit" value="submit" /> 
</form> 


<?php 

    @$qty = $_POST['qty']; 
    @$item = $_POST['item']; 

    $co = new Checkout($pricing_rules); 
    print $co->scan($item). ' has been scanned '.$co->increment(). ' times'; 

?> 
</html> 




<?php 

/** 
* Description of Checkout 
* 
* @author cookie 
*/ 
class Checkout { 

private $pricing_rules = array(); 
private $pcode; 
public $item; 


public function __construct(array $pricing_rules) { 
    $this->pricing_rules = $pricing_rules; 
} 

public function scan($item) { 

    $this->increment(); 
    return $item; 
} 

private function prod_code($pcode) { 

    $this->pcode = $pcode; 
} 


public function increment() { 
    static $count = 0; 
    $count++; 
    return $count; 
} 

public function total() { 

} 


} 

?> 

什么它应该做的事...递增计数器的变量,PHP

如果我点击提交按钮四次从下拉列表中选择的草莓说。脚本应该打印出到屏幕上:

草莓已经被扫描1次

草莓已经被扫描2次

草莓已经被扫描3次

草莓已经被扫描的4倍

等....

随着$count跟踪增量通货膨胀。

其实际作用:

它打印:

草莓已扫描2次,无论多少次,我按提交。并在那里停下来。我在这里错过了一些东西。

我看到它在做什么 - 在网页加载时,两个调用递增()发生过这条线:

print $co->scan($item). ' has been scanned '.$co->increment(). ' times'; 

我想:

if($_SERVER['REQUEST_METHOD'] == 'POST') $co->increment(); 

也,这将增加$计数一个,但停在那里。我挣扎有点用这个..

帮助

回答

2

static变量只有静态当前的脚本执行。每次页面重新加载时(当您提交时),您的变量都会丢失。为此,您需要将其存储在$_SESSION中。事实上,有一个非常相似的示例,你尝试什么样的$_SESSION basic usage manual.

// Call session_start() at the beginning of your script... 
session_start(); 

// And modify your method to store count in the $_SESSION. 
public function increment() { 
    // initialize it if not already initialized 
    $_SESSION['count'] = !isset($_SESSION['count']) ? 0 : $_SESSION['count']; 
    $_SESSION['count']++; 
    return $_SESSION['count']; 
} 
+0

感谢。我知道$ _SESSION,尽管不在这个(OOP)范围内。我想这一切都归结为HTTP,它是一个无状态协议。 – cookie

+0

@ArewrewCookson'$ _SESSION'是一个超全球的,所以只要你初始化它就可以在任何范围内使用。 –

1

您每次提交一个表单,它使一个新的HTTP请求到服务器,和脚本运行重新。变量不会保留一次运行到下一次运行的值。

如果您希望跨页重新加载保存变量,您需要使用会话变量,如Michael Berkowski所示。但是,这只是在浏览器会话中。如果您需要更长的保留期限,则可以使用Cookie,但用户可以删除这些。最后,如果你想要真正的永久记忆,你可以使用数据库。

如果您需要组合来自多个用户的数据,该数据库也适用。例如。如果用户A扫描一个项目,然后用户B扫描该项目,并且想要显示总计。

+0

爱这个论坛,即时答复....非常感谢。 – cookie

1

除了Michael Berkowski的回答,我想指出一些其他的东西。如果它应该是对象字段,为什么要在函数中声明$counter。因为它应该是一个对象字段,那么为什么static?如果它是静态的,它将在给定点处计入Checkout的所有实例。
另外你在scan()内部调用一次increment(),然后你再

print $co->scan($item). ' has been scanned '.$co->increment(). ' times'; 
//  ^here $counter == 1      ^and here $counter == 2 

把它添加
像这样的事情会更有意义,我

class Checkout{ 

    private $counter; 


    public __construct(){ 
     $this->counter = 0; 
     // ...... 
    } 
    // ..... 

    public function scan(){ 
     // .... 
     $this->counter++; 
    } 

    public function getCounter(){ 
     $return $this->counter; 
    } 

} 
+1

确实,让人觉得有点不对。你显示的代码仅仅是为了我自己的理智而获得一些吞吐量的测试。但是,嘿,我在听。 – cookie

+0

很酷,正如Michael Berkowski和Barmar所打动我的那样,对于答案的“第一”部分,这是我的其余两部分的:)。 – Havelock

+0

现在在OOP方面增加了一些示例代码,不在无状态的HTTP环境中;) – Havelock