- ベストアンサー
PHPでリスト内容を変更する方法
- PHPを使って、同じ画面内でリストAから選択したデータに応じて別のリストBの内容を変更する方法を教えてください。
- 具体的には、国と県・地方の関係でリストAから国を選ぶとリストBに都道府県が表示され、さらに都道府県を選ぶとリストCに市町村が表示されるようにしたいです。
- データはサーバのテーブルからSQL文で取得することができ、処理はrequire関数やfunction関数を使用することも可能です。また、Javascriptを使っても同様の処理が可能です。ご教授いただけると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 「送信」ボタンを準備し、JavaScriptにてaction先を変えてあげればOKです。 function next ( formObj ) { formObj.action = "index2.php"; formObj.submit(); } <button type="button" onclick="next(this.form);">送信</button> こうすることで送信ボタンを押下した場合はindex2.phpにフォーム内容を送信します。
その他の回答 (3)
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 セキュリティの考慮やエラー処理等はかなり省いていますので参考程度に見てください。 また、DBは利用していませんがコードで紐付くように作ったので同じような作りになると思います。 ==== index.php <?php $cArray = array(); $cArray['01'] = '日本'; $cArray['02'] = 'アメリカ'; $tArray = array(); $tArray['01']['001'] = '東京都'; $tArray['01']['002'] = '大阪府'; $tArray['01']['003'] = '福岡県'; $tArray['02']['001'] = 'ニューヨーク'; $tArray['02']['002'] = 'フロリダ'; $tArray['02']['003'] = 'ワシントン'; $c = isset ( $_POST['c'] ) ? $_POST['c'] : NULL; $t = isset ( $_POST['t'] ) ? $_POST['t'] : NULL; // 国の選択肢を生成 $tList = '<option value="">----国を選択----</option>'; foreach ( $cArray as $key => $val ) { // 送信されたvalueがキーと同じ場合は初期選択とする $selected = $c === $key ? "selected=\"selected\"" : ""; $tList .= "<option value=\"$key\"$selected>$val</option>"; } // 国配下の選択肢を生成 $cList = ''; if ( !is_null($c) && $c !== '' ) { foreach ( $tArray[$c] as $key => $val ) { $selected = $t === $key ? "selected=\"selected\"" : ""; $cList .= "<option value=\"$key\"$selected>$val</option>"; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <title>【OKWave回答サンプル集】PHPによる自分自身を読んでリスト内容を変化</title> <link rel="stylesheet" href="/okwave/qa/css/basic.css" type="text/css" /> <script type="text/javascript"> function chgCombo ( obj ) { document.getElementById('id-t').selectedIndex = 0; document.getElementById('id-form').submit(); } </script> <style type="text/css"> </style> </head> <body> <h1>PHPによる自分自身を読んでリスト内容を変化(q7532984)</h1> <h2>サンプル</h2> <form action="index.php" method="post" id="id-form"> <select name="c" onchange="chgCombo(this);" id="id-c"> <?= $tList ?> </select> <select name="t" id="id-t"> <?= $cList ?> </select> </form> </body> </html> JavaScriptにて国のコンボが変更された場合に自分自身へsubmitして処理を行なっています。 初回アクセス時$c(国の選択値)はnullになります。 それを踏まえて動きを見てみてください。 (動作サンプルですが、ちょっとサーバの調子が悪くアップロード出来ないのでご了承ください)
お礼
ご丁寧に記載して頂きありがとうございます。 一つ質問があるのですが、<form>の<action>はその<form>で設定されたデータを別のページに持っていくために使いたいのですが、そうした場合は自分自身を呼ぶことはできないのでしょうか?
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 コンボを選択した時のアクションを利用するということはJavaScriptを併用することになります。 >国や地方などのデータはサーバにあるテーブルデータからSQL文で取得することはできるのですが。 >その処理もrequire関数とかfunction関数を用いた方が良いのかなど。 これについては設計次第です。 案1(ページのリロードが選択毎に起きる,選択毎にサーバへのアクセス) ページ表示時にリストAのデータを取得し表示、リストAを選択したら自分自身にリストAのデータを送信 ページ表示時に選択されたリストAのデータがある場合は選択値を元にリストBのデータを取得して表示 案2(ページのリロードは起きない,最初のアクセスのみ) ページ表示時にすべてのリストデータを取得しておき、JavaScript内に配列として保持し、それぞれのリスト選択時の処理で利用する。 (データ量によっては現実的では無い可能性あり) 案3(ページのリロードは起きない,選択毎にサーバアクセス) ページ表示時は単純にページを表示する。 ページ表示後にAjax通信を利用してリストAを取得し反映、リストAを選択時にAjax通信でリストBのデータを取得し反映 上記のような動きが考えられます。
お礼
ご回答ありがとうございます。 出来たら今から色々と勉強して作るよりも自分の知識から作れるような難しくない方法で出来たらなと思っています。 いくつか案を書いて頂きましたが、案1か案2辺りがいいのかな? もしよかったらたとえば案1でしたら具体的にどのように書けばいいか教えて頂けると嬉しいです。
- yambejp
- ベストアンサー率51% (3827/7415)
選んだら非同期でリストが更新されるようにするならajax 国を選んで送信→都道府県を選んで送信→市町村を選んで送信 というようにその都度送信するなら普通にPHP+SQLでいけると思います
お礼
回答ありがとうございます。 選択して最終的には国・都道府県・市町村のデータをformで渡すのですが。 難しい方法は大変そうなので、難しくない方というと後者になるんでしょうか?
お礼
ご回答ありがとうございます。 リストの変化についてはおかげさまで、上手く変化するようにできました。(^ー^) action先についても今回ボタンに画像を使うためにinput type="image"を使いましたが上手く行きました。本当にありがとうございました。m(_ _)m