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() {

}


}

?>

それは何をすべきか...

送信ボタンを 4 回クリックすると、ドロップダウンから選択したイチゴが表示されます。スクリプトが画面に出力されます。

イチゴは1回スキャンされました

イチゴは2回スキャンされました

イチゴは3回スキャンされました

イチゴは4回スキャンされました

等....

$count増分を追跡します。

実際に行うこと:

それは印刷します:

何度サブミットを押してもストロベリーは2回スキャンされました。そしてそこで止まります。ここで何かが欠けています。

私はそれが何をしているのかを見ています.

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

私は試した:

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

また、これは $count を 1 増やしますが、そこで止まります。私はこれに少し苦労しています..

ヘルプ

4

3 に答える 3

2

static変数は、現在のスクリプト実行に対してのみ静的です。ページがリロードされるたびに (送信時)、変数は失われます。そのためには、 に保存する必要があります$_SESSION。実際、$_SESSION基本的な使用法マニュアルで試みているものと非常によく似た例があります。

// 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'];
}
于 2012-09-02T15:49:22.890 に答える
1

フォームを送信するたびに、サーバーに対して新しい HTTP 要求が作成され、スクリプトが新たに実行されます。変数は、ある実行から次の実行まで値を保持しません。

ページをリロードしても変数を保存したい場合は、Michael Berkowski が示唆するようにセッション変数を使用する必要があります。ただし、これはブラウザ セッション内のみです。保持期間を長くする必要がある場合は、Cookie を使用できますが、ユーザーはこれらを削除できます。最後に、実際の永続メモリが必要な場合は、データベースを使用できます。

データベースは、複数のユーザーからのデータを組み合わせる必要がある場合にも適しています。たとえば、ユーザー A がアイテムをスキャンし、次にユーザー B がアイテムをスキャンし、合計を表示したい場合。

于 2012-09-02T15:52:45.583 に答える
1

Michael Berkowski の回答に加えて、他に指摘したいことがあります。オブジェクトフィールド$counterであると想定されている場合、関数で宣言するのはなぜですか。そして、それはオブジェクトフィールドであるはずなのに、なぜですか? 静的な場合は、特定の時点でのすべてのインスタンスがカウントされます。また、内部で 一度呼び出してから、もう一度呼び出しますstaticCheckout
increment()scan()

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;
    }

}
于 2012-09-02T16:06:30.213 に答える