
プロフィールページなどでよくみる、セレクトメニューで誕生年を選択して更新するだけのコードを考えています。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>
No.1ベストアンサー
- 回答日時:
最初にセレクト項目のある画面が利用者のブラウザに表示されている。
そこの画面でSubmitするとサーバ側に画面上で入力したり選択したりしていたデータが指定されたプログラムに向けてやってくる。
それを受け取ったサーバー上のプログラムはデータベースの更新など必要な処理を行い、処理結果を示す画面(HTML)を利用者のWebブラウザに向けて送出する。
まず、Webブラウザとサーバの間のこのやりとりの流れをよく理解することです。
で。処理結果の画面が先に処理前に表示していた画面と同様の物でかつ、利用者がデータ更新のために入力したり選択したりした状態のものを表示したいのでしたら画面上の点数値をそのようにしたHTMLを送出しなければなりません。
選択項目の場合は利用者が選んだ項目をselectedにしなければ目指す表示にはあんりません。
これはPHPの世界ではなくHTMLの世界です。先に書いた「Webブラウザとサーバの間のこのやりとりの流れをよく理解する」というのはこういう部分も含めてのことです。
参考まで。
No.2
- 回答日時:
No.1です。
> 年をループさせている 変数 $i と postで受け取っている $row['birthyear']) が同じならば、selectedを挿入するという文にしましたが、うまくいかず、($row['birthyear']の部分を配列でなく、直接数値をいれると、動くのですがー。。)、
ここをなぜ追求しないのでしょう?
プログラムは思った通りには動きません。作った通りに動きます。
そういう意味でアルゴリズムが大切です。言語に落とす前にいかにして目標のHTMLを生成するか、その手順を日本語で考え書き物にまとめていますか?
それをしっかり行わずソースコードばかり見ていてもダメです。
まず日本語での処理手順がしっかり出来ていて、これで行けるという思いがあって、それから日本語を採用しているプログラム言語に翻訳するのです。
先にも書きましたがどういうHTMLにすればよいか具体的にわかっていますか?
それに対し今生成されているHTMLはどうなっていますか?(動いているのでしたらブラウザ側で確認していますね?)
その差が仕様通りに動いていない不具合部分です。そこを生成しているソース部分を見れば原因は一目瞭然です。
やり方はもっといいほうほうがあるかもしれないですが、とりあえず 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>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpの問い合わせフォームを作っ...
-
フォームで戻った際に入力済み...
-
PHP8でWarning:Undefined varia...
-
BASIC認証のフォームをデザイン...
-
入力フォームの空白や改行を制...
-
PHP8を使うと、大量のWarningが...
-
ファイルアップロードに関して...
-
Q&Aサイトを作成していてURLの...
-
PHPのエラーの解消法について教...
-
composerをインストールしたい...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
SplFileObject を利用したとき...
-
PHPの勉強してます。 配列のと...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
dbに登録したデータをphpのプル...
-
DBで検索結果に該当するデータ...
-
アラートでyes noを作りたいです。
-
PHPの画像表示関連(?)プログラ...
-
データの取得方法
-
配列で指定した値のみをMySQLか...
-
警告を出さないコードの書き方
-
PHPで[]の使い方について
-
ループ文で呼び出したデータの...
-
DBからSelectしたレコードのデ...
-
mySQLで結果が無いときの処理
-
データベースのページング出力...
-
PHP セレクトメニューの呼び出...
-
PHP 10件表示 "前へ" "次へ"
-
mySQLからデータを取り出す
-
データベースサーバーにあるデ...
-
PHPのプルダウンメニューにDBの...
-
mysql>PHPにデータ表示、10件ご...
-
テーブル<TR></TR>の処理について
-
php テーブルが作成できない
おすすめ情報
補足ですが、
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'])を試しましたがうまく変換されませんでした。 もし何か気付きましたらアドバイスください。