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

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

ただいまの
回答率

90.47%

  • PHP

    20839questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 470

前提・実現したいこと

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

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

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

【現状】

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

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

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

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

【修正後】

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

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

現状のソース

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

<form action="" method="post" name="">
    <div class="item_wrap">
        <div class="item">
            <label>商品1</label>
            <input id="item1" type="text" name="item1" value="<?php print $item1; ?>">個
        </div>
        <div class="item">
            <label>商品2</label>
            <input id="item2" type="text" name="item2" value="<?php print $item2; ?>">個
        </div>
        <div class="item">
            <label>商品3</label>
            <input id="item3" type="text" name="item3" value="<?php print $item3; ?>">個
        </div>
    </div>

<input type="hidden" name="edit" value="<?php print $edit; ?>">
<input type="hidden" name="key" value="<?php print $key; ?>">
<p class="submit"><input type="submit" class="estimateSubmit btn-estimate" name="form-add" onClick="check()" value="お見積り結果"></p>
</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
session_start();
?>

<?php
//1回の注文テーブルを順番に表示
foreach ($_SESSION['order'] as $key => $value){
    $array = $value;

    //テーブル内の項目を順番に表示
    foreach ($array as $item => $number){

       if($item=='item1'){$item_name='商品1'; $item_size='サイズ1'; $item_img='商品画像URL';}
       if($item=='item2'){$item_name='商品2'; $item_size='サイズ2'; $item_img='商品画像URL';}
       if($item=='item3'){$item_name='商品3'; $item_size='サイズ3'; $item_img='商品画像URL';}

       if($number!==''){
            if($item=='order_id'){

            }else{
            print '
            <li>
            <div class="item_left">
            <figure><img src="'.$item_img.'" alt="" /></figure>
            <h3>'.$item_size.''.$item_name.'</h3>
            </div>
            <div class="item_center">'.$number.'個</div>
            <div class="item_right">
                <div class="change_btn"><input type="submit" class="return_btn" value="数量変更" onClick="form.action=\'form.php\';return true"></div>
                <div class="delete_btn"><a href="./delete.php?key='.$key.'">削除</a></div>
            </div>

            <input type="hidden" name="key" value="'.$key.'">
            <input type="hidden" name="edit" value="edit">
            <input type="hidden" name="商品1" value="'.$value[item1].'">
            <input type="hidden" name="商品2" value="'.$value[item2].'">
            <input type="hidden" name="商品3" value="'.$value[item3].'">
            </li>';
            }
        }
    }
}
?>

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

<?php
$key=$_REQUEST['key'];
$act=$_REQUEST['act'];
session_start();
unset($_SESSION['order'][$key]);


header("Location: ../estimate_change.php"); 
?>


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

//post.php
$_SESSION['order'][$key]=array(
                    item1 => $item1,
                    item2 => $item2,
                    item3 => $item3,
                    );


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

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

        )


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

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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 03:24

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

    キャンセル

+1

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

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

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

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

//変更時のみ
$edit=(string)filter_input(INPUT_POST, 'edit');
$key=(string)filter_input(INPUT_POST, 'key');

//見積もり商品追加フォーム入力時のpost
$item1=(string)filter_input(INPUT_POST, 'item1');
$item2=(string)filter_input(INPUT_POST, 'item2');
$item3=(string)filter_input(INPUT_POST, 'item3');


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

<form action="" method="post" name="">
    <div class="item_wrap">
        <div class="item">
            <label>商品1</label>
            <input id="item1" type="text" name="item1" value="<?php print htmlspecialchars($item1, ENT_QUOTES, "UTF-8"); ?>">個
        </div>
        <div class="item">
            <label>商品2</label>
            <input id="item2" type="text" name="item2" value="<?php print htmlspecialchars($item2, ENT_QUOTES, "UTF-8"); ?>">個
        </div>
        <div class="item">
            <label>商品3</label>
            <input id="item3" type="text" name="item3" value="<?php print htmlspecialchars($item3, ENT_QUOTES, "UTF-8"); ?>">個
        </div>
    </div>

<input type="hidden" name="edit" value="<?php print htmlspecialchars($edit, ENT_QUOTES, "UTF-8"); ?>">
<input type="hidden" name="key" value="<?php print htmlspecialchars($key, ENT_QUOTES, "UTF-8"); ?>">
<p class="submit"><input type="submit" class="estimateSubmit btn-estimate" name="form-add" onClick="check()" value="お見積り結果"></p>
</form>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • PHP

    20839questions

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