• 締切済み

MySQLから取り出した値をarrayに代入したい

下記のようなプログラムでMySQLデータベースから値を取り出してグラフを描きたいのですが、値をどのように取り出してarray()の中に代入すればよいのか分かりません。 プログラミング初心者のため要領を得ない質問で申し訳ありませんがお願いします。 <? // Here's an array containing some data to plot $test_data=array(0,0,1,2,3,3,3,1,1,0); // Here's where we call the chart, and return the encoded chart data echo "<img src=http://chart.apis.google.com/chart?chtt=".urlencode("吐き気")."&cht=lc&chs=450x125&chd=".chart_data($test_data).">"; // And here's the function function chart_data($values) { // Port of JavaScript from http://code.google.com/apis/chart/ // http://james.cridland.net/code // First, find the maximum value from the values given $maxValue = max($values); // A list of encoding characters to help later, as per Google's example $simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $chartData = "s:"; for ($i = 0; $i < count($values); $i++) { $currentValue = $values[$i]; if ($currentValue > -1) { $chartData.=substr($simpleEncoding,61*($currentValue/$maxValue),1); } else { $chartData.='_'; } } // Return the chart data - and let the Y axis to show the maximum value return $chartData."&chxt=y&chxl=0:|0|".$maxValue; } ?>

みんなの回答

  • koke29
  • ベストアンサー率58% (114/196)
回答No.9

連投スミマセン 送信ボタンにトリガーをつけると、空欄で押しても表示になるので if($_REQUEST[id] != NULL){ の方がいいかもです(idじゃなくても別にいいですけど)

  • koke29
  • ベストアンサー率58% (114/196)
回答No.8

あけましておめでとうございます! しばらく動いてなかったので諦めたのかと思いましたー 今回はHTML部分も掲載っすね あからさまに間違ってるとこから指摘していきます </body></html>の位置がおかしいです <form>の下にある↑の2タグは一番最後(?>の次)に移動して下さい <form ~>重複 2こ入ってるので、一個にして下さい ところで、これって1個のファイルでまとめて処理してるですよね? 値が入らないまま描画をしようとするのでエラーが出るんですよ トリガーを設定してあげれば入力値がない限りは描画の処理を実行しない ように出来ますよ(エラーが出ないようにするということですね) 例えば送信ボタンに name=on とか適当につけて if(isset($_REQUEST[on])){ echo "<img src~ (←グラフ描画の部分)"; } にすれば、送信ボタンが押されなければ入力欄以外は表示されません あと、ゼロで割った時のエラーはfunction内の条件を if($currentValue > -1) { ↓ if(($currentValue != NULL) && ($currentValue > -1)) { にしたら出なくなると思います(一応 検証済み) または、ファイルを2つに分けて(入力パートのみのHTMLファイルと 描画パートのPHPファイル)しまえば、難なく問題解消ですけどね あと、気になったのが PHPパートで途中</br>のために一回閉じてるけど、いらないですよね?? ?> </br> <? ↑の部分削除したらいいんじゃないですか? </br>は本来レイアウトのために使用するものではないので 下にスペース入れたいならCSS使うとかした方がいいです 余談も結構あるので、必ず直すところだけおさらいです ・ </body></html>の位置(一番下に移動) ・ <form>の重複を解消(1つ削除) HTML+PHPをまとめて処理したいなら 値なしの時に出るエラーを回避するために、条件設定を変更 ・ 送信ボタンをトリガーにグラフ描画するように ・ ゼロ値で割った時のエラー回避にif文に追記する HTMLとPHPを2ファイルに分けるなら ・ <? ?> の中身を別ファイルに移動(try.php) ・ 残りをHTMLファイルとして保存(ファイル名は任意) コレで希望の動作になると良いのですが… ベテランの方のアドバイスならもっと早く問題解決できていたのかも しれませんが、私がうっかりアドバイスしちゃったために長くかかって しまっているのかもと思うと、逆に申し訳ないんですよ… なので、諦めないでいる限りはお付き合いしますので気にしないで下さい ホントにもう少しだと思うので、諦めないで下さいねー

  • koke29
  • ベストアンサー率58% (114/196)
回答No.7

こんにちはー 猶予 頂いたみたいですね! まずは140行目のエラーについて私もわからなかったので調べてみましたら 0で割り算したらダメだよというエラーみたいです(参考URL参照下さい) グラフ描画の部分にあたる処理に絡むんだと思いますが、たぶん配列に データが入っていないことに起因すると思うので放置でOKです (配列$arrayにデータがキチンと入りさえすれば出なくなると思うのです) 前回指摘した部分↓ $array[] = $rows[$rows]; → $array[] = $rows[result]; $test_data=array($array); → $test_data = $array; ここの修正は済んでいるんですよね? ※ $array[] のところは前回より詳しい指摘に変更してます SQL文から result というカラム名を指定していることがわかるので 上記のようにしております(または $array[] = $rows[0]; も可のはず) // フィールドの数をカウントします。 $fcnt = mysql_num_fields($result); // カラム名の取り出しを行います。 // データの取り出しを行います。 // mysql_fetch_arrayは結果セットの行データを // 配列もしくはカラム名をキーにした連想配列で返します。 $array = array(); while($rows = mysql_fetch_array($result)){ for($i=0; $i < $fcnt; $i++); $array[] = $rows[$rows]; } ↑の部分を $array = array(); while($rows = mysql_fetch_array($result)){ print_r($rows); $array[] = $rows[result]; } print_r($array); これに置き換えて試した結果がどうなるか 教えて下さい 1.print_r($rows); でDBのデータがちゃんと表示されているか 2.print_r($array); で配列にしたDBのデータが表示されるか 1が正常で2がダメなら配列にデータを入れる方法がこれじゃダメな環境 なのかもしれないです(でもこれ以外でどうしたらいいのやら…) 1がダメなら2も当然出来ません 後半の処理はサンプルみたいなやつをそのまま使っているかなんかだと 思うので、出来ない原因はおそらく前半です(エラーが出なくても) print $sql; で必要な条件がちゃんと入ったSQL文が出来ているか print $fcnt; でデータ件数がきちんと表示されるか こんな感じで処理を一個一個分けて、どこの時点で求める結果が得られない のか、探してみましょー

参考URL:
http://lmaker.blog17.fc2.com/blog-entry-67.html
yuuooki
質問者

補足

明けましておめでとうございます。 もうひとつの仕事のめどがやっと少しついて、またこちらに力を向けられるようになりました。 今まで、HTMLの部分を載せていなかったので今回はその部分も載せます。 現在、下記のようなプログラムになっています。 <html> <head> <title>副作用メモ</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style type='text/css'> --> </style> </head> <body> <form action="try.php" method="post"> </body> </html> <form action="try.php" method="post"> <table border="1"> <tr> <td align='center' width='50' bgcolor='cornflowerblue'>ID</td> <td><input type="text" name="id" size="10" maxlength="10"></td> </tr> <tr> <td align="center" bgcolor='cornflowerblue'>期間</td> <td><input type="text" name="day_s" size="10" maxlength="20">~<input type="text" name="day_e" size="10" maxlength="20"></td> </tr> </table> <br> <div> <input type="reset" value="リセット" class="submit"> <input type="submit" value="送信" class="submit"> </div> </br> </form> </br> </br> <?php // データベースへの接続情報を設定します。 $db_user = "root"; $db_pass = "590312"; $db_host = "localhost"; $db_name = "zikokanrinote"; $id = $_REQUEST['id']; $day_s = $_REQUEST['day_s']; $day_e = $_REQUEST['day_e']; $study = $_REQUEST['study']; // MySQLとの接続を行います。 $db = mysql_connect($db_host, $db_user, $db_pass) or die("Cannot connect to database"); // データベースを選択します。 mysql_select_db($db_name) or die("Cannot select database"); if(!get_magic_quotes_gpc()){ $id = mysql_real_escape_string($id); $day_s = mysql_real_escape_string($day_s); $day_e = mysql_real_escape_string($day_e); $study = mysql_real_escape_string($study); } $sql = "select result FROM result where ((id='$id') and (date between '$day_s' and '$day_e') and (study_code='hakike'))"; // SQL文を実行します。 $result = mysql_query($sql) or die("Query failed"); $array = array(); while($rows = mysql_fetch_array($result)){ print_r($rows); $array[] = $rows[result]; } print_r($array); ?> </br> <? $test_data=$array; // Here's where we call the chart, and return the encoded chart data echo "<img src=http://chart.apis.google.com/chart?chtt=".urlencode("1")."&cht=lc&chs=450x125&chd=".chart_data($test_data).">"; // Here's an array containing some data to plot // And here's the function function chart_data($values) { // Port of JavaScript from http://code.google.com/apis/chart/ // http://james.cridland.net/code // First, find the maximum value from the values given $maxValue = max($values); // A list of encoding characters to help later, as per Google's example $simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $chartData = "s:"; for ($i = 0; $i < count($values); $i++) { $currentValue = $values[$i]; if ($currentValue > -1) { $chartData.=substr($simpleEncoding,61*($currentValue/$maxValue),1); } else { $chartData.='_'; } } // Return the chart data - and let the Y axis to show the maximum value return $chartData."&chxt=y&chxl=0:|0|".$maxValue; } ?> となっています。 1. print_r($rows);、 2.print_r($array);の値は代入できたみたいです!! でも、値を代入する前の段階で、また Warning: Division by zero in Cが出てしまう上に、グラフの画像部分がつぶれてしまっています。 しかし、値を入れるとメッセージは消えるので…配列$arrayにはデータが入っていると考えても平気ですか? そのように考えるとグラフ表示の方はHTMLの方に問題があるのでしょうか? 毎回、本当にありがとうございます。 自分でも、時間を見つけて少しづつ勉強しているのですが… koke29に頼りっきりで申し訳ありませんが…お願いします。

  • koke29
  • ベストアンサー率58% (114/196)
回答No.6

遅くなってしまってスミマセン 昨日・一昨日とPCが見れないところにいたので… まだ間に合いそうでしょうか とりあえず、確実にこれ間違い!っていうのが $array[] = $rows[$rows]; []の中は、DBのカラム名です id という項目の数値が欲しいなら $array[] = $rows[id]; という感じにして下さい この時点で$arrayに値が入っているか確認するために forの }(閉じ)の後で print_r($array); を試してみて下さい 次。 $test_data=array($array); $array はすでに配列になっていますので $test_data = $array; にして下さい で、これでもエラーが出るなら はじまり~ while($rows = mysql_fetch_array($result)){ for($i=0; $i < $fcnt; $i++); $array[] = $rows[カラム名]; } までが正常に動くかどうか確認するために 後半はコメントアウト(/* */ で囲う) これでエラーが出れば前半に間違いがある エラーが無ければ前半をコメントアウトして後半もチェック という感じで、どっちの処理にエラーがあるのか細かく確認して 潰していきましょー ※ 後半は私の環境でも問題なく動いているので エラーがあるとしたら前半部分かなと思います あとは、;の付け忘れとか。

yuuooki
質問者

補足

お忙しい中お返事ありがとうございます。 結局、先週のうちにはできませんでしたが…他の仕事との兼ね合いもありもう少し時間をいただけることになりました。 早速ですが、 実行してみたところarrayの中に値が入っていなようでした。もう一度、DB、SQL文を確認したのですが…やはりDBから値は持ってこれているようでした。 また、 Warning: Division by zero in C:\Program Files\xampp\htdocs\xampp\maskat\contents\graph\try.php on line 140 というエラーメッセージが表示されてしまいました。 しかし、これだけみるとline140は$chartData = "s:";の部分で最初か全くいじっていないところなので何故?と言う感じです。 エディターとして秀丸を使っているのですが調子が悪いらしくコメントアウトが出来ないので、前半と後半に分けて実行してみたのですが、前半でエラー文は出ませんでした。 自分なりにも頑張ってみるので、ご指導のほどよろしくお願いします。

  • koke29
  • ベストアンサー率58% (114/196)
回答No.5

エラーよく見てハっと気づいたのですが PHPのバージョンで array_push が使えないのかもですね array_push($array,$row[任意]); ↓ $array[] = $rows[任意]; として試してみて下さい 私も試しにDBから配列作成して、グラフ描画まで出来たので キチンと書けば大丈夫ですよ

yuuooki
質問者

お礼

初心者で知識のない僕に丁寧にありがとうございます。 僕自身でも一生懸命頑張っているつもりなんですが…混乱してしまい教えていただいた通りにできているか分かりませんが、見捨てずにお願いします。

yuuooki
質問者

補足

ありがとうございます。 本当は昨日のうちにお返事したかったのですが・・・風邪をひいてしまし一日中寝ていました。 さきほど、修正してみたのですが… Warning: Illegal offset type in C:\Program Files\xampp\htdocs\xampp\maskat\contents\graph\try.php on line 106 Warning: Wrong parameter count for max() in C:\Program Files\xampp\htdocs\xampp\maskat\contents\graph\try.php on line 129 と言う2つのエラー画面がでてしまいました。 現段階でのソースはkoke29に教えていただいた方向性で進めており(教えていただいたとおりきちんと実行できているかは分かりませんが…)、このようになっています。 <?php // データベースへの接続情報を設定します。 $db_user = "root"; $db_pass = "590312"; $db_host = "localhost"; $db_name = "zikokanrinote"; $id = $_REQUEST['id']; $day_s = $_REQUEST['day_s']; $day_e = $_REQUEST['day_e']; $study = $_REQUEST['study']; // MySQLとの接続を行います。 $db = mysql_connect($db_host, $db_user, $db_pass) or die("Cannot connect to database"); // データベースを選択します。 mysql_select_db($db_name) or die("Cannot select database"); if(!get_magic_quotes_gpc()){ $id = mysql_real_escape_string($id); $day_s = mysql_real_escape_string($day_s); $day_e = mysql_real_escape_string($day_e); $study = mysql_real_escape_string($study); } $sql = "select result FROM result where ((id='$id') and (date between '$day_s' and '$day_e') and (study_code='hakike'))"; // SQL文を実行します。 $result = mysql_query($sql) or die("Query failed"); // フィールドの数をカウントします。 $fcnt = mysql_num_fields($result); // カラム名の取り出しを行います。 // データの取り出しを行います。 // mysql_fetch_arrayは結果セットの行データを // 配列もしくはカラム名をキーにした連想配列で返します。 $array = array(); while($rows = mysql_fetch_array($result)){ for($i=0; $i < $fcnt; $i++); $array[] = $rows[$rows]; } ?> </br> <? $test_data=array($array); // Here's where we call the chart, and return the encoded chart data echo "<img src=http://chart.apis.google.com/chart?chtt=".urlencode("吐き気")."&cht=lc&chs=450x125&chd=".chart_data($rows).">"; // Here's an array containing some data to plot // And here's the function function chart_data($values) { // Port of JavaScript from http://code.google.com/apis/chart/ // http://james.cridland.net/code // First, find the maximum value from the values given $maxValue = max($values); // A list of encoding characters to help later, as per Google's example $simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $chartData = "s:"; for ($i = 0; $i < count($values); $i++) { $currentValue = $values[$i]; if ($currentValue > -1) { $chartData.=substr($simpleEncoding,61*($currentValue/$maxValue),1); } else { $chartData.='_'; } } // Return the chart data - and let the Y axis to show the maximum value return $chartData."&chxt=y&chxl=0:|0|".$maxValue; } ?> お忙しいと思いますが、このプログラムのどこを修正すればよいの教えていいただけませんでしょうか。お願いします。

  • koke29
  • ベストアンサー率58% (114/196)
回答No.4

functionのエラーなんですね 配列自体は出来たんでしょうか?? print_r($array); で、配列のデータは望みのものが出来ているなら あとの処理で出てるのかもしれないですね $arrayの変数名は任意なので、今回でいうと $test_data としているんですよね?? ($test_data=array(0,0,1,2,3,3,3,1,1,0);は//でコメントアウトも) もう一個の質問の方でも色々教えて貰って修正している部分もあるとは 思うので、現状どんなコードになっているのか一回見せた方が良いのかも しれないですねー もう一個の質問は私よりずっと詳しい方たちが回答して下さっているので こっち〆ちゃってあっちで統一してしまった方が良いかもですよ 下手に私が口出しして変なこと教えちゃったらゴチャゴチャしちゃって 時間の無駄になっちゃうと申し訳ないので… 今週中とのことでまだ時間はありますから、焦らず一個ずつ よくないところを潰していけばうまく行きますよ、きっと (アドバイスくれるってことはどうにかなるコードだと思うので) 頑張って下さい! こっち〆ちゃっても、もう一個の方で私がアドバイスできそうなことが ありましたらコッソリ書き込みしますね

  • koke29
  • ベストアンサー率58% (114/196)
回答No.3

あ、 $rows[0]の[0]の部分はカラム名にするのが良いかもです テストで作ったコードそのままで書いてしまいました

yuuooki
質問者

お礼

ありがとうございます。 結果は、 Call to undefined function: arrey() というエラーメッセージがでてしまいました・・・

  • koke29
  • ベストアンサー率58% (114/196)
回答No.2

DBからのデータ取得は出来てるんですね 失礼しました 私、あまり mysql_fetch_array を使わないのでいい処理かどうか わからないのですが、とりあえず配列は以下の処理で作れました $array = array(); while($rows = mysql_fetch_array($result)){ for($i=0; $i < $fcnt; $i++); array_push($array,$rows[0]); } array_pushは既存の配列の後ろに要素を追加していくというやつです 空の$arrayを始めに用意して、while内でどんどんarray_pushして $array内に全データぶちこんでやる…といった感じの処理になります これで目的の処理が無事出来れば良いのですが… うまくいかなかったらスミマセン

  • koke29
  • ベストアンサー率58% (114/196)
回答No.1

コードを見る限りSQL文がないので、データベースからのデータ抽出の やり方がわからないということでよろしいでしょうか? データベースからデータを取るためには 1.データベースに接続 2.データを取るためのクエリ(SQL文)を作る 3.クエリを実行 4.取り出したデータをアレコレする 5.最終的にデータベースとの接続を切る(無くても動くけども) という感じの処理が必要になります arrayに代入したいなら、4の段階でデータを好きなように代入したり。 参照URLの ■データベースサーバへの接続 辺りからが参考になるかと思います 見当違いのアドバイスだったらスミマセン。。。

参考URL:
http://www.yc.musashi-tech.ac.jp/~yamada/doc/mysql/win/0602.html
yuuooki
質問者

補足

回答して頂きありがとうございます。 僕の説明が不十分で申し訳ありません。 現段階で3までは確実にできているのですが、 <? // データベースへの接続情報を設定します。 $db_user = "root"; $db_pass = "590312"; $db_host = "localhost"; $db_name = "zikokanrinote"; $id = $_REQUEST['id']; $day_s = $_REQUEST['day_s']; $day_e = $_REQUEST['day_e']; $study = $_REQUEST['study']; // MySQLとの接続を行います。 $db = mysql_connect($db_host, $db_user, $db_pass) or die("Cannot connect to database"); // クライアントのキャラクタセットをUTF-8に変更します。 mysql_query("SET NAMES utf8"); // データベースを選択します。 mysql_select_db($db_name) or die("Cannot select database"); if(!get_magic_quotes_gpc()){ $id = mysql_real_escape_string($id); $day_s = mysql_real_escape_string($day_s); $day_e = mysql_real_escape_string($day_e); $study = mysql_real_escape_string($study); } $sql = "select result FROM result where ((id='$id') and (date between '$day_s' and '$day_e') and (study_code='hakike'))"; // SQL文を実行します。 $result = mysql_query($sql) or die("Query failed"); // フィールドの数をカウントします。 $fcnt = mysql_num_fields($result); // カラム名の取り出しを行います。 // データの取り出しを行います。 // mysql_fetch_arrayは結果セットの行データを // 配列もしくはカラム名をキーにした連想配列で返します。 while($rows = mysql_fetch_array($result)){ for($i=0; $i < $fcnt; $i++); } // Here's where we call the chart, and return the encoded chart data $test_data=array($rows); echo "<img src=http://chart.apis.google.com/chart?chtt=".urlencode("吐き気")."&cht=lc&chs=450x125&chd=".chart_data($test_data).">"; // Here's an array containing some data to plot // And here's the function function chart_data($values) { // Port of JavaScript from http://code.google.com/apis/chart/ // http://james.cridland.net/code // First, find the maximum value from the values given $maxValue = max($values); // A list of encoding characters to help later, as per Google's example $simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $chartData = "s:"; for ($i = 0; $i < count($values); $i++) { $currentValue = $values[$i]; if ($currentValue > -1) { $chartData.=substr($simpleEncoding,61*($currentValue/$maxValue),1); } else { $chartData.='_'; } } // Return the chart data - and let the Y axis to show the maximum value return $chartData."&chxt=y&chxl=0:|0|".$maxValue; } ?> そこで、DBから取り出した値をarray()の中に代入したいのですができなくて悩んでいます。array()の中に値を入れられればグラフ表示できると考えているのですが…初心者で要領を得ずに申し訳ありません。 ただ、どうしても今週中にグラフ表示をしなくてはならなくて、お手数ですがお力をお貸しください。お願いします。

関連するQ&A

専門家に質問してみよう