Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2008/08/08

counter hits
since 1999/11/06


簡単なショッピングカート

alertここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。

alertセッションIDの出力には、XSS対策のためstrip_tags関数を通したものを出力することが推奨されています。ただし、HTMLタグの内側にその値が含まれる場合、htmlspecialchars関数を使用する必要があります。

これもよくあるネタですよね。今回はPHP4のSession管理機能を使ってカートを保持させています。カートのソース自体は、マニュアルに載っているものを参考にしました。ショッピングカートの基本的な流れはこんな感じと思います。後は、購入処理や購入後のカートを消す等の処理を付ければ、簡単ですが完成ですね(たぶん)。

●cart.php

<?php
    require('./Cart.phl');
?>
<?php
/**
 * 商品一覧を表示する
 *
 * @param $cart カートオブジェクト
 */
function showItem($cart)
{
    if (get_class($cart) != 'cart') {
        die('Illegal object ' . get_class($cart));
    }

    $contents = '';
    $items = $cart->getItems();
    while (list($_cd, $_num) = each($items)) {
        $contents .= '<tr>' .
                     '<td>' . $_cd . '</td>' .
                     '<td> '.
                     '<input type="text" value="' . $_num . '" size="3">'.
                     '</td>' .
                     '</tr>';
    }
    echo '<table border="1">' . $contents . '</table>';
}
?>
<?php
    /**
     * セッションの開始
     */
    session_start();

    // 確認用のセッションIDを表示
    echo 'SESSION_ID=' . strip_tags(session_id()) . '<p />';

    $item_cd = '';
    $num = 0;
    $mode = '';

    /**
     * 商品コード・数量・動作モードのチェック
     */
    if (isset($_POST['item_cd']) && $_POST['item_cd'] != '') {
        $item_cd = $_POST['item_cd'];
    }
    if (isset($_POST['num']) && ereg('[1-9][0-9]*', $_POST['num'])) {
        $num = (int)$_POST['num'];
    }
    if (isset($_POST['mode'])) {
        $mode = $_POST['mode'];
    }

    /**
     * 追加の場合で商品コードもしくは数量がない場合、何もしないようにする
     */
    if ($mode == 'ADD' && ($item_cd == '' || $num == 0)) {
        $mode = '';
    }


    // 買い物かごがなければ作成
    if ($_SESSION['_cart'] == null){
        $_SESSION['_cart'] = new Cart();
        echo '新しい買い物かごです。<p />';
    }

    if ($mode == 'ADD') {
        // 商品が入力されていれば買い物かごに追加
        if ($item_cd != '' && $num != ''){
            echo '商品を追加します<p />';
            $_SESSION['_cart']->addItem($item_cd, $num);
        }

    } else if ($mode == 'DEL') {
        // 買い物かごの中身をクリア
        echo '買い物かごの中身をクリアします<p />';
        $_SESSION['_cart']->clear();
    }

    //買い物かごの中身を表示
    showItem($_SESSION['_cart']);
?>
<script language='JavaScript'>
<!--
function go_next(_md) {
    var frm = document.cart;
    frm.mode.value = _md;
    frm.submit();
}
//-->
</script>
<form name='cart' action='cart.php' method='post'>
<input type='hidden' name='mode'>
商品コード:<input type='text' name='item_cd'><br />
個数:<input type='text' name='num'><br />
<input type='button' value='商品を追加' onClick='go_next("ADD")'>
<input type='button' value='すべてクリア' onClick='go_next("DEL")'>
</form>
●Cart.phl

<?php
class Cart
{
    var $item;

    /**
     * コンストラクタ
     */
    function Cart()
    {
        $this->item = array();
    }

    /**
     * 商品を追加する
     *
     * @param $item_cd 商品コード
     * @param $num 数量。負の値は減算する
     */
    function addItem($item_cd, $num)
    {
        if (!isset($this->item[$item_cd])) {
            $this->item[$item_cd] = 0;
        }
        $this->item[$item_cd] += $num;

        /**
         * 数量 < 0の場合、数量を0とする
         */
        if ($this->item[$item_cd] < 0) {
            $this->item[$item_cd] = 0;
        }
    }

    /**
     * 全商品をクリアする
     */
    function clear()
    {
        $this->item = array();
    }

    /**
     * 全商品の配列を取得する
     *
     * @return 商品情報を格納した配列
     */
    function getItems()
    {
        return $this->item;
    }

}
?>



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2008 by Hideyuki SHIMOOKA all rights reserved.