重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

プロフィールページなどでよくみる、セレクトメニューで誕生年を選択して更新するだけのコードを考えています。profileテーブルより、profile_idが 1のユーザーを更新します。

下記の場合、更新ボタンを押すと、データペースに登録されますが、 その後に、データを取り出したものを、セレクトフォームのオプションに設定しようとすると、表示上では初期状態にもどり、うまくいきませんでした。オプションの初期状態を指定するselectedをどのように書いたほうがよいでしょうか? または、私のかき方自体に問題があるかもしれません。アドバイスよろしくお願いします。



<?php
// 練習用 001.php
try{
require_once("../db/connect_db.php"); //接続情報

$sql="SELECT birthyear, profile_id FROM profile WHERE profile_id=1";
$stmt = $pdo->query( $sql);

$row = $stmt->fetch(PDO::FETCH_ASSOC);

}catch(PDOException $e){
die($e->getMessage());
}

if (@$_POST['submit']) {
$row['profile_id'] = strip_tags($_POST['profile_id']);
$row['birthyear'] = $_POST['birthyear'];

try{
require_once("../db/connect_db.php");

$sql="UPDATE profile SET birthyear=? WHERE profile_id =? ";

$datas=array(
$_POST['birthyear'],
$_POST['profile_id'] );

$stmt = $pdo->prepare( $sql);
$stmt->execute($datas);

}catch(PDOException $e){
die($e->getMessage());
}
}
?>



<!DOCTYPE html>
<html>
<body>

<?php print_r($row) //確認用 ?>

<form method="post" action="001.php">
<p>誕生年:<select name="birthyear"><option value="<?php echo $row['birthyear']= null ?>" > ---- </option> <?php optionLoop('1950', date('Y'));?></select>年</p>

<?php
function optionLoop($start, $end){
for($i = $start; $i <= $end; $i++){
echo "<option value=\"{$i}\">{$i}</option>"; }
}
?>

<input type="hidden" name="profile_id" value="<?php echo $row['profile_id'] ?>">
<p><input name="submit" type="submit" value="更新する"></p>

</form>
</body>
</html>

質問者からの補足コメント

  • つらい・・・

    補足ですが、

    echo "<option value=\"{$i}\" "; if($i == $row['birthyear']){ echo "selected"; } echo " > {$i}</option>" と記述して、

     年をループさせている 変数 $i と postで受け取っている $row['birthyear']) が同じならば、selectedを挿入するという文にしましたが、うまくいかず、($row['birthyear']の部分を配列でなく、直接数値をいれると、動くのですがー。。)、 思い当たるところとして、おそらくif(変数==配列)に問題ありかとおもったので、配列を変数に変換するextractを利用してextract($row['birthyear'])を試しましたがうまく変換されませんでした。 もし何か気付きましたらアドバイスください。

      補足日時:2016/04/17 13:57

A 回答 (2件)

最初にセレクト項目のある画面が利用者のブラウザに表示されている。


そこの画面でSubmitするとサーバ側に画面上で入力したり選択したりしていたデータが指定されたプログラムに向けてやってくる。
それを受け取ったサーバー上のプログラムはデータベースの更新など必要な処理を行い、処理結果を示す画面(HTML)を利用者のWebブラウザに向けて送出する。

まず、Webブラウザとサーバの間のこのやりとりの流れをよく理解することです。

で。処理結果の画面が先に処理前に表示していた画面と同様の物でかつ、利用者がデータ更新のために入力したり選択したりした状態のものを表示したいのでしたら画面上の点数値をそのようにしたHTMLを送出しなければなりません。
選択項目の場合は利用者が選んだ項目をselectedにしなければ目指す表示にはあんりません。
これはPHPの世界ではなくHTMLの世界です。先に書いた「Webブラウザとサーバの間のこのやりとりの流れをよく理解する」というのはこういう部分も含めてのことです。

参考まで。
    • good
    • 0
この回答へのお礼

ありがとうござまいした。順序だててHTMLを考えて見た結果、解決することができました。感謝します。

お礼日時:2016/04/19 17:17

No.1です。



>  年をループさせている 変数 $i と postで受け取っている $row['birthyear']) が同じならば、selectedを挿入するという文にしましたが、うまくいかず、($row['birthyear']の部分を配列でなく、直接数値をいれると、動くのですがー。。)、

 ここをなぜ追求しないのでしょう?
 プログラムは思った通りには動きません。作った通りに動きます。
 そういう意味でアルゴリズムが大切です。言語に落とす前にいかにして目標のHTMLを生成するか、その手順を日本語で考え書き物にまとめていますか?
 それをしっかり行わずソースコードばかり見ていてもダメです。
 まず日本語での処理手順がしっかり出来ていて、これで行けるという思いがあって、それから日本語を採用しているプログラム言語に翻訳するのです。
 先にも書きましたがどういうHTMLにすればよいか具体的にわかっていますか?
 それに対し今生成されているHTMLはどうなっていますか?(動いているのでしたらブラウザ側で確認していますね?)
 その差が仕様通りに動いていない不具合部分です。そこを生成しているソース部分を見れば原因は一目瞭然です。
    • good
    • 0
この回答へのお礼

やり方はもっといいほうほうがあるかもしれないですが、とりあえず formの中を少し変えただけで、解決しました。ありがとうございます。

<form method="post" action="001.php">
<p>誕生年:<select name="birthyear"><option value="<?php echo $row['birthyear']= null ?>" > ---- </option> <?php optionLoop('1950', date('Y'), $_POST['birthyear']);?></select>年</p>

<?php

function optionLoop($start, $end, $data){
for($i = $start; $i <= $end; $i++){
echo "<option value=\"{$i}\" "; if($i == $data){echo "selected" ;} echo "> {$i}</option>"; }

}
?>
<input type="hidden" name="profile_id" value="<?php echo $row['profile_id'] ?>">
<p><input name="submit" type="submit" value="更新する"></p>
</form>

お礼日時:2016/04/19 17:25

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