• ベストアンサー

XMLHttpRequestを利用してPHPへ値を渡したい

お手数とは思いますが、御導きの程、宜しくお願いします。 ◆プログラムソース 削除対象になるとは思いますが文字数制限により、 別途アップローダーをお借りして、其処にアップロード致しました。 誠に申し訳なく思います。 サイト:小さなアップローダー 様 URL:http://smallup.dip.jp/uploader/ NAME:smallup0515.zip コメント:パソコン何でも質問箱回答者様向け ファイル名:パソコン何でも質問箱.zip downloadパス:okokok 内容: test.html(フォームに値を入力する) test.php(XMLHttpRequestから値を受け取り書き込む) test.js(XMLHttpRequestを利用しPHPへ値を渡す) task.csv(書き込まれた値を保存する) xmlhttp.js(http通信用共通関数) 以上です。ウィルスチェック済みです。 ◆どうしたいか タイトル通りXMLHttpRequestを利用しPHPへ値を送信させたいと思っております。 サイト等を参考に1週間程模索してみたのですが、力量不足でなかなか思い通りになりません。 PHPのプログラムでは値さえ取得できれば、処理を行うことができたので var_dump($_POST)でPOSTされているかを調べたところ空の状態でした。 そこで、値を送信するAjax(JavaScript)側が問題ではないかと思い調べたところ、 open()関数の後にsetRequestHeader()関数を利用しないと ブラウザにより値が送信されないことが分かりました。 しかし、どうもうまく動かず、相変わらずvar_dump($_POST)には空の状態です。 test.jsからtest.phpへ値を渡すにはどのように変更する必要があるのでしょうか? お手数とは思いますが、ご教授ください。

  • merus
  • お礼率100% (12/12)

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

  • ベストアンサー
回答No.4

私も再度試してみましたが 2点ほど。 IEでは気づきませんでしたが 期限:<input type = "text" name = "time">の部分にidが抜けてました すみません。 期限:<input type="text" id="time" name="time" /> に変更してください。 (IEは寛容なのでnameをidとして認識します) それともうひとつ httpObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");のところを良く確認してください。 もしこの回答をコピーしたままだとテキストエディターなどへ転記した場合に ?www-form-urlencoded");? となっている場合があるようです。 それと念のため、htmlやjsファイルは文字コードをSIFT-JISではなく UTF-8で保存してからサーバーに上げてください では。

merus
質問者

お礼

いつも迅速な回答に感謝するばかりです。 オブジェクト.setRequestHeader()の部分については昨日気づき その点は問題ありませんでした! >それと念のため、htmlやjsファイルは文字コードをSIFT-JISではなく >UTF-8で保存してからサーバーに上げてください この点に関しましては、以前文字化けに悩まされ、エディターで 保存する際に改めてUTF-8にすることを覚えました。 期限:<input type="text" id="time" name="time" /> に変更したところ、上手く送信できました!! 色々場違いな箇所を見ては試していましたが、技術不足を痛感する ばかりです。 本当に助かりました。 頂いたコードを参考にさせて頂き、勉強に励みたいと思います。 何度もお付き合いくださいまして、本当にありがとうございました。

その他の回答 (3)

回答No.3

連絡用にレスしておきます 結果を教えて下さい。 社会人一年目ですか、頑張ってください。 多分ですが あなたのソースでは2度リクエストを送信しているように見えます しかも同じ変数を、2度めのオブジェクトで上書きしてます。 その辺が原因かな・・ PHPの環境は手元にないのでASP.NETで確認しましたが 私の書いたソースでは少なくても送信はできるハズ?です。

merus
質問者

お礼

初めに、補足にレスを含めた内容を書き込みしたこと、お詫び申し 上げます。 PHPのプログラムは値を受け取り表示させるのみに書き換えしたもの test.php---------------- <?php //JavaScriptからPOSTされているか判断する var_dump($_POST); $time = $_POST['time']; //POSTされた中身を見る var_dump($time); print($time); ?> ---------------------- 共通関数とHTMLは頂いたソースをそのままインデントしただけの プログラムを用いています。 動作環境は PHPを動作させるWEB-SERVER:xampp xamppで利用している機能:Apache,mySQL OS:VISTA business ブラウザ:Sleipnir(IE),Firefox(Netscape) あまり関係は無いと思いますが、参考になればと思い追記しました。 どうしてよいのかわからず、周りにJavaScriptやAjax等の言語や技術 を会得している方がいませんので、聞くに聞けず困り果てております。 リクエストが2か所あることについては不思議に思っていませんでした。 理由はPHPへ送信する為のリクエストと保存ファイルを読みだす為の リクエストは別々で、同じ原理で用途が違うのであればリクエストは いくつでも出せるものだと思っていました。 (プログラムが可笑しいかもしれませんが) また、同じ変数名にしていたのはfunction名で切り分けされているので 1)PHPへ飛ばす、2)ファイルを表示 の1)の後に2)が呼ばれるので、初期化してくれるだろうと思い 初期化された後、次のリクエストを実行するだろうと思ったからです。 ご指摘通り、プログラムを書く上でまずいとは感じましたが…。 自分のプログラムを変数名を変えてみて試してみましたが相変わらず 空の状態でした。 頂いたソースを実行していたのですが、補足に記述したとおりの結果 になりました。

merus
質問者

補足

エール、有難う御座います! 昨日教えて頂いたソースを実行してみたところ、IEベースのブラウザ(スレイプニル) ではPHPまでは到達しているみたいですが、PHPのソースにvar_dump($_POST)してみますと array(0) { }の様に空を示されました。 また、focus()が問題なのかは定かではありませんが、Firefoxでは未入力チェックの時点で チェックがされず、PHPまで到達できていないのかinnerHTML部に何も表示されませんでした。 もちろんarray(0) { }の様な表示もされていませんでした。 2時間程度調べてみたのですが、なかなか打開策がなく、良いお返事を書くことができず 申し訳なく思います。 技術不足な私ではありますが、頭が一点集中気味で他の打開策を講じられる程 知識も無く、ご迷惑だとは思いますがもうしばらくお力添えを頂けないでしょうか

回答No.2

かなりお困りのようなので・・・ 以下のソースで送信を確認してください。 phpの方は省きますがtest用に単純に受け取ったデータを返すように書き換えてください 返答はDIVのinnerHTMLになりますので<HTML><BODY>とかは要らないですよ・・・ 外部js xmlhttp.js (*注 手を加えてます) ----------------------------------------------------------- // HTTP通信用、共通関数 function createXMLHttpRequest(Func,arg1){ var XMLhttpObject = null; try{ XMLhttpObject = new XMLHttpRequest(); }catch(e){ try{ XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ return null; } } } if (XMLhttpObject) { XMLhttpObject.onreadystatechange = function(){ if ((httpObj.readyState == 4) && (httpObj.status == 200)){ eval(Func+"("+arg1+")"); } } } return XMLhttpObject; } // document.getElementById function $(tagId,parantObj){ if(parantObj){ return parantObj.document.getElementById(tagId); }else{ return window.document.getElementById(tagId); } } -------------------------------------------------------------- test.html ------------------------------------------------------------- <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html;charset=UTF-8"> <TITLE>登録画面</TITLE> <script type="text/javascript" src="xmlhttp.js"></script> <script type="text/javascript"> <!-- function inputCheck(){ if($("time").value==""){ alert("期限が入力されていません。"); $("time").focus(); }else{ httpObj=createXMLHttpRequest("displayData"); if(httpObj){ textData=$("time").value; sendData=""; sendData+="time="+encodeURI(textData); httpObj.open("POST","test.php",true); httpObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); httpObj.send(sendData); $("result").innerHTML="<b>Loading...</b>"; }else{ alert("通信できません"); } } return false; } function displayData(){ $("result").innerHTML = httpObj.responseText; } //--> </script> </HEAD> <BODY> <form onSubmit="return inputCheck();"> 期限:<input type = "text" name = "time"> <input type = "submit" value = "登録"> </form> <hr> <div id="result"></div> </BODY> </HTML> ---------------------------------------------------------------

merus
質問者

お礼

ソース修正、ソースの指摘などアドバイス有難う御座います。 現在、自宅用のPCで閲覧させて頂いたのですが、自宅のPCでは alphaなどが動作しない程、貧弱なPCで確認を行えなかったので 月曜日に実際の確認をさせて頂きます。 ソースを拝見させて頂きましたが、 >DIVのinnerHTMLになりますので<HTML><BODY>とかは要らないですよ・・・ 申し訳なく思います。 確認していくなかで、自ソースにそのまま記述したままになってたようです。 彼是どのように考えて作ったのか、どのように確認していたのかを 理解してもらえるかな?と思い、そのままにしていました。 指摘に感謝するとともに、次の段階での質問にも役立てたく思います! 共通関数の方は、怪しいですが分かりかけてきました! test.js部分の入力チェックのところをfocusに変える方法は submitをクリックされると、エラー処理の場合でも処理が流れて しまうのを防ぐためなのかな?と解釈させてもらい、勉強になりました。 自分のプログラムではfunctionを多様して1つ1つの処理を自分に分かりやすく していたのですが、無駄も多いなと熟熟思いました。 大掛かりな処理をしていく上で、ある程度纏める努力もできるよう 頑張っていきたいと思います。 確認しでき次第、改めてお礼申し上げます。

回答No.1

具体的なソースが無いので概要だけ。 質問者さんの指摘通り、POSTで送信するにはsetRequestHeader()でPOSTヘッダが必要です。charsetがUTF-8の場合は下のような感じです。charsetは省略可能ですね。 xmlObj.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8"); 参考URL http://web.paulownia.jp/script/ajax/xmlhttp3.html http://itpro.nikkeibp.co.jp/article/COLUMN/20060607/240192/ 頑張って下さい。

merus
質問者

お礼

回答ありがとうございます。 なるほど・・・charsetは省略可能なのですね。 取りあえずサイトを調べまわって、charsetを指定してる場合と していない場合の両方があったので、安易に付けていたのですが 理解不足でお恥ずかしいです。 少しづつかんばっていきたいと思います!!

関連するQ&A

  • PHPがHTMLのformの値を受け取らない

    状況: ファイルアップロードを作成しようとしたところPHPがHTMLのformのsubmitした物を受け取らない。 しかしHTML側にjavascriptを読み込ませ XMLHttpRequest によってsendすると受け取れる。 環境: apache 2.2.4 php 5.2.3 ------------HTML <html><body> <form action="test.php" enctype="multipart/form-data"> <input type="text" id="name"> <input type="file" id="file"> </form> </body></html> ------------PHP <?php header('Content-type: text/plain; charset=UTF-8'); print "\$_POST:";var_dump($_POST);print "\n"; print "\$_FILES:";var_dump($_FILES);print "\n"; ?> ------------結果 $_POST:array(0) { } $_FILES:array(0) { } ------------ 原因がphp.iniなのか、httpd.confなのか、はたまたそれ以外に原因があるのかがさっぱり判らず質問しました。 どうやったらHTMLのformの値をPHPで受け取れますか?

  • PHPからjavascriptへGETで値を渡すとき

    初歩的な質問で失礼いたします。 PHPからjavascriptへGETで値を渡すときにマルチバイト文字が文字化けしてしまいます。 javascriptのjQueryというライブラリを利用しています。 具体的には、 -------------- test.js -------------- var url = 'test.php?code=' + code; $.get(url, function(data){ alert(data); } -------------------------------------- --------------- test.php ------------- $input = $_GET['code'];  ・・・mysqlの処理・・・ echo $output; --------------------------------------- という処理をしています。 test.js → test.phpへ渡す値はマルチバイトではないので問題ないのですが、 test.php → test.jsへ返す値はマルチバイトで文字化けしてしまいます。 php側でrawurlencode関数でエンコードしてから、javascript側でdecodeURI関数を使用してデコードしたのですが、うまくデコードできませんでした。 恐らくデコードの仕方が悪いんだと思うんですが。。。 分かりにくい説明で恐縮ではございますが、ご回答をお願いいたします。 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPでレイティングバーの値を取得

    下記のようなJQuery スクリプトにおいて、 レイティングバーの値を、PHP変数に取得するには どうすればいいのでしょうか。ご指導お願い致します。 ちなみに、 $manzokudo = $_POST['rating']; var_dump($manzokudo); で、ダンプしたところ、中身がNULLでした。 【detail.php】 <link rel="stylesheet" type="text/css" href="jquery.rating.css"> <script type="text/javascript" src="jquery-2.1.3.js"></script> <script type="text/javascript" src="http://code.jquery.com/jquery-migrate-1.1.0.js"></script> <script type="text/javascript" src="jquery.rating.js"></script> <script type="text/javascript"> $(function () { // レーティングバーを有効化 $('.starbar').rating({ cancel: '消去', // 「キャンセル」ボタンのテキスト // ★アイコンをクリックした時の処理 callback: function(value){ // detail.phpに対してレイティングバーの値を送信 $.post( 'detail.php', { rating: value }, function(){ window.alert('「' + value + '」をつけました。'); } ); } }); }); </script> </head> <body> <?php $_POST[] ?> </body> </html>

  • phpに値が送られない

    PHP側に値が送られなくて困ってます!! どなたか助けて頂けないでしょうか $(function() { $('a') .click(function() { var id = this.id; alert(id); $.ajax({ type: 'POST', dataType:'json', url:'editor_text.php', data:{ item:id }, success:function(data) { alert(data); }, error:function(XMLHttpRequest, textStatus, errorThrown) { alert(textStatus); } }); }); });

    • ベストアンサー
    • AJAX
  • PHPの質問:フォームから受け取った値がNULL

    あまりに基本的過ぎるのか、検索しても、参考書を読んでも分かりませんでした。 ■やりたいこと index.htmlのフォームで入力した値を、output.phpで変数$nameとして受け取りたい。 (この後$nameをstrstr関数の引数として使いたい) ■作ったソース 【index.html】 <form action="output.php" method="post"> <input type="text" name="name"> <input type="submit" value="入力"> </form> 【output.php】 <?php $name = $_POST['name']; var_dump($name); ?> ■困っていること output.phpをブラウザで開くと、以下の通りに表示されます。 string(4) "abcf" しかし、ブラウザで「ソースを表示」すると、[NULL]となってしまいます この変数$nameは、strstr関数の引数として使いたいのですが、 そこで値がNULLのため、上手くいきません。 ■お聞きしたいこと (1)フォームから受け取った値をvar_dump()を使い、ブラウザのソース表示をすると NULLになるのは、そういった仕様なのなのでしょうか? (2)フォームからの値を変数に格納する際、何か注意する点があるのでしょうか? 何か根本的なことから理解していないようでお恥ずかしいのですが、 教えて頂けると大変助かります。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPの処理結果をjavascriptで利用する方法

    既に似たような質問も出ていそうで恐縮ですが(一通り目を通したですが、目的とするものは見つけられませんでした)、 PHPとjavascriptのやりとりについて教えていただければ幸いです。 データをフォームなどから受け取る→サーバー側(php)で処理→ 処理した結果の変数をjavascript用の変数として扱うといったこと がしたいのですが、うまくできません。 実際には以下のような形で書いて失敗してしまいました。。。 /*xxx.php*/ <html> <head> <?php $result = $_POST["sentence"]; ?> <script language="javascript"> result = "<?=$result?>"; </script> <script src="xxx.js" type="text/javascript"language="javascript"></script> </head> <body> <form id="sample"> <input type="text" name="sentence"> <input type="submit" value="送信"> </form> </body> </html> /*xxx.js*/ /*xxx.js*/ window.onload = function(){ document.getElementById("sample").onsubmit = function() { var req = createHttpRequest(); req.onreadystatechange = function(){ if(req.readyState==4 && req.status == 200){ alert(result); //PHPの結果を待った後を想定した何らかの処理      //ここでresultを使いたいが、サーバー側への送信前      //の値が入っているだけでonsubmitが反映されていない。 } } req.open("POST","./xxx.php",false); //<-formでくくられた<input type="text">等の部分は反映されない。 req.send(""); } } function createHttpRequest(){ if(window.XMLHttpRequest){ return new XMLHttpRequest(); } else if(window.ActiveObject){ try{ return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) { return null; } } } } 私なりに調べたところ 1.PHPとjavascriptは別の所で動作しているので受け渡しは基本不可能 2.PHP側で動的に書き出すことで見せかけることはできる。 var test = <?=$test?>等 3.XmlHttpRequestでphpの処理を結果を待って、変数を利用しようと思ったが、 <form id="form"> <input type="text" name="sentence"> <input type="submit" value="送信"> </form> といった場合に$_POST["sentence"]に値を入れる方法が不明。 また、 multipart/form-dataによる送信など方法が複雑。 responseTextには<html>から</html>まで格納されてしまった。 処理項目ごとに表示用に別にPHPファイル作成だと困る。 4.<form action = "xxx.php" onsubmit=関数名>とすると、 onsubmitで指定した関数が先に呼び出されてから、 xxx.phpの実行が行われるので、サーバー処理を待たずに javascript側が実行されてしまう。 といったことだけは分かりました。 しかし、どのように変更すればうまくいく(もしくは見せかける) ようになるのかがさっぱり分からなかったため、 質問させていただきました。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHP5で 定義されているINFの実際の値を知りたいのですが

    PHP5で 定義されているINFの実際の値を知りたいのですが var_dump( constant("INF") ); var_dump( INF ); すべて以下のようになります。 float(INF) float(INF) どうすれば値を知ることはできますか? このような定義済み定数の一覧と実際の値が知りたいです。

    • ベストアンサー
    • PHP
  • phpから値をとってきて変数に格納するには?

    phpから値をとってきて変数に格納するにはどうすればいいのでしょう? ちなみにjavascriptはほとんどさわったことのない初心者です。 やりたいことを具体的に説明します。 p.php 「 <?php yy = "test string"; //?(1) ?> 」 js.html 「 <script language="javascript"> var xx; //?(2) </script> 」 最終的に、php内の変数「yy」の内容をjavascriptの変数「xx」にいれたいのです。 よろしくお願いします。

  • PHP_INT_MAXを超える値の出力について

    下記の「希望」の値を出力させていのですが、 PHP_INT_MAXを超える値が指数表記となってしまいます。 PHPのコンパイル時に、BMP、BCMATHなどを有効にすれば希望の出力を得る関数が使えるようになるのですが、都合によりリコンパイルができません。 何か他の方法で希望の出力を得ることはできないのでしょうか。 <?php print("値は".(string)353108774858342429); // 希望 =>値は353108774858342429 // 実際 => 値は3.5310877485834E+17 var_dump(PHP_INT_MAX); // int(2147483647)

    • ベストアンサー
    • PHP
  • header.locationで、画面遷移、GET

    送り側(file_upload.php) header("Location: bbs_test.php?photo=$upfilename"); 受け側(bbs_test.php) $photo = $_GET['photo']; var_dump($photo); を実行すると、var_dump()の値がNULLになってしまい、 $upfilenameが、GET渡しできません。 ちなみに、$photo = $_GET['photo']; var_dump($photo); の、この2文は、 function()disprecords{ } という関数の中にあるのですが、 なぜ、var_dump($photo); の値がNULLになってしまうのか、どうすれば、 $upfilnameの値を渡せるのか、ご指導いただきたいです。 よろしくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう