sendRequestのcallback

このQ&Aのポイント
  • JavaScriptのsendRequest関数を使用してAjaxとPHPを連携させるための質問です。
  • net.phpから返された値がcallback関数で受け取れない問題についての質問です。
  • callback関数の使い方について教えていただきたいです。
回答を見る
  • ベストアンサー

sendRequestのcallback

以前に「プルダウンメニューの利用」で質問させてもらった者です。 Ajaxを使ってのPHPとの連携のため、sendRequestを使用しました。以下がJavaScriptになります。 function test(oj) { sendRequest( on_loaded1, //コールバック関数 'data='+oj.value, //データ 'GET', // HTTPメソッド 'net.php', //URL true, //非同期 true //強制ロード ) } net.phpにデータを送信し、計算をします。 net.phpからはreturnで以下のような配列を返します。 return $array($RaD, $RaM, $RaS, $DecD, $DecM); 返還された値をcallback関数、以下のような関数で受け取っています。 function on_loaded1(oj){ var res = new Array(); res["RaD","RaM","RaS","DecD","DecM"] = oj.responseText document.forms["atai"].elements["RaD"].value = res alert(res); } しかし、alertには何も表示されないため、値が帰ってきていません。 callback関数の使い方がいまいち判らないので、ご教授いただければと 思い質問させていただきました。 よろしくお願いします。

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

  • ベストアンサー
noname#84373
noname#84373
回答No.1

PHP側で、returnで値を返さず、echo で返すのでは?

関連するQ&A

  • callback関数が起動しない

    新人プログラマーです。 Javascript/PHP/MySQLで検索→リスト表示のプログラムを作っています。 Javascriptの中で、Ajax通信は行うようですが、callバック関数が起動しません。 ブレークポイントを設定しても★★のところで終了してしまい、function callback(request)が 起動しない状態です。 以前も似たようなことがあり(そのときはJASONの形式が不正でうまくcallback関数が起動しなかった)、この掲示板で助けて頂いたのですが、 PHP側を丁寧に見てみましたが、データベースの検索はちゃんとできて、JSONの形式で渡せているようです。 コンソールには [{"id":"1","customerName":"山田 アヤ","category":"果物","jusyo1":"東京都新宿区新宿","latestDate":"2012-12-22","reserveDate":"2012-12-22"},{"id":"2","customerName":"田中 かおる","category":"野菜","jusyo1":"東京都中央区銀座","latestDate":"2012-12-10","reserveDate":"2012-12-31"}] と表示されていますので、JASONは生成されていると判断しました。 なぜcallバック関数が起動しないのか、どなたか教えて下さい。 よろしくおねがいします。 【Javascript側】 // 一覧検索 function doAction(){ var category = $('#category').val(); // Ajax通信 ★★ $.getJSON('code/CustomerList2.php', {"category":category}, callback); } // 一覧表示用callback関数 function callback(request){ console.log(request); var json = eval(request); var res = ''; for (var i = 0; i < json.length; i++){ res += '<tr>' + '<td>' + json[i].customerName + '</td>' + '<td align="center">' + json[i].category + '</td>' + '<td>' + json[i].jusyo1 + '</td>' + '<td align="center">' + json[i].latestDate + '</td>' + '<td align="center">' + json[i].reserveDate + '</td>' + '<td align="center"><a href="customerdetail.html?id=' + json[i].id + '">詳細</td>' + '</tr>'; } var obj = document.getElementById("datatable"); obj.innerHTML ='<tr><td>お客様名</td><td>分類</td><td>住所1</td><td>最終来店日</td><td>ご予約日</td><td>詳細</td></tr>' + res; } //--> 【PHP側】 if ($category == 'すべて'){ $sql = "SELECT * FROM tbl_customer" ; }else{ $sql = "SELECT * FROM tbl_customer WHERE category = '" .$category. "'"; } $res = mysql_query($sql, $conn); print "res==="."$res<br />"; $result = "["; while($row = mysql_fetch_array($res)){ $result = $result. "{\"id\":\"" .$row["customerId"]. "\",\"customerName\":\"" .$row["customerName"]. "\",\"category\":\"" .$row["category"]. "\",\"jusyo1\":\"" .$row["jusyo1"]. "\",\"latestDate\":\"" .$row["latestDate"]. "\",\"reserveDate\":\"" .$row["reserveDate"]. "\"},"; } print "1)result==="."$result<br />"; $len = strlen($result); if($len != 1){ $result = substr($result,0,($len - 1)); // 最後の「,」を切り取る } $result = $result. "]"; print "2)result==="."$result<br />"; // 出力 echo $result; mysql_free_result($res);

  • jQuery内、文字列データを外部に渡したい。

    試行錯誤して、悩んだ上で質問させていただきます。 一番の目的としては、 外部phpと通信した結果の文字列を変数に格納して、比較処理がしたいのです。 しかし、jQuery内部からreturnで値を返しても、うまくいかないため無理やりにでもと グローバルオブジェクトを使ってみることにしたのです。 しかし、うまくいきません。 おそらくjavascriptでの大域変数はページがロードされると返却される(?)事が原因だと 睨んでいるのですが・・・ どなたか、よい方法をご存知ではないでしょうか? 回答をお待ちしています。 /**********************以下 ソースコード***************/ //Responseオブジェクト作成 function Response(res){ this.res = res; return this; } //オブジェクト関数定義 Response.prototype.ref = function(ref){ this.res = ref; } //オブジェクト生成 var db = new Response(""); //do_db.phpと通信し,返ってきた文字列(data)をオブジェクト内に格納したい function refDB(string,i){ jQuery.get("do_db.php", { "CH":string }, function(data){ db.ref(String(data)); //alert(db.res); ここでは値が入っている(文字列のデータをalert表示できる) } ); //alert(db.res); ここでは値が初期化されてしまっている(alert表示) } /*************end******************/

  • CakePHPでの自作関数保存場所

    PHP 5.0.4 CakePHP Version1.1 CakePHPのモデル内でコールバック関数として登録したい関数を作成したのですが、その関数をどこに記述してよいか分かりません。今のところ下記のようにモデル内のクラス定義の外に定義しています。 <?php class Hoge extends AppModel { var $name = "Hoge"; function gethoge(){ ・・・・ return array_map("hoge_callback",$hoge_array); } } function hoge_callback(){ ・・・・ } ?> ただこれだと”hoge_callback()”を他のモデルでも使いたい時にそのモデル内でも記述しないといけません。どこか1箇所にまとめて置いてきそれを参照するようなスマートな方法はないでしょうか(できればモデル内だけでなくコントローラやビューでも使えるとうれしいです)?「CakePHPでは自作関数は”ここ”に登録する」といったようなルールがありましたらご教示頂ければ幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • php pear mdb2に質問です。

    php pear mdb2に質問です。 以下の関数でエラーが出ます。 間違っているところがあれば、回答お願いします。 function product_info($id) { global $db; $res = $db->query("SELECT * FROM product WHERE id=?", array($id)); if ($res != null) { $row = $res->fetchrow(MDB2_FETCHMODE_ASSOC); return $row; } return null; }

    • ベストアンサー
    • PHP
  • jQuery の one 関数について

    jQuery の one 関数は便利だと思い、是非作ってみようと思いましたが、全然出来ません>< 一応以下のように作ってありますが、正しく動作しない上に、name を指定して、 Listener.data オブジェクトにname で保存をするようになっていて、同じnameを渡したら上書きされてしまいます。 どうしたら、jQueryのような、one関数を作れるでしょうか?;; var Listener={ addEvent:function(element,type,callback,useCapture){ if(element.addEventListener){ return element.addEventListener(type,callback,useCapture); } else if(element.attachEvent){ return element.attachEvent('on'+type,callback); } else{ return element['on'+type]=callback; } }, removeEvent:function(element,type,callback,useCapture){ if(element.removeEventListener){ element.removeEventListener(type,callback,useCapture); } else if(element.detachEvent){ element.detachEvent('on'+type,callback); } else{ return false; } return true; }, addOne:function(name,element,type,callback,useCapture){ Listener.addEvent(element,type,callback,useCapture); Listener.addEvent(element,type,function(){ Listener.removeEvent(element,type,); },useCapture); this.data[name]=new Function("Listener.removeEvent("+element+",'"+type+"',Listener.data['"+name+"'],"+useCapture+");+callback); this.addEvent(element,type,this.data[name],useCapture); }, data:{ } }; addEventとremoveEventは正常動作しています。 現在は、 Listener.addOne('name'/*指定しなくてもいいようにしたい*/,'document'/*オブジェクトを渡すと、elementがobjectになり、未定義エラーに*/,function(){alert('OK');},true); となっていますが、目指すは以下のような書き方です。 //仮関数定義 function test(str){ alert(str); } var str='test'; Listener.addOne(document,function(str){test(str);},true); です。 一応、jQueryのone関数を見てみましたが、jQueryは使ったことが無く、あまり分かりませんでした;; 御回答宜しくお願いしますm(_ _)m

  • preg_replace_callback が渡す変数の扱い

    preg_replcace_callback を使用して、<a>タグ内のURLの字数を制御するコードに取り組んでいます。詳しい方アドバイスしてくださると助かります。 下のコードの、shorten(カスタム関数)に渡されるデータが配列なのですが、並列に並んだ配列のようなのです。echo をかけてみると、ArrayArray と表示されます。しかし、Array([0]=>Array [1]=>Array) ではないので、どうやって 処理をかけて return すればよいのか途方にくれています。 もしよい方法をご存知の方おられましたらどうぞよろしくお願いいたします。 <? $str = <<<HERE //長いURLのサンプルです。ここの掲示板の処理で途中で表示がカットされていますが、<a href="http://長いURL">http://長いURL</a>という構成になっています。 <a href="http://gooooooooooooooooooooooooooooooooooogle.co.jp">http://gooooooooooooooooooooooooooooooooooogle.co.jp[</a> <a href="http://yahooooooooooooooooooooooooooooooooooo.co.jp">http://yahooooooooooooooooooooooooooooooooooo.co.jp</a> HERE; $pattern = "#<a(.*?)>(.*?)<\/a>#s"; $str = preg_replace_callback($pattern, 'shorten', $str); echo $str; function shorten($matches) { foreach($matches as $index => $match) { if (strlen($match) > 20) { $matches[$index] = substr($match, 0, 20) . '....'; } } return $matches; } ?>

    • ベストアンサー
    • PHP
  • 「checkText3」が処理されない

    とあるHOWTO本を見ながら、独学でPHPを勉強中です。 サンプルプログラムを動作させようとマニュアル通りに記述してみたのですが、一部分だけが上手く処理されません。 付属CDに収められているphpファイル自体がこのような記述になっている為、マニュアル自体に間違いがあるのかな?と思うのですが、 どこがおかしいのか解らずにいます。 お分かりになる方がいれば、ご教授願えませんでしょうか? 上手く処理されないのは「//テキストチェック3.バイバイされたらバイバイを返す」の部分です。 よろしくお願い致します<(_ _)> <?php $res = ""; if(isset($_POST['text1']) == false) {$res = getAisatsu();} else{$text1 = $_POST['text1']; if($text1 == "") {$res = "え? なんていったの?";} else{$flag =false; //まずcheckTextであいさつ文をチェック $str = checkText($text1); if($str != false) {$flag = true; $res = $str; } //続いてcheckText2で悪口の対応 if($flag == false) {$str = checkText2($text1); if($str != false) {$flag = true; $res = $str; } } //最後にcheckText3でさよならの対応 if($flag == false) {$srt = checkText3($text1); if($str != false) {$flag = true; $res = $str; } } //すべてダメならテキストを分解してチェック if($flag == false) {$arr = bunkatsu($text1); foreach($arr as $str) {if(getWordCheck($str) == true) {$flag = true; $res = $str . "って、なぁに?"; break; } } } //それでもダメなら全文で聞き返す if($flag == false) {$res = delTouten($text1) . "って、なぁに?";} } } //時間によって異なるあいさつ文を返す function getAisatsu(){ $arr = array('……ね、眠い','おはよう!','こんにちは~','こんばんわ',); $d = getdate(); $t = $d['hours']; $t2 = (int)($t / 6); return $arr[$t2]; } //テキストチェック。あいさつ文があれば対応する挨拶を返す function checkText($s){ if($s == ""){return false;} $res = false; $data = array('こんにちは','こんにちわ','こんちは','こんちわ'); foreach($data as $str) {if (mb_strpos($s,$str) !== false) {$res = 'どうも、' . $str . '!'; break; } } return $res; } //テキストチェック2.悪口が書かれていたら文句をいう function checkText2($s) {if ($s ==""){return false;} $res = false; $data = array('バカ','馬鹿','あほ','アホ','阿呆'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res =$str . 'じゃないもん!'; break; } } return $res; } //テキストチェック3.バイバイされたらバイバイを返す function checkText3($s) {if ($s == ""){return false;} $res = false; $data = array('ばいばい','バイバイ','じゃあね'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res = 'それじゃ' . $str . '!'; break; } } return $res; } //句読点を削除する function delTouten($s) {$res = str_replace('。','',$s); $res = str_replace('?','',$res); $res = str_replace('!','',$res); $res = str_replace('.','',$s); $res = str_replace('?','',$res); $res = str_replace('!','',$res); return $res; } //テキストを句読点で分割し、配列として返す function bunkatsu($s) {mb_regex_encoding("sjis"); $res = mb_ereg_replace('[。、?!,.!?]','',$s); $arr = mb_split(' ',$res); return $arr; } //主語や接続詞が含まれているかを調べる function getWordCheck($s) {if ($s == ""){return false;} $res = $s; $data = array('私','わたし','僕','ぼく','俺','おれ','オレ'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res = false; break; } } return $res; } //サニタライズ function getSeftyText($s) {$res = str_replace("<","<",$s); $res = str_replace(">",">",$res); return $res; } ?>

    • ベストアンサー
    • PHP
  • jQuery.getでレスポンスデータを取り出す方法

    jQuery.getでレスポンスデータを取り出す方法 いつもお世話になっています。 jQueryのajaxを用いてサーバのphpとデータをやり取りしています。 以下の件に関して質問させていただきます。 jQuery.get( url, data, callback(data, textStatus, XMLHttpRequest), dataType) でレスポンスデータを取り出す方法がわかりません。 callbac関数に引数で渡されたdataをcallback関数の中でalert(data);としたり、htmlのタグに書き込む操作はうまくいくのですが、callbackの引数dataをjQuery.getの外に取り出すにはどのようにすればよいのでしょうか? よろしくご教授お願いします。

  • Ajaxがおかしいんです

    Javascript初級者です。 Ajaxを使ってデータの重複チェックを行おうとしました。 ところがAjaxがヘンな動きをするんです。 以下のコードなんですが、上の登録処理の中で、function doubleCheck を呼んで います。 問題は2つあって、ひとつは実際に重複していてもしていなくても「true」を 返してくることです。 console.log("res=========" + res) には「yes」とか「no」とか重複有り無しで 異なりますが、ちゃんとそれぞれセットするにも関わらず、 if(!doubleCheck() では必ず「false」が戻ってきてしまいます。 もう一つおかしい点は、重複検索(これはPHPでやってます)の最中にもかかわらず、 「true」が返ってきて "重複があったので登録できません。" お、出てしまうことです。 それで調査するために console.logその2を入れてみました(※※※のところ)。 ところがこの console 何も吐き出しません。 ということは doubleCheck() の最後の if文にたどり着いていない、または 途中でエラーになっているのかもしれません。 私の書いた Ajax のコードがおかしいんでしょうか。 どなたか御指導下さい。 よろしくお願いします。 // 追加登録処理 function doActionAdd(){ if(dataCheck()){ // customerId が 空白か否かのチェック if($('#customerId').val() == ""){ if(window.confirm("追加登録していいですか?")){ if(!doubleCheck()){ window.alert("重複はありませんでした"); }else{ window.alert("重複があったので登録できません。"); }  (以下略) function doubleCheck(){ var yomi = $('#customerYomi').val(); var res = ''; // 重複チェック $.ajax({ type: "POST", url: "../customer/CustomerDoubleCheck.php", data: {"customerYomi":yomi}, dataType: 'text', // ajax通信が成功したときの処理 success: function(request){ console.log("request=========" + request); var json = JSON.parse(request); console.log(json[0].result ); res = json[0].result; console.log("res=========" + res); }, error: function(XMLHttpRequest, textStatus, errorThrown){ $('div#jobStatus').text("重複チェック検索ができませんでした。"); return false; } }); console.log("resその2=========" + res); //※※※ if(res == "yes"){ // 重複していたので「false」を返す。 return false; }else{ // 重複していなかったので「true」を返す。 return true; } }

  • 現在地の取得について

    現在地の座標を取得するために下記のようにしています。 「var」をつけなければグローバル変数になるようなので関数外に宣言していますが 結果はundefinedになります。 PHPでいうところのセッションのように関数をまたいで変数を使いたいのですが どうすればいいのでしょうか? myLatlng = 'ダミー'; function loadXml( url ) { $.ajax({ url: url, type: 'GET', dataType: 'xml', timeout: 5000, }).done(function( xml ){ myLatLng = geoLocate(); alert(myLatLng);//undefined parseXml( xml ); }).fail(function( xml ){ alert( '読み込みに失敗しました' ); }); } function geoLocate() { var position_options = { enableHightAccuracy: true }; navigator.geolocation.watchPosition( success, fatal, position_options ); function success( position ) { return new google.maps.LatLng( position.coords.latitude, position.coords.longitude ); } function fatal( error ) { alert( '位置情報の取得に失敗しました' ); return null; } }

専門家に質問してみよう