• 締切済み

Ajax.requestでphpファイルを習得するとwhileが実行されない。

プログラミング初心者です。初歩的な見落とし等あるかもしれませんがどうぞよろしくお願いします。 現在、AJAX、phpおよびMySQLを使ってWebアプリケーション(もどき)を製作しています。 元のファイル(便宜上a.htmlとします)にてprototype.jsのAjax.Requestを使ってphpファイル(db.phpとします)に向けて送ったパラメータによって処理を分けつつ、db.phpにてMySQLから取得して表示させたデータをさらにresponseTextで取得してa.html上に表示させるというという挙動を期待してコードを書いていました。 しかし取得したresponseTextの内容から推測するに、db.php単体で表示させると機能するwhileが、Ajax.requestでphpファイルにアクセスした場合には機能していないのです。 もう少し詳しく説明しますと、データを格納しているテーブルに対して、select* from [テーブル名] のクエリを投げたあと、 while($row= mysql_fetch_row($result)){ echo row["カラム名"]; } を行ってテーブルの内容を出力していたのですが、 phpファイルのurlをブラウザに直に打ち込んで表示させた場合は全レコードの内容が表示されるのに対し、Ajax.Request→responseTextでphpファイルの内容を取得した場合には、1行目にレコードの内容しか表示されないのです。 while文の後に出力した文字も表示されているのでwhile文の途中でコードの実行が止まったわけではないと思うのですが、いかんせん知識不足の私には対処法が思いつきません…。 誰か対処法について気が付く点等ありましたらご教授願います。

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

みんなの回答

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.2

> whileの実行を待ってくれないのはAjaxの欠陥といえるかもしれませんね。 欠陥というよりも、これがXMLHttpRequestの仕様なのでしょう。 MDB2を使用していますが、下記URLにDBの内容をJSON形式にしてレスポンスとして返すPHPのサンプルが掲載されています。 1度、参考にされてはいかがでしょう? http://ajax-world.sakura.ne.jp/extjs/grid/05/

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.1

while($row= mysql_fetch_row($result)){ echo row["カラム名"]; } の1回目のループで echo row["カラム名"]; がレコードの内容を出力した時点でAjaxのレスポンスと見なされてしまっているのでしょう。 ブラウザから直接PHPにアクセスした場合はきちんと表示されるのに、Ajaxにすると1行目のレコードしか表示されないのはそのためだと思います。 対処策としては、 while($row= mysql_fetch_row($result)){ $response .= row["カラム名"]; } echo $response; のようにして全てのレコードの内容をいったん別の変数に格納しておき、最後に出力するという方法が挙げられますが…。 これだとレスポンスを受け取った側(JavaScript)での処理が面倒になることが多いので、DBのレコードのように複数データを扱う場合はPHP内でXML形式かJSON形式にしてレスポンスを返した方がいいです。

zabiora
質問者

お礼

どうも提示していただいた対処策ではうまく動作しないようです…。 色々コードを替えながらテストをしてみたところ、while中で$rowにアクセスするとwhileが一回で終わってしまうようです。 他の対処法を考えてみます。

zabiora
質問者

補足

回答ありがとうございます。 >1回目のループで echo row["カラム名"]; がレコードの内容を出力した時点でAjaxのレスポンスと見なされてしまっているのでしょう。 なるほど、そういうことですか。whileの実行を待ってくれないのはAjaxの欠陥といえるかもしれませんね。 提示された対処策の方、試してみます。

関連するQ&A

  • SQL+PHP,セレクト文、シンプルwhile文法

    SQL+PHPでサイト制作をしております データベースからセレクト文でデータを引っ張りたいのですが、当方、プログラム初心者のため稚拙な記述方法しか浮かばず困っております。どなたかお力をお貸し願えたらと存じます。 【内容】 テーブルにa1~a80までのフィールドがあり、それぞれにレコードがあります。 【例】 $sql = "SELECT * FROM テーブル名 WHERE フィールド名 LIKE '$xxx'"; $dyn = mysql_query($sql); while($row = mysql_fetch_array($dyn)){ ////この部分の記述方法 } mysql_close($cn); 単純に $a0 = $row['a0']; $a1 = $row['a1']; $a2 = $row['a2']; $a3 = $row['a3']; $a4 = $row['a4']; $a5 = $row['a5']; $a6 = $row['a6']; $a7 = $row['a7']; ・ ・ ・ として、セレクト文からwhileにて必要に合わせPHPを書いているのですが繰り返し受け取るプログラムがシンプルな記述ができません。 できましたら、フィールド数が多いので長くなりがちな記述を短くしたいと考ええています。 forやfordach、またはarrayを使ってはみたのですが、$row['axx']の部分がネックとなりうまく記述することが出来ません。 困っております。お力添え、宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • Ajax、PHP、MySQLでDBからデータをWEB上に表示するサイト

    Ajax、PHP、MySQLでDBからデータをWEB上に表示するサイトでDBのデータが変わるとWEBサイトの表示も変わるようにするにはどうすればいいのでしょうか。

    • ベストアンサー
    • AJAX
  • AJAX→PHP -DB(MySQL)- PHP→AJAXのフローについて

    Yahoo! User Interface の DataTable Control を使った編集可能なリスト作成を考えています。 しかし、Ajaxでの入力値のPHPへの投げ方、また、DBから受け取った値をAjax(DataTable Control)で表示させる方法とも、やり方が全くわかりません…。 (Jasonという形式に成型して出力させる??) YUIを使用して外部テキストファイルを表示してみたりアニメーションを動かしてみたり、Ajax初心者なりに1ヶ月ぐらい試みてみましたが、DataTable Controlについては今のところ全く成果なしで困り果てています…。 どなたか勘所のある方、ご教示頂けませんでしょうか? 宜しくお願いします。 http://developer.yahoo.com/yui/examples/datatable/dt_cellediting.html

  • ajaxを使用した場合にPHP出力文字の文字化け

    サーバー側をPHPにしてajaxシステムを作ろうと思っています。 サーバからのデータ取得時にResponseTextを使用しており、ブラウザの表示での文字化けで困っています。 WinXP SP2 IE6.0では、UTF-8なら表示できますがEUC-JPは文字化けします。 しかし、Win2K IE5.0とWinX PSP1 IE6.0では、UTF-8は文字化けし、EUC-JPなら表示されます。 こっちを立てればあちらが立たずという状況で困っています。 また、直接XMLファイルやテキストファイルを作成し、これを読み込むと どのパソコンでも表示することができました。 phpから出力した文字がうまい具合に読めないのです。 ちなみにRespondeXMLを使用する場合、 XMLファイルを直接読み込むと内容を取得できるのですが、 PHPから出力したXMLデータを取得すると何も表示されません。 いい解決方法はないでしょうか。よろしくお願いいたします。 サーバシステム fedoraCore3 Apache 2.0 PHP 4.3.11 php.iniの文字コード設定はEUC-JP用にしています。

  • PHPでMySQLテーブルロック一覧取得

    PHPでMySQLテーブルロックされている一覧を取得したいですがどのようにすれば良いかご教授願います。 Web検索で調べるとロック状態はmysql_list_processesや、show processlistでも試してみましたが、思うような結果は得られませんでした。正常には動作していますが、欲しいデータが取り出せないですす。。。 単純に、現在ロックしているテーブル名(レコードロックは不要です。)を一覧で出力させることはできないのでしょうか? PHPから実施できるやり方をご教授頂けると幸いです。 -------Test Program()--------- <?php $link = mysql_connect('localhost', 'login_id', 'login_pass'); mysql_select_db('db_name'); mysql_query('LOCK TABLES table1 WRITE'); mysql_query('INSERT INTO table1 SET field1 = "test", field2 = "1"'); //$result = mysql_list_processes($link); 以下のSQL文とも入れ替えて試しました。 $result = mysql_query('show processlist'); while ($row = mysql_fetch_assoc($result)){ printf("%s %s %s %s %s %s %s %s\n", $row["Id"], $row["User"], $row["Host"], $row["db"], $row["Command"], $row["Time"] , $row["State"], $row["Info"]); } mysql_free_result($result); mysql_query('UNLOCK TABLES'); ?>

    • ベストアンサー
    • MySQL
  • PHP/phpMyAdmin/データベースなどでソートを実行する方法

    PHP/データベースを用いてのプログラミングで壁にぶち当たりましたので、ご質問させてください。 インターネットで色々調べたのですが、データベースを用いたソートの仕方が全く分からずにおります。 希望としましては、下記のようにボタンを押すとソートできるようにしたいと思っています。 http://lcl.web5.jp/prog/siori/ff.php 今現在、次のようなPHPでデータベースへのアクセスと一覧の表示は可能となっています。 なにか、参考になるページや方法など教えていただけないでしょうか。 ======== #!/usr/local/bin/php-cgi <?php //HTML文を出力 HTMLの開始 print("<HTML>\n"); //HTML文を出力 HEADの開始 print("<HEAD>\n"); //文字コードをSHIFT_JISと指定 print("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=\"Shift_JIS\">\n"); //HTML文を出力 TITLEの指定 print("<TITLE>myphp1</TITLE>\n"); //HTML文を出力 HEADの終了 print("</HEAD>\n"); //XAMPPの場合はパスワードなし //DBへ接続開始 サーバー名--localhost ユーザー名--root パスワード--"karipass $dbHandle = mysql_connect("localhost","root","karipass") or die("can not connect db\n"); //MySQLのクライアントの文字コードをsjisに設定 mysql_query("SET NAMES sjis") or die("can not SET NAMES sjis"); //db名を指定する $db = "test"; //SQL文 tab1表から全行を取り出し、number列の昇順に整列する $sql = "select * from tab1 order by id"; //SQL文を実行する $rs = mysql_db_query($db,$sql); //列数を取得する $num = mysql_num_fields($rs); //HTML文を出力 テーブルの開始を指定 print("<table border=1>"); //test表の列数と同じ回数を繰り返す for ($i=0;$i<$num;$i++){ //HTML文を出力 列名を <td>で囲んで出力 print("<td>".mysql_field_name($rs,$i)."</td>"); } //test表の行数と同じ回数を繰り返す while($row=mysql_fetch_array($rs)){ //HTML文を出力 表の行の開始<tr> を出力 print("<tr>"); //test表の列数と同じ回数を繰り返す for($j=0;$j<$num;$j++){ //HTML文を出力 列の内容を <td>で囲んで出力 print("<td>".$row[$j]."</td>"); } //HTML文を出力 表の改行</tr> を出力 print("</tr>"); } //HTML文を出力 テーブルの終了を指定 print("</table>"); //結果レコードをメモリから開放 mysql_free_result($rs); //DBへの接続を切断 mysql_close($dbHandle); ?>

    • 締切済み
    • PHP
  • ajaxとphpでapiのデータ取得

    上手にお伝えできるか不安ですが、以下の事象の原因で考えられるものがありましたら、アドバイスいただきたいです。 [処理内容] js(ajax)でphpをたたいて、GAのapiに接続、ページビューを取得して その取得内容もとにphpで静的ファイルを生成(jsonやhtml)して、任意の箇所で表示させています。 アクセスランキングのようなものになります。 ---------------------------------------------------- jsでphp呼び出し→phpでGAにアクセス→GA→phpで受け取る→jsonやhtml生成 ---------------------------------------------------- [気になる事象] GAからのデータの取得やjsonの生成は概ねうまくいっているのですが、時にデータが取得できない時があります。 何故かphpファイルを更新する(ソースに改行を加えただけ)と正しいデータが取得できたりします。 そんなことが動作に影響するのかわからないのですが、また1日後とかにデータを取得して表示させようとすると、 phpファイルを更新しない限り前回取得した状態から更新されなくなります。 キャッシュみたいなものが介在するのかわからないのですが、ajaxの部分の記述でcashはfalseとしています。 ちなみにGAの管理画面ではページビューが取れているので、apiとphpの間が怪しいといえば怪しそうな気もしています。 尚、静的ファイル(jsonやhtml)のタイプスタンプの更新は、js(ajax)にアクセスする度に正しく行われている為、 それらのファイルの生成そのものは問題ないと思われます。 拙い説明で恐縮ですが、 どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • 他のPHPで計算して出した値をPHP内で実行したい

    http://hoge.jp/data.php?id=7203をクーロンで叩くと、 その時間の株価情報を拾ってきて、WEB上に「7203,トヨタ,3080」 と表示される仕組みを作りました。(株価番号,社名,株価) この結果をmySQLのテーブルに継続的にインサートすることを考えました。 私が考えた方法は下記の通りなのですが、<?php ?> の中に<?php ?>が 含まれる形になるためか下記の方法ではインサートできません。 どのようにすればインサート出来るかご教授頂けませんでしょうか? 尚、「7203」「トヨタ」「3080」を別々に取得することはできず 「7203,トヨタ,3080」のようにまとまった形でしか取得できません。 宜しくお願い致します。 <?php $con = mysql_connect("localhost","root","password"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("db", $con); mysql_query(" INSERT INTO table (id,company,stock_price) values (<?php echo file_get_contents('http://hoge.jp/data.php?id=7203'); ?>) "); $close_flag = mysql_close($con); ?>

    • ベストアンサー
    • MySQL
  • mysql_fetch_arrayでレコードが入っていないものも取得したい。

    こんにちは。mysql_fetch_array()でテーブルに入っていないレコードも取得したいのですが、どのようにすればよろしいでしょうか。 テーブルはこんな感じです。 仕事 NUM  1   1  2   1  4   1  5   1 その上で、PHPはこのようになっています。 //データの選択 $sql = "SELECT job, COUNT(*) as num FROM org GROUP BY job"; $res = db_query($sql, $conn); //データの出力 while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $array = array( "job"=>$row["job"], "num"=>$row["num"] ); array_push($array, array( "job"=>$row["job"], "num"=>$row["num"] )); $tmp[] = $array; } return $tmp; このPHPのあと、Smartyに値を渡し、.tplで「A職(○件)」というようなことをやっています。 このときにフィールド「仕事」のレコード「3」は1つもデータが登録されていない状態です。そのためか、現状ではNULL値として扱われるようで、配列$rowに値を渡せず、.tplのほうではデータが表示されません。そこで、レコード「3」にデータを登録せずに、NULL値ではなく、例えば0などの値を渡したいと思います。 どのようなコードを書けば値を渡せるのでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • PHPでMySQLのストアドプロシージャを実行するには?

    こんにちは、この件でいろいろ検索していたのですが ストアドの作成まではできているのですが、PHPからの 実行のさせ方がわからず質問させていただきました。 環境は、PHP 5.2.9 + MySQL5.1.32 で MySQLでストアドプロシージャを作成して、実行できるのですが これをphpから実行させたいのですが、どのように記述すればよいのかわからず悩んでおります。 実行したいストアドは Gen_rank という名前でコンソールから実行できることは確認しています。 下記のようにしてみましたが、ストアドは走りませんでした。 <?php require_once("db_connect.php"); // クエリを送信する $sql = "call Gen_rank();"; $sql = "SELECT id, name, phonetic, age, s4, s9, rank FROM tmp_records ORDER BY rank"; $result = executeQuery($sql); // 結果セットの行数を取得する $rows = mysql_num_rows($result); // 表示するデータを作成 if($rows){  while($row = mysql_fetch_array($result)) {   $tempHtml .= "<tr>";   $tempHtml .= "<td>".$row["id"]."</td><td>".$row["name"]."</td><td>".$row["phonetic"]."</td><td>".$row["age"]."</td><td>".$row["s4"]."</td><td>".$row["s9"]."</td><td>".$row["rank"]."</td>";   $tempHtml .= "</tr>\n"; }  $msg = $rows."件のデータがあります。"; }else{  $msg = "データがありません。"; } // 結果保持用メモリを開放する mysql_free_result($result); ?>

    • 締切済み
    • PHP

専門家に質問してみよう