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

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

ただいまの
回答率

87.79%

DBへの登録の際、セッションに配列として保存しておいた値を取り出したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,247

score 403

まず、下記記述の確認をお願いします。
全部記述すると膨大な量になるので一部をシンプルにして記述します。

↓input.php

追加を2回押して
計6フォームを入力したとして、
6フォーム分の値をセッションに保存して
次ページ(確認ページ)にいきます。

<?php
session_start();
if(!empty($_POST)){
    $_SESSION['join2'] = $_POST;
    header('Location: preview.php');
}
?>


<script type="text/javascript">
    /*スキルエリアのセレクトボックスセットのクローン*/
    function skill_selectAdd(){
    var get = document.getElementById("skill_select");
    var set = get.cloneNode(true);
    var target = document.getElementById("skill_selectAdd");
    var btn_delete = document.getElementById("skill_select_btnDel");
        set.id= "test" + target.children.length;//idの重複を防ぐため、連番をつけておく
        target.parentNode.insertBefore(set, target);
        btn_delete.disabled = false;
    }
    /*スキルエリアのセレクトボックスセットの削除*/
    function skill_selectDel(){
        var targets = document.getElementsByClassName("skill_select");
        var btn_delete = document.getElementById("skill_select_btnDel");
        if (targets.length === 2) {
            btn_delete.disabled = true;
        }
        targets[1].parentNode.removeChild(targets[targets.length - 1]);//最後の要素を削除
    }
</script>


<form action="" method="post">
    <tr id="skill_select" class="skill_select">
        <td>
            <select name="programs1_[]">
                <?php echo Programmerskill::getSkill(); ?>
            </select>
        </td>
        <td>
            <select name="programs_year1_[]">
                <?php echo Skillyear::getYear(); ?>
            </select>
        </td>
    </tr>
    <tr id="skill_selectAdd">
        <td colspan="2">
            <input type="button" value="追加" onClick="skill_selectAdd()">
            <input type="button" value="削除" onClick="skill_selectDel()" id="skill_select_btnDel" disabled="true">
        </td>
    </tr>
    <input type="submit" name="submit" value="プレビュー">
</form>

↓preview.php

セレクトボックスで選択した3セット分(6件)の内容が表示されます。

<?php session_start(); ?>
・
・
・
<form action="thanks.php" method="post">
    <tr>
        <td>
            <?php
            $arr = $_SESSION['join2']['programs1_'];
            for($i=0;$i < count($arr);$i++ ) {
                echo h($arr[$i]).'<br />';
            }
            ?>
        </td>
        <td>
            <?php
            $arr = $_SESSION['join2']['programs_year1'];
            for($i=0;$i < count($arr);$i++ ) {
                echo h($arr[$i]).'<br />';
            }
            ?>
        </td>
    </tr>
    <input type="submit" name="submit" value="確定">
</form>

↓thanks.php

DBへ登録します。

<?php
session_start();

$dsn = 'mysql:dbname=test;host=localhost;charset=utf8';
$user = 'root';
$password = '';
$option = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$dbh = new PDO($dsn, $user, $password, $option);

$stmt = $pdo->prepare("INSERT INTO user_skill() VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->execute([
$_SEESION['join2']['programs1_1'],
$_SEESION['join2']['programs_year1_1'],
$_SEESION['join2']['programs1_2'],
$_SEESION['join2']['programs_year1_2'],
$_SEESION['join2']['programs1_3'],
$_SEESION['join2']['programs_year1_3'],
$_SEESION['join2']['programs1_4'],
$_SEESION['join2']['programs_year1_4'],
$_SEESION['join2']['programs1_5'],
$_SEESION['join2']['programs_year1_5'],
$_SEESION['join2']['programs1_6'],
$_SEESION['join2']['programs_year1_6']
]);

session_destroy();
?>


execute内に記述してますが、なんか違う気がします。

preview.phpでは
$arr = $_SESSION['join2']['programs1_'];
としてループさせているから記述量がすくないのですが、
echo $_SEESION['jion2']['programs1_1'];
echo $_SEESION['jion2']['programs_year1_1'];










とやろうと思えばできます。

でも、追加がどれくらい押されるか分からないので
「ある分」だけを表示させています。

これはthanks.phpにも同じことがいえて、
「ある分」だけを登録するようにしたい(そうすることで記述もスマートになる?)
のですが、どうすればよろしいでしょうか?

すいません、なんかごっちゃになってきて
確認画面では確認だから「ある分」だけを表示させればいいんですが
DB登録処理はあるない関わらず、「ない分」も用意しておかないといけませんね...

というのは、ユーザーがもう一個追加を押したら確認画面には追加分も表示されるでしょうが、
DB登録処理には
$_SEESION['join2']['programs1_7'],
$_SEESION['join2']['programs_year1_7']
を追加しなくてはなりませんから
そういう意味で「ない分」も記述しておく必要がありそうですね...

素人思考だと、
「ない分」を記述しておくのは非常に気持ち悪くて
それなら、preview.phpみたいに
$arr = $_SESSION['join2']['programs1_'];
というふうにしてせめてスマートな記述にしたいなと思って質問してみたのですが今回は無理がありそうですかね...?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • earnest_gay

    2016/06/20 10:30

    実際はかなりありますが、この質問では最大で6スキル(スキル名と日付で12カラム)というテーブルで正しいです。

    キャンセル

  • masaya_ohashi

    2016/06/20 10:50

    カラムは必ず「スキル名」「日付」「スキル名」「日付」…の順で並んでいるという認識で正しいですか?あと、これスキルのテーブルにユーザIDが保存されていないので、あとから「これ誰のスキル表だよ」となりそうな気がしますが…

    キャンセル

  • earnest_gay

    2016/06/20 11:01

    user_idというカラムはAIで設定しています。
    厳密には
    user_id
    skill1
    year1
    skill2
    year2






    というテーブル構成にしています。

    全体を話すと本質問内容が大きくなるので割愛しましたが
    勿論、名前や住所の入力ページもあります。

    user_data
    user_skill
    user_qualification
    user_pr

    各4つのテーブルを用意していてユーザーデータを分類しています。

    user_dataではAI付きのidを用意しているので

    user_skillもuser_qualificationもuser_prもuser_idは
    user_dataのidと紐つけられて
    だれのスキル
    だれの資格
    だれのPR文
    等の情報は識別できると思います。

    本質問はその延長線上の質問です。

    キャンセル

回答 2

checkベストアンサー

+2

テーブル構成等を考慮して、とりあえずのコードを書いてみました。テーブルのカラムが足りる分にはこれでどれだけ追加されても動くと思います。

「INSERT時にuser_idが入っていない」「全てのカラムのデータを渡すわけではないのでカラム名指定なしではINSERTできない」という問題もついでに直しています。ちなみに一度もテストしていないので正しく動く保証はありません。

// executeに渡すためのパラメータ
$inputParameters = array($user_id);// $user_idには登録するユーザのIDが入っているのものとする

// SQL文でカラム名を列挙するための配列
$columns = array("user_id");

// POSTされたprograms1_の数だけ繰り返す
for($i=0;$i<count($_SEESION['join2']['programs1_']);$i++) {

    // カラム名にスキル名、年を追加
    $columns[] = "skill" . ($i+1);
    $columns[] = "year" . ($i+1);

    // パラメータにスキル名、年を追加
    $inputParameters[] = $_SEESION['join2']['programs1_'][$i];
    $inputParameters[] = $_SEESION['join2']['programs_year1_'][$i];
}

// パラメータの数だけ?を並べる
$questions = str_repeat("?,", count($inputParameters));
// 末尾に,が残ってしまっているので削除
$questions = substr($questions, 0, strlen($questions)-1);

// SQL実行
$stmt = $pdo->prepare("INSERT INTO user_skill(".implode(",", $columns).") VALUES (".$questions.")");
$stmt->execute($inpuiutParameters);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/20 17:11 編集

    2つ前のコメントにあるように、$_SESSIONの中にuser_idが入っているならそれを使うべきです。ちゃんと「?」とパラメータの数は一致させたうえで、ですが。

    キャンセル

  • 2016/06/20 17:15

    $_SESSIONの中にuser_idは入っていないです。
    あると仮定して記述しています。

    キャンセル

  • 2016/06/21 11:43

    今朝の質問でこちらの質問も解決できました。
    ありがとうございます!

    キャンセル

0

preview.phpの省略されている部分の中で$_SESSION['join2']に値を保存していることを前提でお話するとすれば、thanks.phpで参照しているのが'jion2'というスペルミスなので参照できていないのだと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/20 10:11

    すいません!
    行き違いで質問内容大幅に変更させてもらいました!

    キャンセル

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

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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