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

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

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

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

Q&A

解決済

2回答

1507閲覧

SESSIONに保存した内容を取り出したい

earnest_gay

総合スコア615

PHP

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

0グッド

0クリップ

投稿2016/06/20 22:02

編集2016/06/20 22:03

###前提・実現したいこと
確認画面(2.php)では、SESSIONに保存した値を取り出せるが
DBへ登録するとき(3.php)には、SESSIONに保存した値をどう取り出せばよいでしょうか?

DB登録処理の際には、どうすれば値を取り出せるでしょうか?

###該当のソースコード

ファイル名:1.php <?php session_start(); if(!empty($_POST)){ $_SESSION['join2'] = $_POST; header('Location: 2.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>
ファイル名:2.php <?php session_start(); ?> <form action="3.php" method="post"> <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> <input type="submit" name="submit" value="確定"> </form>
ファイル名:3.php <?php session_start(); $dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; $user = 'root'; $password = ''; $option = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); $pdo = new PDO($dsn, $user, $password, $option); $user_id = $pdo->lastInsertId(); $stmt = $pdo->prepare("INSERT INTO user_skill(user_id,skill,year) VALUES (?, ?, ?)"); $stmt->execute([ $user_id, ???, ??? ]); $stmt = $pdo->prepare("INSERT INTO user_skill(user_id,skill,year) VALUES (?, ?, ?)"); $stmt->execute([ $user_id, ???, ??? ]); $stmt = $pdo->prepare("INSERT INTO user_skill(user_id,skill,year) VALUES (?, ?, ?)"); $stmt->execute([ $user_id, ???, ??? ]); ?>

???,
???
の部分が分かりません。

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

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

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

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

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

guest

回答2

0

ベストアンサー

programs1_とprograms_year1_の配列の長さは同じなんですよね?
だったら片方のループに合わせて片方も一緒に取り出すだけです。

PHP

1$programs1 = $_SESSION['join2']['programs1_']; 2$year1 = $_SESSION['join2']['programs_year1_']; 3 4for($i=0;$i<count($programs1);$i++) { 5 $stmt = $pdo->prepare("INSERT INTO user_skill(user_id,skill,year) VALUES (?, ?, ?)"); 6 $stmt->execute([ 7 $user_id, 8 $programs1[$i], 9 $year1[$i] 10 ]); 11}

この質問とは関係のない話になりますが、user_idはこのタイミングでlastInsertIdをしても正確な値は取れないと思います。というか何が入っているかわからないです。lastInsertIdは**「最後に挿入したレコードのID」**を返すもので、3.phpで呼び出したタイミングは、3.phpの中でまだ1件もINSERTは実行されていないため、値は不明なものになります(質問文のコードを省略しただけで、実際はuser_dataへのINSERTが3.phpのlastInsertIdの直前に行われているというなら別ですが)。

user_idは必ずマスターであるuser_dataのuser_idを引いたものであることが保証されるようにコードを組み直してください。あなたはこちらの質問でやり方を理解したはずです。
https://teratail.com/questions/38575

投稿2016/06/21 01:06

編集2016/06/21 01:08
masaya_ohashi

総合スコア9206

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

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

earnest_gay

2016/06/21 01:33 編集

回答ありがとうございます。 >>実際はuser_dataへのINSERTが3.phpのlastInsertIdの直前に行われているというなら別ですが はい。 質問には載せていませんが $user_id = $pdo->lastInsertId()の直前に user_dateへ登録するSQL文の記述があります。 >>user_idは必ずマスターであるuser_dataのuser_idを引いたものであることが保証されるようにコードを組み直してください。あなたはこちらの質問でやり方を理解したはずです。 user_dataテーブルにはuser_idカラムがありませんが オートインクリメント付きのidカラムがあります。 このidカラムを $user_id = $pdo->lastInsertId() のように取得して user_skillテーブルのuser_idカラムに挿入するようにすることで だれのスキルかを識別できるようにしています。 for($i=0;$i<count($programs1);$i++) { $stmt = $pdo->prepare("INSERT INTO user_skill(user_id,skill,year) VALUES (?, ?, ?)"); $stmt->execute([ $user_id, $programs1[$i], $year1[$i] ]); } PDOがfor文の中でも使えるとは知らなかったのですが まさに、こういうことが知りたかったのです。 ありがとうございます。 <td> <select name="programs1_[]"> <?php echo Programmerskill::getSkill(); ?> </select> </td> <td> <select name="programs_year1_[]"> <?php echo Skillyear::getYear(); ?> </select> </td> jsで追加するときもこれで1セットなので programs1_とprograms_year1_の配列の長さは同じです。
guest

0

ファイル3.php でも$_SESSION から、
foreach でループさせて、値を取得すればよいのでは?

セッションの配列の値を、
$stmt->bindParam(':test','セッション値') ;
という風にセットすればよいのではないでしょうか?

投稿2016/06/21 00:17

YK1037

総合スコア236

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

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

earnest_gay

2016/06/21 01:34

回答ありがとうございます。 回答頂いたものを参考に試行錯誤してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問