ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

いつもお世話になっております。
PHPでカートを作っております。カートに入れるボタンを押した際に、どのボタンを押したかを識別する為に、POSTで識別データを送信しております。
このPOSTデータが含まれている場合にカートに入れる動作が実行される様に設定しておりますが、POSTで送信すると、ブラウザの更新ボタンを押すたびにカートに同じ商品が追加されていってしまいます。
ですので、カートに入れる動作が終了した時点で、このPOSTのデータを無効にしたいのですが、PHPのunset関数を実行しても、ブラウザの更新を押した時点で、再度POSTを送信してしまうので、やはり重複登録されてしまいます。
このPOSTのデータを無効にする方法があれば、是非お教え頂けると助かります。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

まずその前に


すでにカートに入っている商品をもう一度カートに入れようとした場合の正しい動きを決めてください
どんなショッピングカートを作っているのかわかりませんが、
この世の中にある通販サイトではそのような動きを正しい仕様として決めています
あなたが頭ごなしに「すでにカートに入っている商品をもう一度カートに入れようとした場合、数が追加される」ということを悪いことのように思っているようですが。仕様としてそのような挙動が正しいもので有れば「仕様を満たしている」と言えます

リロード時の再POSTですが。
リロードした場合はブラウザは再度同じデータを送りつけます、これはブラウザの仕様であり、PHPが悪いわけでもなければunsetで済ませられる問題でもありません。
PHPに限らず、ほかの言語でもPOSTされます。
ですから、更新(リロード)できないような対策が必要です

簡単な方法としては、クッキーやセッションでリロード対策ですね。
例えば
if(商品番号をKeyとするクッキーが無い){
 $obj->商品を追加("商品番号");
}
みたいな感じの処理を入れておけばよいかと思います


または、POSTされたときに、同一商品がすでにカートに入っているときは警告なりエラーを出してカートに追加するかしないかを選択してもらうようにするとか。

if( $obj->商品がカートに入っているか("商品番号") ){
 $カートObj->getメッセージobj()->追加しますかメッセージを表示("商品番号",個数);
}else{
 $カートObj->商品をカートに入れる("商品番号",個数);
}
って感じです


リロード対策に関してはさまざまな方法がありますので調べてみてください
何れにせよ、リロードさせない対策&リロードされた場合の挙動
をしっかりを決めて実装してください
    • good
    • 0
この回答へのお礼

ありがとうございます。
やはり、再POSTを防止する方法はないんですね。
SESSION or COOKIEにて対策を練ります。
ありがとうございました!

お礼日時:2007/05/09 09:53

データの登録が成功した時点で


headerのlocationで「登録完了」ページへ飛ばせばよいでしょう。
    • good
    • 0
この回答へのお礼

個人情報等の登録であればそれでもいいと思うのですが、カートに入れるだけなので、やはりSESSION or COOKIEにて対策します。
ありがとうございました!

お礼日時:2007/05/09 09:54

POSTデータをSESSIONファイル(DBとか)などに記録してください。


再度押下された場合、その記録先のデータを検証すれば無効にできると思いますが・・・
    • good
    • 0
この回答へのお礼

SESSION or COOKIEにて対策するしか方法が無さそうですね。
ありがとうございました!

お礼日時:2007/05/09 09:53

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフォームへの前回入力値をクリアーする方法は?

以下のコードでフォームへの前回入力値を保持しています。
送信前は"RESET"ボタンで入力値をクリアーできますが、送信後は入力値をクリアーできません。(RESETボタンをクリックしても送信済$_POSTが表示されます)おそらくブラウザのキャッシュで$_POSTの値が保持されているためと思われますが、何らかのボタンクリックでこれらの$_POST値をクリアする方法をご存知に方、是非ご教授ください。

<?php
$yyyy=$_POST[Y];
$mm=$_POST[M];
$dd=$_POST[D];
?>

<FORM action="<?=$_SERVER[PHP_SELF]; ?>" method="post" >
<P>YYYY<INPUT size="10" type="text" name="Y" value="<?= $yyyy;?>"></P>
<P>MM<INPUT size="10" type="text" name="M" value="<?= $mm;?>"></P>
<P>DD<INPUT size="10" type="text" name="D" value="<?= $dd;?>"></P>
<INPUT type="submit" name="submit" value="送信">
<INPUT type="reset" name="reset" value="reset">
</FORM>

以下のコードでフォームへの前回入力値を保持しています。
送信前は"RESET"ボタンで入力値をクリアーできますが、送信後は入力値をクリアーできません。(RESETボタンをクリックしても送信済$_POSTが表示されます)おそらくブラウザのキャッシュで$_POSTの値が保持されているためと思われますが、何らかのボタンクリックでこれらの$_POST値をクリアする方法をご存知に方、是非ご教授ください。

<?php
$yyyy=$_POST[Y];
$mm=$_POST[M];
$dd=$_POST[D];
?>

<FORM action="<?=$_SERVER[PHP_SELF]; ?>" metho...続きを読む

Aベストアンサー

「リセットをサブミットする」って言ったら変なのかな?

<?php
$post = $_POST;

if ( 'reset' != $post[ 'reset' ] )
{
$year = $post[ 'year' ];
$month = $post[ 'month' ];
$day = $post[ 'day' ];
}
else
{
unset ( $post );
}

if ( isset ( $post ) )
{
$reset = 'submit';
}
else
{
$reset = 'reset';
}
?>
<form action="<?php echo ( $_SERVER[ 'PHP_SELF' ] ); ?>" method="post">
<p>
Y:<input size="10" type="text" name="year" value="<?php echo ( $year ); ?>" /><br />
M:<input size="10" type="text" name="month" value="<?php echo ( $month ); ?>" /><br />
D:<input size="10" type="text" name="day" value="<?php echo ( $day ); ?>"><br />

<input type="submit" name="submit" value="submit" />
<input type="<?php echo ( $reset ); ?>" name="reset" value="reset" />
</p>
</form>

「リセットをサブミットする」って言ったら変なのかな?

<?php
$post = $_POST;

if ( 'reset' != $post[ 'reset' ] )
{
$year = $post[ 'year' ];
$month = $post[ 'month' ];
$day = $post[ 'day' ];
}
else
{
unset ( $post );
}

if ( isset ( $post ) )
{
$reset = 'submit';
}
else
{
$reset = 'reset';
}
?>
<form action="<?php echo ( $_SERVER[ 'PHP_SELF' ] ); ?>" method="post">
<p>
Y:<input size="10" type="text" name="year" value="<?php echo ( $year ); ?>" /><b...続きを読む

Qフォーム送信後の更新ボタンでも$_POST変数が初期化されない

フォームのサブミット後にプログラムが走るようになっているtest.phpがあるのですが、フォーム送信後に更新ボタンを押しても再度ポストされるようになってしまっています。

ブラウザの更新ボタンを押したときには、ポストせずにフォームをクリアしたいのですが、どうすればできますでしょうか?

<form method="post" action="<?php print($_SERVER['PHP_SELF']); ?>">
<input type=text name=aaa>
<input type="submit" name="submit" value="submit">
</form>
<?php
if($_POST['submit']) { 処理 }
?>

Aベストアンサー

fabuさん、こんにちは。


> フォームのサブミット後にプログラムが走るようになっているtest.phpがあるのですが、フォーム送信後に更新ボタンを押しても再度ポストされるようになってしまっています。

これはブラウザの仕様だと思います^^;
更新ボタンを押したときに「送信ボタンを押したとき」
をもう一度実行しています。

私の場合は、送信されたときの処理をどんな出力よりも上で行い、
処理後にheader()で自分自身のページへリダイレクトするようにしています。
これでページを開いた最初の状態に戻ります。



<?php
// header()でリダイレクトするので
// どんな出力よりも先に行う。
if($_POST['submit']) {
/* 処理 */
header("Location: {$_SERVER['PHP_SELF']}");
exit;
}
?>
<form method="post" action="<?php print($_SERVER['PHP_SELF']); ?>">
<input type=text name=aaa>
<input type="submit" name="submit" value="submit">
</form>


どうしても出力後にif($_POST['submit'])を
行わないといけない場合は、
メタタグのリフレッシュを使うといいかもしれません。

fabuさん、こんにちは。


> フォームのサブミット後にプログラムが走るようになっているtest.phpがあるのですが、フォーム送信後に更新ボタンを押しても再度ポストされるようになってしまっています。

これはブラウザの仕様だと思います^^;
更新ボタンを押したときに「送信ボタンを押したとき」
をもう一度実行しています。

私の場合は、送信されたときの処理をどんな出力よりも上で行い、
処理後にheader()で自分自身のページへリダイレクトするようにしています。
これでページを開いた最初の...続きを読む

QリダイレクトでPOST

教えてください。

リダイレクトの際、POSTで次のページにデータを渡すことは可能でしょうか?

GETだと
header("Location: "a.php?no=".$no);
と、問題なくできるのですが、
できれば、パラメータを隠したいと思います。

以上ですが、よろしくお願いします。

Aベストアンサー

多分できないです。
それに、結局クライアント側に情報を送信しているのだから、POSTにしたところでパラメータを隠した事にはならないですし。
本当に隠すならサーバ側でセッション情報を引き継ぐような形にしないとダメでしょう。

AJAXのかたちにして、ページ遷移を見えなくするというのが手っ取り早いかも。

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

Q配列をPOSTで受けとる

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j]"];
   print"$foo[$j]";
}
?>


こんな感じのことがしたいのですが
うまくいきません
どうもPOSTされてないみたいでfoo[$j]はnullです
凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓
教えてください
よろしくお願いします

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j...続きを読む

Aベストアンサー

atsuGTさんこんにちは。


受け取り側は

$foo = $_POST["foo"];

とするだけで$fooに送信された配列が格納されます。


$_POST["foo[添え字]"] ではなく、
$_POST["foo"][添え字] となります。

QPHPの関数実行

<?php
function disp(){
echo "hello world";
}
?>

<form>
<input type="text">
<input type="button" onclick="<?php disp() ?>">
</form>

といったソースを書いてみたのですが、ボタンを押してみるのですが作動しません。
どこか間違えているのでしょうか、それとも作動しないのでしょうか・・・。
当方としては、formのinputボタンを押したらPHPの関数が実行させるようにしたいのですが・・・。
どなたかご助言をお願いします。

Aベストアンサー

ウソつきました
出来ましたー

<?php

if($_REQUEST[submit] == TRUE){
function disp(){
echo "hello world";
}
}

else{
function disp(){
echo "";
}
}

?>

<form method="post" action="">
<input type="text" value="<?php disp(); ?>">
<input name="submit" type="submit"value="押せ">
</form>

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Qリンクをクリックした時にformからPOST送信したい。

HTML、PHP、JavaScript等でサイトを作っているのですが・・・。

【実現出来ている例】
<form name="form1" method="post" action="Next.php" onSubmit="return InputCheck()">
 <input type="submit" value="送信">
</form>
 submitボタンを一つ置いて、それがクリックされた場合に
formの内容をPOSTで送信する。

【実現したい例】
<form name="form1 method="post">
 <a href="Next.php" onClick="???">???</a>
</form>
 formの中のリンクをクリックされた場合に、formの内容を
POSTで送信したいのですが、その実現方法がわかりません。
GETで送るという手もあり得ますが、今回はどうしてもPOST
したいのですが。

Aベストアンサー

<form name="form1" method="post" action="Next.php">
<a href="#" onClick="document.form1.submit();">???</a>
</form>

onclick内の対象がform1としてあてているので、
アンカータグは別にform内に記述しなくても大丈夫です

form内にhidden等でnameとvalueを持ったパラメータがあればそれも送られます

アンカータグから動的にvalueを変更したい場合は、
document.form1.hogename.value = 'hoge';
等をsubmit()の前に行えば可能です

ただしform内に
<input type="hidden" name="hogename" value="">
を記述する等、変更先パラメータの元を用意する必要がありますのでご注意下さい

Qheader(Location: next.php) だとPOSTした値が渡らない?

文末は(だいぶ端折ってますが),
(1) エラーがあればエラー表示,
(2) エラーがなければnext.phpに飛ぶ
という動作をするのですが, next.php 内に

echo $_POST["Name"]; とか echo $_POST["reg"]; とか書いても
valueの中身が渡ってきていません.
header("Location: next.php"); で飛ばすとだめなのでしょうか.


http://oshiete1.goo.ne.jp/qa2706500.html
でも,#2さんのアドバイスのようにしようとしましたが,
#1さんのご教示のように,セッションを利用するしかないですか?
ちょっとセッションで値の渡し方がチンプンカンプンなのですが・・・


<?php
session_cache_limiter('none');
session_start();
header("Cache-control:no-cache");
header("Pragma:no-cache");

$errFlg=false;
if ( $_POST["reg"] == "" ) $errFlg = true;

if ( !$errFlg ) {
if ( $_POST["Name"] == "" ) {
$errFlg = true;
$errStr["Name"] = "未入力";
}
}
if ( $errFlg ) {
?>
<html><body>
<form method="post" action="<?php $_SERVER["PHP_SELF"] ?>">
<?= $errStr["Name"] ?></td>
<input type="text" name="Name" value="<?php echo $_POST["Name"]; ?>">
<input type="submit" name="reg" value="登録"></td>
</form>
</body></html>
<?php
} else {
header("Location: next.php");
}
?>

文末は(だいぶ端折ってますが),
(1) エラーがあればエラー表示,
(2) エラーがなければnext.phpに飛ぶ
という動作をするのですが, next.php 内に

echo $_POST["Name"]; とか echo $_POST["reg"]; とか書いても
valueの中身が渡ってきていません.
header("Location: next.php"); で飛ばすとだめなのでしょうか.


http://oshiete1.goo.ne.jp/qa2706500.html
でも,#2さんのアドバイスのようにしようとしましたが,
#1さんのご教示のように,セッションを利用するしかないですか?
ちょっ...続きを読む

Aベストアンサー

LocationではPOSTデータは渡せません
セッションでやる方法もありますがそのプログラムなら
else {
header("Location: next.php");
}

else {
require "next.php";
}
にすればいいのではないでしょうか


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング