AJAX+PHPでセレクトボックスの連動

このQ&Aのポイント
  • AJAXとPHPを使用して、セレクトボックスを連動させる方法について教えてください。
  • 一回目のセレクトボックスの選択で、2つ目のセレクトボックスを生成できましたが、2回目の選択時に問題が発生します。どのように対処すれば良いですか?
  • 質問者は、AJAXとPHPを使ってセレクトボックスを連動させようとしています。最初の選択では2つ目のセレクトボックスを生成できましたが、2回目の選択時に問題が発生します。解決策を教えてください。
回答を見る
  • ベストアンサー

AJAX+PHPでセレクトボックスの連動

AJAX+PHPでセレクトボックスの連動をしようとしています。 function SelAjax(){ var x = $('#category1').val(); $.ajax({ type: "POST", url: "category.php", data: {"prm":x}, dataType: "json", success: function(data, status){ $.each(data,function(i) { $('#category2').append($('<option>').attr({ value: i }).text(data[i])); }); }, error: function(XMLHttpRequest, status, errorThrown){ alert("エラーが発生しました!"); } }); } としています。 PHP側で $CATEGORY2 = array( 1 => array( 1 => "a", 2 => "b", 3 => "c", 4 => "d", ), 2 => array( 1 => "e", 2 => "f", 3 => "g", 4 => "h", ), 3 => array( 1 => "i", 2 => "j", 3 => "k", 4 => "l", ), 4 => array( 1 => "m", 2 => "n", 3 => "o", 4 => "p", ), 5 => array( 1 => "q", 2 => "r", ), 6 => array( 1 => "s", 2 => "t", 3 => "u", ), ); $ary = array(); if($_POST["prm"]){ for($i=1;$i<=6;$i++){ if($i ==$_POST["prm"] ) $ary = $CATEGORY2[$i]; } } echo json_encode($ary); としています。 一回目に1番目のセレクトボックスを選択してAjaxでPOSTし2つ目のセレクトボックスを生成できました。 しかし、2回目として1番目のセレクトボックスを選択した際に、1回目にPHPから受け取った配列に積みあがってしまいます。 どのように対処すればいいかわかりません。 教えてください。

  • AJAX
  • 回答数2
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

No.1です。おっと、複数<option>があるのでリプレースはだめですね。 やはり全部削除してから追加ですね。 success: function(data, status){ $("#category2").empty(); $.each(data,function(i) { $('#category2').append($('<option>').attr({ value: i }).text(data[i])); }); },

eccschool
質問者

お礼

おお・・・ すばらしい!! emptyっていうのがあったんですね。 感激しました。 javascriptで普通にonchangeでできないこともないのですが、敢えてajaxに挑戦してみました。 ありがとうございました。 あやうくノイローゼになりそうでした。(笑)

その他の回答 (1)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

セレクトボックスのhtml部分が、掲載されてないので、 中途半端な解答ですが、 appendする前に、前にappendした<option>を削除していないから 積みあがっていくのだと思います。 jQueryだとリプレースのメソッドもあるので、 $.each(data,function(i) { $('#category2 > option').replaceWith($('<option>').attr({ value: i }).text(data[i]) }); でどうでしょうか。

関連するQ&A

  • ajaxでPHPにPOST送信して結果データを受信しようとしていますがうまくいきません。

    セレクトボックスの値を受け取りPOST送信 <HTML側> function SelValue(){ var x = $('#category1').val(); $.ajax({ type: "POST", url: "category.php", data: {"prm":x}, dataType: "json", success: function(data, status){ alert(data.address1 + data.address2); }, error: function(XMLHttpRequest, status, errorThrown){ alert("エラーが発生しました!"); } }); } 以下category.php if(!$_POST) header("Location: input.php"); $CATEGORY2 = array( 1 =>array( 1 => "a", 2 => "b", 3 => "c", ), 2 => array( 1 => "d", 2 => "e", 3 => "f", ), 3 => array( 1 => "g", 2 => "h", 3 => "i", ), ); $ary = array(); if($_POST["prm"]){ for($i=1;$i<=3;$i++){ foreach($CATEGORY2[$i] as $key => $value){ if($key == $_POST["prm"]) $ary = $CATEGORY2[$i]; } } } json_encode($ary); としています。 PHPにPOSTしたデータも確認できないし jsonデータを表示できないです。 どのようにしたらいいかわかりません。 ajax初心者でわからないことだらけです。 教えてください。

    • ベストアンサー
    • AJAX
  • AJAXでプルダウン連動(SJIS環境)

    Ajaxでプルダウン連動をしようとしています。 id="prm"と設定したプルダウンを変更して プルダウンprm2を設定しようとしています。 エラー処理の表示もできません。 SJIS環境でエンコードしています。 jsonには入っています。 配列のkey部分には連続しないコードの数値が入ります。 どこが悪いのか教えてください /* test.php */ $sql = "select hoge,foo "; $sql .= " from table_a "; $sql .= " where start <= '".date("Y-m-d")."' "; $sql .= " and end >= '".date("Y-m-d")."' "; $sql .= " ・・・・・ "; $sql .= " ・・・・・ "; $pnt = DbExec($conn, $sql); if (@mssql_num_rows($pnt)){ while ($rows = mssql_fetch_array($pnt)) { $hoge = mb_convert_encoding($rows['hoge'],"UTF-8"); $foo = mb_convert_encoding($rows['foo'],"UTF-8"); $c_ary[$hoge] = $foo; } } echo json_encode($c_ary); /* HTML */ $(function(){ //プルダウンに変更 $('#prm').change(function(){ var prm = $('#prm').val(); $.ajax({ url : "test.php", dataType : "json", data : {prm:prm}, type : "post", success: function(data, status){ $("#prm2").empty(); $.each(data,function(i) { $('#prm2').append($('<option>').attr({ value: i }).text(data[i])); }); },error : function(){ alert(data.responseText); } }); }); });

    • ベストアンサー
    • AJAX
  • AJAXでPHPの配列を用いたセレクトボックスの連動

    AJAXでPHPの配列を用いたセレクトボックスの連動を行いたいと思っています。たとえば、 PHPで配列をセットしセレクトボックスを生成します。 1番目のセレクトボックスで1番目の項目を選択すると 2番目のセレクトボックスの内容が連動して変化する。 といった動きを目指しています。 2番目のセレクトボックスの内容もPHPで持って設定したいと考えています。 1番目のセレクトボックスのvalue値が2ならばajaxで通信して21から29までのkeyの配列を設定するという形式ですが。どのようにして良いかわかりません。 教えて下さい。

    • ベストアンサー
    • AJAX
  • jquery PHP 値 ajax

    失礼します。現在jqueryで作成した2次元配列をPHP側に渡したいのですが上手くいきません。 jquery側のコンソールで確認した際にはsuccessの処理が行われ配列の中身がjson形式で表示されるのですが、その内容をPHP側で確認しようとするとNULLが返ってきてしまいます。 何卒ご教授よろしくお願いいたします。 html側 $(function(){ // 送るデータ形式はJSONでなければ、PHP側でエラーが出る.のでJSON.stringify()でJSON形式に変換 send_data= JSON.stringify(data); // 送信処理 $.ajax({ url: "ajax.php", // 送信先のPHP type: "POST", // POSTで送る contentType: "Content-Type: application/json; charset=UTF-8", //必須ではなさそうだが、サーバ側との整合のために明示しておいた方がよい。 // dataType: 'json', //受信形式 必須ではなさそうだがサーバ側との整合のために明示しておいた方がよい。 data:send_data //JSON形式の送信データ }).success(function(data, status, xhr) { // 通信成功時の処理 console.log("success"); console.log("data ="+data); console.log("status ="+status); console.log("xhr ="+xhr); }).error(function(xhr, status, error) { // 通信失敗時の処理 console.log("error"); }).complete(function(xhr, status) { // 通信完了時の処理 console.log("fin"); }); }) }) PHP側 二通り試してみました。 <?php //php://inputはPOSTの生データを取得できる $json = file_get_contents("php://input"); //JSON形式データをPHPの配列型に変換 $data = json_decode($json); var_dump($data) ; //POSTできたデータを格納 $hoge = $_POST['data']; var_dump($hoge);

    • ベストアンサー
    • AJAX
  • PHP+Ajaxでプルダウンの連動

    お世話になっております。久しぶりですが、わからないところが出てきたので、質問させてくださいませ。 現在、PHP+MySQLでホームページを作っています。 A(大カテゴリ)、B(小カテゴリ)のそれぞれのプルダウンを持っていて、 MySQL上では、BはどのAに所属しているかが格納されています。 その上で、 PHPソース <script type="text/javascript" src="ajax.js"></script> Aの部分 <select name="category" id="category" onChange="changePack(this)"> <option value="">--</option> <option value="1">A-1</option> <option value="2">A-2</option> <option value="3">A-3</option> </select> Bの部分 <select name="pack" id="pack"> <option value="">--</option> </select> Ajax部分のソース // 検索結果画面初期表示用 function setList() { var Category = "0"; var Pack = "0"; setPackOption(Category); document.rsv_input.category.selectedIndex = 0; document.rsv_input.pack.selectedIndex = 0; } // カテゴリ選択時 function changePack(Category) { var Category; getResult(Category.value); } function getResult(Category) { //XMLHttpRequestオブジェクト生成 var xmlhttp = createHttpRequest(); if (xmlhttp == null) { return null; } var data = ""; data += "category=" + Category; sendRequest(xmlhttp, "POST", "result.php", false, data, callBack); } function callBack(xmlhttp) { var result = xmlhttp.responseText; var resArray = result.split(","); for (i=0; i<resArray.length; i++) { var packArray = resArray[i].split("/"); document.rsv_input.pack.options[i] = new Option(packArray[1], packArray[0]); } } relust.phpのソース $category = ( $_POST["category"] != "0" )? $_POST["category"] : ''; select文で「$category」を持つ、レコードから「小カテゴリ」のid、名称 を取得 $id = $Cols['id']; $name = $Cols['name']; $data .= ',' . $id . '/' . $name; echo($data); としておりますが、小カテゴリのプルダウンに$dataの中身が反映されません。(result.phpの$_POSTを$_GETに変更して単体で動かした場合は、$dataが読み取れる状態になります。) http://www.okushin.co.jp/information/Ajax_report/06_sample02.php を参考にさせていただいていますが、プルダウンの総数が違う。や、最終結果をテキストデータとしてhtml中に書き出すなど若干の相違点でつまずいています。 当方、PHP(0.5年)、JavaScript(0.5年)位の経験しか持ち合わせていないので、余計にわかってないだけかも知れません。 お手数をおかけいたしますが、修正箇所の指摘やその方法などを教えていただけませんでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • jquery,ajaxによるphp通信でnull

    初めまして。 現在jqueryを勉強中の学生です。 いろいろなサイトを参考にしつつ、試しににjquery・ajaxを使ったphpとの通信を試みているのですが、文字列のやりとりがうまくいきません。 数字ではうまくいくのですが、文字になるとalertの部分でnullと返されてしまいます。 アドバイス等頂ければと思います。 よろしくお願いいたします。 以下部分的ではありますがコードを示します。 (jqueryはjquery-1.11.1.min.jsを使用) [js] $.ajax({ type: "POST", url: "step1.php", data: send_data, success: function(receive_data) { var parseAr = JSON.parse(receive_data); alert(parseAr[0]['name']); }, error: function(XMLHttpRequest, textStatus, errorThrown) {alert('Error: ' + errorThrown); } }); return false; [php側] <?php if(isset($_POST['name'])) { $result = array(); $result[] = array('name'=>'織田', 'age'=>'33'); $result[] = array('name'=>'織田', 'age'=>'33'); echo json_encode($result); } else { echo json_encode('The parameter of "name" is not found.'); } exit; ?>

  • ajaxでPOSTする変数の変数名を動的に変えたい

    ajaxでPOSTする変数の変数名を動的に変えたいのですが、方法が分かりません。 unction Addnt(num){ var pnum = $("#p"+num).val(); var num = num; $.ajax({ type: "POST", url: "addnt.php", data: {"'p'+num+":pnum,"num":num}, dataType: "json", success: function(data, status){ }, error: function(XMLHttpRequest, status, errorThrown){ alert("入力をご確認ください。"); } }); } と言う風に data: {"'p'+num+":pnum,"num":num}, としたのですがうまくいきません。 p+numのkeyでpostしたいのです。 PHP側でどのように飛んだか確認する方法ってないですよね・・・。 よろしくお願いします。

  • phpのセレクトボックスの配列について

    お世話になっています。 PHPのセレクトボックスの設定でわからないことがあります。 一度質問させていただいたのですが連なる点でわからないとこが出たので質問させていただきます。 不明点は3つあります。 1.セレクトボックスの値を配列で設定する 配列で設定しておけばその配列を複数使用しても参照配列さえメンテすればいいと思うので配列を想定しています 2.配列で設定したときのセレクトボックスの初期値について セレクトボックスの値をベタ書きしている場合は単にselectedすればいいと思うのですが配列の場合厳密なselectedの方法が不明です 3.配列での選択値をPOSTした場合 3つめが最もはまっています以下のソースだと選択値が配列の値が表示されますし、初期値も表示できていますが POSTした値がまともに渡されていません POST先でDB処理を想定しているのですがdate型だとすべて[00:00:00]になってしまいます。 配列を使用しないパターンだと1.2.3全てうまくいくのですがメンテナンスがしづらいので配列で指定したいです 何か、良い方法があればご教授ください //配列の値 $time = array( "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" ); $minute = array ("00", "15", "30", "45"); for( $a=0; $a < count( $time_array ); $a++){ $selectedStartTime =($time_array[$a] == $start_time[$j])?" selected":""; $startTimeSelectBox .= "\t<option value=\"{$time_array[$a]}\"{$selectedStartTime}>{$time_array[$a]}</option>\n"; } for($a=0; $a < count($minute_array); $a++){ $selectedStartMinute =($start_minute[$j] == $minute_array[$a])?" selected":""; $startMinuteSelectBox .="\<option value=\"{$minute_array[$a]} \"{$selectedStartMinute}>{$minute_array[$a]}</option>\n"; } <td><select name="start_time<?php echo $day ?>" onblur = "func()"> <?php echo $startTimeSelectBox ?> </select> : <select name="start_minute<?php echo $day ?>" onblur = "func()"> <?php echo $startMinuteSelectBox ?> </select> </td> かなり詰まっています。よろしくお願いします。

    • ベストアンサー
    • PHP
  • jQuery $.ajax JSON形式のPOST

    jQuery $.ajax JSON形式のPOSTでフォーム内容を送信し、送信先のPHPでメール送信させるプログラムをかいているのですが、どうしても$.ajaxのerrorが呼び出される状況です。errorが呼び出されますが、PHPの方のメール送信はできております。 PHP側の出力がうまくいっていないのではないかと思いますが、原因がわかりません。どなたかご教授いただけないでしょうか?宜しくお願いします。 ---js--- $("#send").click(function(){ var NAME = $('#name').val(); var EMAIL = $('#email').val(); var TITLE = $('#titlel').val(); var COMMENT = $('#comment').val(); $.ajax({ url : "sendmail.php", dataType : "json", data : {name:NAME, email:EMAIL, title:TITLE, comment:COMMENT}, type : "post", success : function(data){ if(data != ''){ alert(data.result); } }, error : function(){ alert("通信に失敗しました。"); } }); }); ---sendmail.php--- if($_SERVER["REQUEST_METHOD"] != "POST"){ header("HTTP/1.0 404 Not Found"); return; }else{ //メール送信処理 (省略) $message = "送信完了メッセージ"; $result = array('result' => $message); echo json_encode($result); }

  • 連動するセレクトボックスの内容を増やしたい

    お世話になります。 現在JavaScriptで以下のサンプルのような連動セレクトボックスを作っているのですが、親と子のセレクト項目を増やすやり方がわからず困っています。 http://enjoyjob.blog116.fc2.com/blog-entry-221.html サンプルでは親と子のセレクトボックスが3つなのですが、 7つの親と子のセレクトボックスを作りたいと思っています。 JavaScriptのどの部分を変えればいいのかどうかご教授お願いいたします。 <script type="text/javascript"> var parentArray = new Array('東京都','神奈川県','静岡県'); ////親セレクトボックスを配列から書き出し function autoOptions(){ var parent=parentArray.length; var selectNumber = document.getElementsByTagName("select").length; for(var j=0;j<=selectNumber/2-1;j++){ idName='parent_'+j; document.getElementById(idName).length=parent+1; for(var i=0;i<parent;i++){ document.getElementById(idName).options[i+1].text= parentArray[i]; } } } ////連動セレクトボックス function selectBox(n){ var idParent='parent_'+n; var idChild='child_'+n; if(document.getElementById(idParent).selectedIndex==0){ document.getElementById(idChild).length=1; document.getElementById(idChild).selectedIndex=0; } else { document.getElementById(idChild).selectedIndex=0; document.getElementById(idChild).length=1; var child = childArray[document.getElementById(idParent).selectedIndex-1]; document.getElementById(idChild).length=child.length+1; for(var i=0;i < child.length;i++){ document.getElementById(idChild).options[i+1].text= child[i]; } } } ////子セレクトボックスの配列 var childArray = new Array(); childArray[0]=new Array("渋谷区","品川区","港区","新宿区"); childArray[1]=new Array("横浜市","川崎市","厚木市","小田原市"); childArray[2]=new Array("静岡市","浜松市","三島市","焼津市","清水市"); </script>

専門家に質問してみよう