ホームページ バックエンド開発 PHPチュートリアル 【勉強メモ】PHPショッピングカートを実装するセッション機構

【勉強メモ】PHPショッピングカートを実装するセッション機構

Jun 13, 2016 pm 12:53 PM
gt lt quot session

[研究ノート] セッションメカニズムは、PHP ショッピングカートを実装します。

セッションを使用するページには、システム内のセッションをクリアするためのセッション開始関数 session_start() が必要です。session_destroy() 関数を使用できます。 。

php.ini ファイルのセッション設定に関して: session.save_path はセッションを保存するパスを定義し、session.name は sessionID の名前を定義します。

以下は、コードをリストした演習の例です。

index.html ページ:

<html>
	<head>
		<title>商品分类列表</title>
	</head>
	<body>
		<a href="a.php">运动器材</a><br/>
		<a href="b.php">办公用品</a><br/>
		<a href="c.php">烟酒副食</a><br/>
		<a href="cart.php">查看购物车</a><br/>
	</body>
</html>
ログイン後にコピー

ファイル a.php ページ コード:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=GBK" http-equiv="Content-Type" />
<title>购物街</title>
</head>

<body bgcolor="#fff" text="#000" link="#f96" vlink="#f96" alink="#fc9">
	请选择商品<br />
	<form action="index.php" method="POST">
		<input type="checkbox" name="cart[ ]" value="篮球"/>篮球<br />
		<input type="checkbox" name="cart[ ]" value="排球"/>排球<br />
		<input type="checkbox" name="cart[ ]" value="足球"/>足球<br />
		<input type="checkbox" name="cart[ ]" value="桌球"/>桌球<br />
		<input type="checkbox" name="cart[ ]" value="气球"/>气球<br />
		<input type="submit" value="购买" />
		<input type="button" value="返回" onclick="location='index.php';" />
	</form>
</body>

</html>
ログイン後にコピー

ファイル b.php ページのコード:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>购物街</title>
</head>

<body bgcolor="#fff" text="#000" link="#f96" vlink="#f96" alink="#fc9">
	请选择商品<br />
	<form action="index.php" method="POST">
		<input type="checkbox" name="cart[]" value="铅笔"/>铅笔<br />
		<input type="checkbox" name="cart[]" value="钢笔"/>钢笔<br />
		<input type="checkbox" name="cart[]" value="圆珠笔"/>圆珠笔<br />
		<input type="checkbox" name="cart[]" value="电笔"/>电笔<br />
		<input type="checkbox" name="cart[]" value="自动笔"/>自动笔<br />
		<input type="submit" value="购买" />
		<input type="button" value="返回" onclick="location='index.php';" />
	</form>

</body>
</html>
ログイン後にコピー

ファイル c.php ページのコード:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>购物街</title>
</head>

<body bgcolor="#fff" text="#000" link="#f96" vlink="#f96" alink="#fc9">
	请选择商品<br />
	<form action="index.php" enctype="multipart/form-data" method="POST">
		<input type="checkbox" name="cart[]" value="猪肉"/>猪肉<br />
		<input type="checkbox" name="cart[]" value="牛肉"/>牛肉<br />
		<input type="checkbox" name="cart[]" value="中华香烟"/>中华香烟<br />
		<input type="checkbox" name="cart[]" value="长城葡萄酒"/>长城葡萄酒<br />
		<input type="checkbox" name="cart[]" value="金龙鱼花生油"/>金龙鱼花生油<br />
		<input type="submit" value="购买" />
		<input type="button" value="返回" onclick="location='index.php';" />
	</form>

</body>
</html>
ログイン後にコピー

Index.php データ処理ページ:

<?php

	//三个页面虽然显示内容不同,但是处理的php页面都是列表的index.php页面。处理页面会开启session功能,存储session的值。
	session_start();	//启用session
	if(!isset($_SESSION['cart'])){	//查看当前session中是否已经定义了购物车变量
		$_SESSION['cart'] = array();	//没有的话就新建一个变量,其值是一个空数组。 
		//session销毁之后变为空
	}

	if(isset($_POST['cart'])){		//是否是从商品页面提交过来的
		//如果是,则把提交来的商品加到购物车中
	//	$_SESSION['cart'] = array_merge($_SESSION['cart'],$_POST['cart']);

		//通过foreach遍历数组,把前台页面的值存储在session中。如果我们希望查看购物车,也就是查看session中存储的值。cart.php页面处理查看购物车
	//	foreach($_POST['cart'] as $c){
	//		$_SESSION['cart'][]=$c;
	//	}
	

		//定义关联数组,其键为商品名称,其值为商品数量。第一次买进的商品,其值为1
		for($i = 0; $i <count($_POST['cart']); $i++ ){
			$c = $_POST['cart'][$i];
			if(array_key_exists($c, $_SESSION['cart'])){
				$_SESSION['cart'][$c] = $_SESSION['cart'][$c] +1;
				//$_SESSION['cart'][$c]++;
			}else{
				$_SESSION['cart'][$c] = 1;
			}
			
		}
		
	}
	/*
	foreach (array_expression as $value)
		statement
	foreach (array_expression as $key => $value)
		statement
	*/

	if(isset($_POST['d'])){				//是否从购物车管理界面提交过来的
		foreach($_POST['d'] as $c){		//如果是,则将提交过来的商品序号从购物车数组中删除
			unset($_SESSION['cart'][$c]);
		}
	
	}

?>
<a href="a.php">运动器材</a><br/>
<a href="b.php">办公用品</a><br/>
<a href="c.php">烟酒副食</a><br/>
<a href="cart.php">查看购物车</a><br/>
ログイン後にコピー

ショッピング カート管理ページ cart.php。主に商品の削除とショッピング ページのキャンセルを実装します。

<form action="index.php" method="POST">
<?php
	session_start();			//重启session
	$cart = $_SESSION['cart'];	//得到购物车
	foreach($cart as $i=>$c){	//对购物车里的商品进行遍历
		//将商品的名字输出到页面上,每个商品前面对应一个多选框,其值是商品在购物车中的编号。
		//用d作为购物车管理界面中  购物车所有的商品,用于index.php页面撤销/删除某些商品的业务处理。
		echo "<input type='checkbox' value='$i' name='d[]' />".$i.' 数量:'.$c."<br />";
	}
?>
	<input type="submit" value="撤销购物" />
	<input type="button" value="返回" onclick="location='index.php';" />
</form>
ログイン後にコピー

ここで、PHPのフォームformにおけるenctype属性の設定に注目してください。

フォームの enctype 属性は、サーバーにデータを送信するときにブラウザーが使用するエンコード タイプを指定します。
以下は値の説明です:
multipart/form-data: フォーム データはメッセージとしてエンコードされ、ページ上の各コントロールはメッセージの一部に対応します。文字はエンコードされません。この値は、ファイル アップロード コントロールを含むフォームを使用する場合に必要です。 。
application/x-www-form-urlencoded: フォーム データは名前と値のペアとしてエンコードされます。これは標準のエンコード形式です。送信する前にすべての文字をエンコードします (デフォルト)。
text/plain: フォーム データは、コントロールや書式設定文字を含まないプレーン テキストとしてエンコードされます。スペースを「+」記号に変換しますが、特殊文字はエンコードされません。データ形式はパケット キャプチャで確認できます。

説明:

1) フォームにアップロードするファイルがある場合、アップロードされたファイルの MIME エンコードが匿名で行われるように、フォーム内の form タグで enctype="multipart/form-data" を設定する必要があります。デフォルトでは、フォームのエンコード形式は application/x-www-form-urlencoded であり、ファイルのアップロードには使用できません。

2) セッション処理を行う際、フォームが enctype="text/plain" に設定されている場合、$_POST、$_GET、$_REQUEST などで値を取得できません。これには気をつけてください! ! !

3 つのタイプの詳細については、実際の参照は次のとおりです。

enctype は、送信前にデータをどのようにフォーマットするかを定義します。2 つの正しい形式は、application/x-www-form-urlencoded (基本的に http ヘッダーを使用して key=valye&anotherkey=anothervalue として送信します) と multipart/form-data です。 (分割します text/plain は、何もする必要がないことを意味します。その動作は基本的にブラウザ間で定義されておらず、スパムが使用される前の時代には自動電子メール フォームにのみ使用されていました。フォーム URL コード化 テキストフォームの場合 (またはデフォルト設定を使用する場合はこれをそのままにします)、添付ファイルのアップロードの場合は multipart/form-data


テキスト/プレーン:


Content-Type: text/plain
================================================================================
foo=bar
baz=The first line.
The second line.
ログイン後にコピー

application/x-www-form-urlencoded:

マルチパート/フォームデータ:
Content-Type: application/x-www-form-urlencoded
================================================================================
foo=bar&baz=The+first+line.&#37;0D%0AThe+second+line.%0D%0A
ログイン後にコピー

最初の方法は、チェックされていない値を電子メール プログラムに直接渡す場合にどのように便利であるかがわかります (たとえば、フォームで mailto: アドレスが使用されている場合、送信には訪問者の電子メール プログラムを使用します)。しかし、プログラム的な用途にはほとんど役に立ちません。へのアクセス 実際のフォームベースのフォーム データには、下の 2 つの例のみが有効です。
Content-Type: multipart/form-data; boundary=---------------------------314911788813839
================================================================================
-----------------------------314911788813839
Content-Disposition: form-data; name="foo"

bar
-----------------------------314911788813839
Content-Disposition: form-data; name="baz"

The first line.
The second line.

-----------------------------314911788813839--
ログイン後にコピー


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Huawei GT3 ProとGT4の違いは何ですか? Huawei GT3 ProとGT4の違いは何ですか? Dec 29, 2023 pm 02:27 PM

多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

SpringBootセッションでセッションタイムアウトを設定する方法 SpringBootセッションでセッションタイムアウトを設定する方法 May 15, 2023 pm 02:37 PM

Springboot プロジェクトの本番環境のセッションアウト タイムアウトで問題が見つかりました。問題の説明は次のとおりです: テスト環境では、application.yaml を変更することでセッションアウトが構成されていました。別の時間を設定してセッションアウト構成を確認した後、有効期限がリリース時に直接 8 時間に設定され、運用環境に到着しました。しかし、正午にお客様から、プロジェクトの有効期限が短く設定されており、30分操作がないとセッションが期限切れになり、再度ログインが必要になるというフィードバックをいただきました。開発環境の扱いの問題を解決します。springboot プロジェクトには Tomcat が組み込まれているため、プロジェクト内の application.yaml で設定されたセッションアウトが有効になります。本番環境: 本番環境リリースは

更新後にPHPセッションが消えた場合はどうすればよいですか? 更新後にPHPセッションが消えた場合はどうすればよいですか? Jan 18, 2023 pm 01:39 PM

更新後に PHP セッションが消える問題の解決策: 1. 「session_start();」を通じてセッションを開きます; 2. すべてのパブリック設定を PHP ファイルに書き込みます; 3. 変数名は配列の添字と同じにすることはできません。 4. phpinfoでセッションデータの保存パスを確認し、ファイルディレクトリ内のsessioが正常に保存されているか確認してください。

セッション失敗を解決する方法 セッション失敗を解決する方法 Oct 18, 2023 pm 05:19 PM

セッション障害は通常、セッションの有効期間の期限切れまたはサーバーのシャットダウンによって発生します。解決策: 1. セッションの有効期間を延長する; 2. 永続ストレージを使用する; 3. Cookie を使用する; 4. セッションを非同期的に更新する; 5. セッション管理ミドルウェアを使用する。

PHP セッションのクロスドメイン問題の解決策 PHP セッションのクロスドメイン問題の解決策 Oct 12, 2023 pm 03:00 PM

PHPSession のクロスドメイン問題の解決策 フロントエンドとバックエンドの分離の開発では、クロスドメイン要求が標準になっています。クロスドメインの問題に対処するときは、通常、セッションの使用と管理が必要になります。ただし、ブラウザーのオリジンポリシーの制限により、デフォルトではセッションをドメイン間で共有できません。この問題を解決するには、いくつかの技術と方法を使用して、セッションのクロスドメイン共有を実現する必要があります。 1. ドメイン間でセッションを共有するための Cookie の最も一般的な使用法

セッションphpのデフォルトの有効期限は何時間ですか? セッションphpのデフォルトの有効期限は何時間ですか? Nov 01, 2022 am 09:14 AM

セッション PHP のデフォルトの有効期限は 1440 秒、つまり 24 分です。つまり、クライアントが 24 分を超えて更新されない場合、現在のセッションは期限切れになります。ユーザーがブラウザを閉じると、セッションは終了し、セッションは存在しなくなります。

Springboot2のセッションタイムアウト設定が無効になる問題の解決方法 Springboot2のセッションタイムアウト設定が無効になる問題の解決方法 May 22, 2023 pm 01:49 PM

問題: 今日、プロジェクトで設定タイムアウトの問題が発生し、SpringBoot2 の application.properties への変更が反映されませんでした。解決策:server.* プロパティは、SpringBoot によって使用される埋め込みコンテナーを制御するために使用されます。 SpringBoot は、ServletWebServerFactory インスタンスの 1 つを使用してサーブレット コンテナのインスタンスを作成します。これらのクラスは、server.* プロパティを使用して、制御されるサーブレット コンテナ (tomcat、jetty など) を構成します。アプリケーションが war ファイルとして Tomcat インスタンスにデプロイされる場合、server.* プロパティは適用されません。それらは当てはまりませんが、

Redis 共有セッション アプリケーションに SMS ログインを実装する方法 Redis 共有セッション アプリケーションに SMS ログインを実装する方法 Jun 03, 2023 pm 03:11 PM

1. セッションに基づく SMS ログインの実装 1.1 SMS ログインのフローチャート 1.2 SMS 検証コード送信の実装 フロントエンド リクエストの説明: リクエスト メソッドの説明 POST リクエスト パス /user/code リクエスト パラメータ 電話 (電話番号) 戻り値 バックエンド インターフェイスなし実装: @Slf4j@ ServicepublicclassUserServiceImplextendsServiceImplimplementsIUserService{@OverridepublicResultsendCode(Stringphone,HttpSessionsession){//1。次の場合は携帯電話番号を確認します。

See all articles