質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

1584閲覧

商品情報編集ページ(もしくはカートページ)に削除機能を実装したい

TomoyukiSatou

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/09/25 11:10

###前提・実現したいこと

PHP初心者のため、わかりづらい点もあるかと思いますが、ご容赦ください。

[数量入力ページ]で入力した情報を[商品情報編集ページ]にて削除を行えるようにしたいと考えております。
しかし現状、商品を追加したその都度の情報がキーとなっており、入力された商品が全て削除されてしまいます。
個別に商品情報を格納し、個別に商品の削除を行うにはどのように実装するべきでしょうか。

現状と修正後の例といたしましては、

【現状】

[数量入力ページ]
商品1 → 50個
商品2 → 100個
商品3 → 200個

と入力を行い、[お見積り結果ページ]へ遷移します。

[お見積り結果ページ]
商品情報変更ボタンより[商品情報編集ページ]へ遷移します。

[商品情報編集ページ]
商品1の削除ボタンをクリック。商品1・商品2・商品3の情報が全て削除されます。

【修正後】

〜お見積り結果ページまでの流れは同様です。〜

[商品情報編集ページ]
商品1の削除ボタンをクリック。商品1のみ削除されます。

###現状のソース

[数量入力ページ(estimate_input.php)]

php

1<form action="" method="post" name=""> 2 <div class="item_wrap"> 3 <div class="item"> 4 <label>商品1</label> 5 <input id="item1" type="text" name="item1" value="<?php print $item1; ?>">6 </div> 7 <div class="item"> 8 <label>商品2</label> 9 <input id="item2" type="text" name="item2" value="<?php print $item2; ?>">10 </div> 11 <div class="item"> 12 <label>商品3</label> 13 <input id="item3" type="text" name="item3" value="<?php print $item3; ?>">14 </div> 15 </div> 16 17<input type="hidden" name="edit" value="<?php print $edit; ?>"> 18<input type="hidden" name="key" value="<?php print $key; ?>"> 19<p class="submit"><input type="submit" class="estimateSubmit btn-estimate" name="form-add" onClick="check()" value="お見積り結果"></p> 20</form>

[入力された情報をセッションへ格納するための処理(post.php)]

<?php //変更時のみ $edit=$_POST['edit']; $key=$_POST['key']; //見積もり商品追加フォーム入力時のpost $item1=htmlspecialchars($_POST['item1'],ENT_QUOTES); $item2=htmlspecialchars($_POST['item2'],ENT_QUOTES); $item3=htmlspecialchars($_POST['item3'],ENT_QUOTES); //見積もりフォーム中の挙動 if($_REQUEST['act']==""){ //見積もりフォームエラー時は商品をセッション保存せずに if($check=="err"){ //何もしない //見積もりフォームにエラーが無い時だけセッションに保存する }elseif($check=='ok'){ //金額計算 if( (count($_SESSION['order'])>1)&&(in_array($_POST['order_id'],get_last_value($_SESSION['order']))) ){ //リロード対策同じIDが被った時はなにもしない }elseif( (count($_SESSION['order'])==1)&&(in_array($_POST['order_id'],get_first_value($_SESSION['order']))) ){ //リロード対策同じIDが被った時はなにもしない }else{ if($edit=='edit'){ //編集時は更新 $_SESSION['order'][$key]=array( item1 => $item1, item2 => $item2, item3 => $item3, ); }else{ $_SESSION['order'][]=array(order_id => $_POST['order_id'], item1 => $item1, item2 => $item2, item3 => $item3, ); $request='result'; } } }elseif($check=='default'){ //何もしない } } ?>

[商品情報編集ページ(estimate_change.php)]

php

1<?php 2session_start(); 3?> 4 5<?php 6//1回の注文テーブルを順番に表示 7foreach ($_SESSION['order'] as $key => $value){ 8 $array = $value; 9 10 //テーブル内の項目を順番に表示 11 foreach ($array as $item => $number){ 12 13 if($item=='item1'){$item_name='商品1'; $item_size='サイズ1'; $item_img='商品画像URL';} 14 if($item=='item2'){$item_name='商品2'; $item_size='サイズ2'; $item_img='商品画像URL';} 15 if($item=='item3'){$item_name='商品3'; $item_size='サイズ3'; $item_img='商品画像URL';} 16 17 if($number!==''){ 18 if($item=='order_id'){ 19 20 }else{ 21 print ' 22 <li> 23 <div class="item_left"> 24 <figure><img src="'.$item_img.'" alt="" /></figure> 25 <h3>'.$item_size.''.$item_name.'</h3> 26 </div> 27 <div class="item_center">'.$number.'個</div> 28 <div class="item_right"> 29 <div class="change_btn"><input type="submit" class="return_btn" value="数量変更" onClick="form.action=\'form.php\';return true"></div> 30 <div class="delete_btn"><a href="./delete.php?key='.$key.'">削除</a></div> 31 </div> 32 33 <input type="hidden" name="key" value="'.$key.'"> 34 <input type="hidden" name="edit" value="edit"> 35 <input type="hidden" name="商品1" value="'.$value[item1].'"> 36 <input type="hidden" name="商品2" value="'.$value[item2].'"> 37 <input type="hidden" name="商品3" value="'.$value[item3].'"> 38 </li>'; 39 } 40 } 41 } 42} 43?>

[削除ボタンをクリックした際の処理(delete.php)]

php

1<?php 2$key=$_REQUEST['key']; 3$act=$_REQUEST['act']; 4session_start(); 5unset($_SESSION['order'][$key]); 6 7 8header("Location: ../estimate_change.php"); 9?> 10

※お見積り結果ページに関してましては、リンク先を設置しているだけのため、割愛しております。

恐れ入りますが、何卒ご教示の程宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

PHP

1//post.php 2$_SESSION['order'][$key]=array( 3 item1 => $item1, 4 item2 => $item2, 5 item3 => $item3, 6 );

このような配列の構造なので、以下のような配列の中身になっているはずです。

[order] => Array ( [$key] => Array // ← ① ( [item1] => $item1 [item2] => $item2 [item3] => $item3 ) )

そのため、以下のようにforeachで回していますが、

PHP

1//estimate_change.php 2foreach ($_SESSION['order'] as $key => $value){}

この$keyの値はそれぞれの商品のキーではなく、それらをまとめているキーの値です。
上の①の部分ですね。
そのキーをdelete.phpに渡しているため、全て削除されてしまっているのだと思います。

このキーを渡す部分を正しくすれば、思い通りになると思いますよ。
頑張ってください。

投稿2017/09/25 13:59

編集2017/09/25 14:03
alone.mk2

総合スコア58

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TomoyukiSatou

2017/09/25 18:24

とてもわかりやすい回答ありがとうございます! [$key]の回し方をもう一度考え、各商品ごとに削除が行えるように試行錯誤してみます。 本当にありがとうございます!
guest

0

htmlspecialchars関数は、PHP.netの「htmlspecialchars」にもありますが、

文字の中には HTML において特殊な意味を持つものがあり、 それらの本来の値を表示したければ HTML の表現形式に変換してやらなければなりません。 この関数は、これらの変換を行った結果の文字列を返します。

と記載されています。つまりhtmlspecialchars関数は、変数に代入して使うのではなくHTMLとして出力するために使うものです。

つまり、以下のように投稿された入力データをfilter_inputで受け取る必要があります。

php

1//変更時のみ 2$edit=(string)filter_input(INPUT_POST, 'edit'); 3$key=(string)filter_input(INPUT_POST, 'key'); 4 5//見積もり商品追加フォーム入力時のpost 6$item1=(string)filter_input(INPUT_POST, 'item1'); 7$item2=(string)filter_input(INPUT_POST, 'item2'); 8$item3=(string)filter_input(INPUT_POST, 'item3');

それらを出力するために htmlspecialchars関数を使用してください。従って以下が正しいものになります。

php

1<form action="" method="post" name=""> 2 <div class="item_wrap"> 3 <div class="item"> 4 <label>商品1</label> 5 <input id="item1" type="text" name="item1" value="<?php print htmlspecialchars($item1, ENT_QUOTES, "UTF-8"); ?>">6 </div> 7 <div class="item"> 8 <label>商品2</label> 9 <input id="item2" type="text" name="item2" value="<?php print htmlspecialchars($item2, ENT_QUOTES, "UTF-8"); ?>">10 </div> 11 <div class="item"> 12 <label>商品3</label> 13 <input id="item3" type="text" name="item3" value="<?php print htmlspecialchars($item3, ENT_QUOTES, "UTF-8"); ?>">14 </div> 15 </div> 16 17<input type="hidden" name="edit" value="<?php print htmlspecialchars($edit, ENT_QUOTES, "UTF-8"); ?>"> 18<input type="hidden" name="key" value="<?php print htmlspecialchars($key, ENT_QUOTES, "UTF-8"); ?>"> 19<p class="submit"><input type="submit" class="estimateSubmit btn-estimate" name="form-add" onClick="check()" value="お見積り結果"></p> 20</form>

投稿2017/10/04 07:03

naohiro19_

総合スコア178

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問