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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1142閲覧

路線名と駅名のプルダウンを連動させたい

mikiko.s

総合スコア14

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/12/12 03:11

編集2021/12/12 06:20

CMSを作っており、路線名と駅名のプルダウンを連動させたいと考えています。
路線を選んだら、その路線の駅名を表示させるようにしたいです。
路線と駅名はそれぞれのデータベースがあり、路線idがそれぞれに入っています。

現在のソースを書かせていただきます。

<select name="line1"> <option value="">-----沿線を選択-----</option> <? $recordSet_Li=mysqli_query($conn,"SELECT * FROM line"); while($Li = mysqli_fetch_assoc($recordSet_Li)){ $LINE_NAME=htmlspecialchars($Li['line_name']); $LINE_CD=htmlspecialchars($Li['line_cd']); ?> <option value="<?=$LINE_CD?>"><?=$LINE_NAME?></option> <?}?> </select> <select id="station1"><option value="">-----駅を選択-----</option></select> <script> var array = new Array(); array[''] = new Array({cd:"0", label:"-----駅を選択-----"}); array["11603"] = new Array( {cd:"1160301", label:"大阪"}, {cd:"1160308", label:"甲南山手"}, {cd:"1160309", label:"摂津本山"}, {cd:"1160310", label:"住吉"}, {cd:"1160311", label:"六甲道"} ); array["34001"] = [ {cd:"3400101", label:"大阪梅田"}, {cd:"3400102", label:"中津"}, {cd:"3400111", label:"岡本"}, {cd:"3400112", label:"御影"}, {cd:"3400113", label:"六甲"} ]; document.getElementById('line1').onchange = function(){ station1 = document.getElementById("station1"); station1.options.length = 0 var changedPref = line1.value; for (let i = 0; i < array[changedPref].length; i++) { var op = document.createElement("option"); value = array[changedPref][i] op.value = value.cd; op.text = value.label; station1.appendChild(op); } } </script>

上記のソースは、一旦試しで書いてみたのですが、
ジャバスクリプトの中で、データベースから引っ張ってきたデータを繰り返す
書き方をご教示いただけないでしょうか。

array["路線コード1"] = [
{cd:"駅コード1", label:"駅名1"},
{cd:"駅コード2", label:"駅名2"},
];
array["路線コード2"] = [
{cd:"駅コード1", label:"駅名1"},
{cd:"駅コード2", label:"駅名2"},
];
というふうに繰り返したいです。
(上記のソースでは、駅のデータベースからデータを取得する記述はまだ書いていません)

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

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

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

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

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

guest

回答3

0

選択時のイベントをJavascriptで捕捉
→選択肢をリクエストパラメータとして非同期通信(Ajax,fetch API)
→PHPでリクエストパラメータ受け取って検索結果返却
→返却値を受け取ってoptionを再構成

という形になるかと

投稿2021/12/12 03:54

m.ts10806

総合スコア80861

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

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

mikiko.s

2021/12/12 06:21

回答いただき、ありがとうございます。質問内容を少し修正させていただきました。ジャバスクリプトやphp初心者のため、ご教示いただけますと幸いです。
m.ts10806

2021/12/12 08:30

CMS使っている、MySQL なのにDBに情報持たないのはどうしてでしょうか。
m.ts10806

2021/12/12 08:32

私の回答を実現しようとすると「JavaScriptで配列をループして」ということにはならないです。必要な情報だけを非同期通信で取得するので。
mikiko.s

2021/12/12 10:51

データベースに情報はあります。駅名のところをデータベースから引っ張ってきて、ジャバスクリプトで繰り返すという書き方が分からなくて、一旦上記のように書いています。 書いてくださっていた回答がちょっとわからなくて、別のやり方でやろうとしていた次第です。。
m.ts10806

2021/12/12 21:52

全て一気にやろうとするからかと思います。 1つずつやってみてください。動的(変数)になるところは固定値で。
mikiko.s

2021/12/14 10:57

回答ありがとうございます。やり方を変えてみて、うまく行きました。。。
guest

0

自己解決

やり方を変えまして、下記のやり方でうまく行きました。
回答いただき、ありがとうございました。

<dl class="CONTACT"> <dt><span>交通1</span></dt> <dd> <select class="parent" name="line1_id" required> <option value="" class="msg" disabled selected>路線を選択</option> <?php $recordSet_City=mysqli_query($conn, 'SELECT * FROM line'); while ($City = mysqli_fetch_assoc($recordSet_City)){ $LINE1_NAME=htmlspecialchars($City['line_name']); $LINE1_CD=htmlspecialchars($City['line_cd']); ?> <option value="<?=$LINE1_CD?>"><?=$LINE1_NAME?></option> <?php }?> </select>
<select class="children" name="station1_id" required> <option value="" class="msg" disabled selected>駅を選択</option> <?php $recordSet_St=mysqli_query($conn, 'SELECT * FROM station'); while ($St = mysqli_fetch_assoc($recordSet_St)){ $STATION1_CD=htmlspecialchars($St['station_cd']); $STATION1=htmlspecialchars($St['station_name']); $STATION1_LINE_CD=htmlspecialchars($St['line_cd']); ?> <option value="<?=$STATION1_CD?>"data-val="<?=$STATION1_LINE_CD?>"><?=$STATION1?></option> <?php }?> </select>
</dd> </dl> <script>$(function() { var $children = $('.children'); var original = $children.html(); $('.parent').change(function() { var val1 = $(this).val(); $children.html(original).find('option').each(function() { var val2 = $(this).data('val'); if (val1 != val2) { $(this).not('optgroup,.msg').remove(); } }); if ($(this).val() === '') { $children.attr('disabled', 'disabled'); } else { $children.removeAttr('disabled'); } }); }); </script>

投稿2021/12/14 10:59

mikiko.s

総合スコア14

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

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

m.ts10806

2021/12/14 11:01 編集

コードはマークダウンのcode機能を利用してご提示ください。 https://teratail.com/questions/238564 ただ、JavaScriptでゴチャゴチャやりすぎてるので、やはり選択時に非同期でデータ得て構成したほうがスッキリすると思います。
guest

0

ますSQLはどうであれ、これが動くでしょうか?

test.php

php

1<?php 2 3$cmd = json_decode (file_get_contents ('php://input'), true); 4$type = $cmd['type']; 5$value = $cmd['value']; 6$rst = [ ]; 7 8switch ($cmd['type']) { 9 case 'line1': 10 $rst = [ 11 ["-----沿線を選択-----", ""], 12 ["JR神戸線", "11603"], 13 ["阪急神戸本線", "34001"] 14 ]; 15 break; 16 case 'station1' : 17 switch ($value) { 18 case "" : 19 $rst = []; 20 break; 21 case "11603" : 22 $rst = [ 23 ["-----駅を選択-----", ""], 24 ["大阪","1160301"], 25 ["甲南山手","1160308"], 26 ["摂津本山","1160309"], 27 ["住吉", "1160310"], 28 ["六甲道","1160311"] 29 ]; 30 break; 31 case "34001" : 32 $rst = [ 33 ["-----駅を選択-----", ""], 34 ["大阪梅田", "3400101"], 35 ["中津", "3400102"], 36 ["岡本", "3400111"], 37 ["御影", "3400112"], 38 ["六甲", "3400113"] 39 ]; 40 break; 41 } 42 break; 43} 44 45 46header ('Content-type: application/json; charset=utf-8'); 47header ('X-Content-Type-Options: nosniff'); 48echo json_encode ($rst); 49?> 50

html

1<!DOCTYPE hrml> 2<meta charset="UTF-8"> 3<title></title> 4<style></style> 5 6<body> 7 8<select name="line1"></select> 9<select name="station1"></select> 10 11 12<script> 13const replaceSelect=(a,b=[])=>a.replaceChildren(...b.map(c=>new Option(...c))); 14 15 16async function ajax (path, args = { }) { 17 let res = await fetch (path, { method: 'post', body: JSON.stringify (args) }); 18 return JSON.parse (await res.text ()); 19} 20 21 22async function loading (select, arg = {}) { 23 let data = await ajax ("test.php", arg); 24 replaceSelect (select, data); 25} 26 27 28function changeHandler () { 29 let value = s0.value; 30 loading (s1, {type: "station1", value}); 31} 32 33//---------- 34 35let [s0, s1] = document.querySelectorAll ('select'); 36s0.addEventListener ('change', changeHandler, false); 37loading (s0, {type: "line1"}); 38 39</script> 40

投稿2021/12/12 16:37

babu_babu_baboo

総合スコア616

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

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

mikiko.s

2021/12/14 11:00

回答ありがとうございました。検証していないのですが、やり方を変えてうまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問