最初に的確な答えいただいた方には3000ポイント進呈させていただきます。

http://st43a.sakura.ne.jp/tcs/
上記URLに質問ございます。phpにてMySQLのデータを表示するプログラムの不具合の質問です。
よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2010/03/17 14:12:09
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.7

回答回数595ベストアンサー獲得回数351

ポイント3000pt
$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESCLIMIT 3") or die ("ERROR!!");

上記の代わりに以下を使用してみてください。

$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESC LIMIT 3") or die("SQLの送信に失敗しました。" . mysql_error() . "<br />\r\n");

あるいは以下のようにしても同じです。

エラーになった場合、SQLのどの辺りに問題があったのかを表示します。

$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESC LIMIT 3");
if($result == false){
	echo "SQLの送信に失敗しました。" . mysql_error() . "<br />\r\n";
	exit;
}

エラー出力の他には、データの確認をした方が良いと思います。

$uriageStr = $uriageStr."namae".$count."=".$data[0]."&kingaku".$count."=".$data[0]."&";

上記は、どこにどのデータが入っているか分からなかったのが原因かと思うのですが、そのような時は「var_dump($data);」などとして、中のデータを表示確認してみてください。。

また、せっかくmysql_fetch_arrayを使っているのですから、添字配列で取得するのではなく、連想配列で取得してもいいと思います。

以下のようにカラム名で取得できるので、こちらの方が簡単だと思います。

$uriageStr = $uriageStr."namae".$count."=".$data['namae']."&kingaku".$count."=".$data['kingaku']."&";

構文チェックについてですが、エディタでSQL文のエラーチェックまで可能な物はないかもしれませんね。

SQLに関しては、MySQL Query Browserを使用して事前にチェックしてもいいと思います。

今回少し触っただけですが、軽いしけっこう便利でいいと思います。

画像のように色分け表示されるので、間違ったSQLを書くとすぐに分かります。

f:id:rouge_2008:20100317065128p:image

※上が間違いありで、下が正しいSQLを入力した場合の表示です。

・[MySQLウォッチ]第9回 GUIでSQL文を作成できる新ツールMySQL Query Browser

http://itpro.nikkeibp.co.jp/members/ITPro/oss/20040729/147902/

※記事の時点ではバージョン1.0.4-alphaですが、現在のバージョンは1.2.17で、割と安定しているようです。

http://dev.mysql.com/downloads/gui-tools/5.0.html

※遷移先のページでそのまま「No thanks, just take me to the downloads!」をクリックすると、ユーザー登録をしなくてもダウンロードできます。

(FTPを選択→「Downloads」→「MySQLGUITools」)

※インストール不要なZIP版もあります。

※「MySQL Workbench」でもいいと思いますが、私はまだ使い方が良く分かりません。

(SQL DevelopmentがMySQL Query Browserに代わる機能です。)


他には、関数の色分け表示が可能なエディタを使用すると、ケアレスミスを防げると思います。

現在Eclipseでどちらのプラグインを使用しているのか分かりませんが一応・・・

PDTは関数は色分け表示しませんが、PHPeclipseでしたら、関数も色分け表示します。

http://www.phpeclipse.com/

Eclipseに拘らないのでしたら、PHPエディタという国産のフリーソフトも関数の色分け表示が可能です。

シンプルで使いやすいので、併用してもいいかもしれません。

http://phpspot.net/php/phpeditor.html

※Eclipseと同じで、「Ctrl+スペース」キーによる入力支援機能があります。

id:ku63t4td

丁寧な解説、ありがとうございました。大変参考になりました。

2010/03/17 13:57:59

その他の回答6件)

id:code_tk No.1

回答回数77ベストアンサー獲得回数11

ポイント500pt

とりあえず気になったのは

$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESCLIMIT 3");

DESCとLIMITの間にスペースが必要な気がするんですがDESC LIMIT 3ですよね?

id:ku63t4td

参考になりました。ありがとうございました。

2010/03/16 19:55:00
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント20pt

SQLの構文エラーじゃないでしょうか?

DESCLIMIT を DESC LIMITにしてみたらいかがでしょうか?

DESCとLIMITの間に半角スペースを入れます。

id:ku63t4td

ありがとうございました。

2010/03/16 19:55:11
id:GreenStar No.3

回答回数192ベストアンサー獲得回数46

ポイント300pt

mysql_fetch_array(): supplied argument is not a vailed MySQL result resource

mysql_fetch_arrayに渡された引数が正しくないって言ってる!!

$data = mysql_fetch_array($result);

mysql_fetch_array に何を渡しているかを見ると! $result!!

$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESCLIMIT 3");

$result に値を代入している地点を捜索! ミス発見! DESCLIMIT じゃなくて DESC LIMIT !!


以上のような流れでミスを探します!! 後出しだから3000は無理かな?


今後は、正しい値が返ってきてるかを確認するようにしたほうがいいよ! 以下、一例!!

if($result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESC LIMIT 3")) {
$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESC LIMIT 3") or die ("ERROR!!");
id:ku63t4td

ありがとうございました。

2010/03/16 19:56:12
id:snufkinski No.4

回答回数41ベストアンサー獲得回数11

ポイント300pt

SQL文

$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESCLIMIT 3");
<||

の"DESC""LIMIT3"の間にブランクは入っていますか?
id:ku63t4td

ありがとうございました。

2010/03/16 19:56:24
id:HALSPECIAL No.5

回答回数407ベストアンサー獲得回数86

ポイント20pt

SQL文に間違いがあります。


$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESCLIMIT 3");


DESC LIMIT 3


の間違いではないでしょうか?

id:ku63t4td

ありがとうございました。

2010/03/16 19:56:36
id:gtyuji_77 No.6

回答回数8ベストアンサー獲得回数0

mysql_fetch_array(): supplied argument is not a vailed MySQL result resource

mysql_fetch_arrayに渡された引数が正しくないって言ってる!!

$data = mysql_fetch_array($result);

mysql_fetch_array に何を渡しているかを見ると! $result!!

$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESCLIMIT 3");

$result に値を代入している地点を捜索! ミス発見! DESCLIMIT じゃなくて DESC LIMIT !!



以上のような流れでミスを探します!! 後出しだから3000は無理かな?



今後は、正しい値が返ってきてるかを確認するようにしたほうがいいよ! 以下、一例!!

if($result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESC LIMIT 3")) {

$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESC LIMIT 3") or die ("ERROR!!");

id:ku63t4td

ありがとうございました。

2010/03/16 19:57:48
id:rouge_2008 No.7

回答回数595ベストアンサー獲得回数351ここでベストアンサー

ポイント3000pt
$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESCLIMIT 3") or die ("ERROR!!");

上記の代わりに以下を使用してみてください。

$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESC LIMIT 3") or die("SQLの送信に失敗しました。" . mysql_error() . "<br />\r\n");

あるいは以下のようにしても同じです。

エラーになった場合、SQLのどの辺りに問題があったのかを表示します。

$result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESC LIMIT 3");
if($result == false){
	echo "SQLの送信に失敗しました。" . mysql_error() . "<br />\r\n";
	exit;
}

エラー出力の他には、データの確認をした方が良いと思います。

$uriageStr = $uriageStr."namae".$count."=".$data[0]."&kingaku".$count."=".$data[0]."&";

上記は、どこにどのデータが入っているか分からなかったのが原因かと思うのですが、そのような時は「var_dump($data);」などとして、中のデータを表示確認してみてください。。

また、せっかくmysql_fetch_arrayを使っているのですから、添字配列で取得するのではなく、連想配列で取得してもいいと思います。

以下のようにカラム名で取得できるので、こちらの方が簡単だと思います。

$uriageStr = $uriageStr."namae".$count."=".$data['namae']."&kingaku".$count."=".$data['kingaku']."&";

構文チェックについてですが、エディタでSQL文のエラーチェックまで可能な物はないかもしれませんね。

SQLに関しては、MySQL Query Browserを使用して事前にチェックしてもいいと思います。

今回少し触っただけですが、軽いしけっこう便利でいいと思います。

画像のように色分け表示されるので、間違ったSQLを書くとすぐに分かります。

f:id:rouge_2008:20100317065128p:image

※上が間違いありで、下が正しいSQLを入力した場合の表示です。

・[MySQLウォッチ]第9回 GUIでSQL文を作成できる新ツールMySQL Query Browser

http://itpro.nikkeibp.co.jp/members/ITPro/oss/20040729/147902/

※記事の時点ではバージョン1.0.4-alphaですが、現在のバージョンは1.2.17で、割と安定しているようです。

http://dev.mysql.com/downloads/gui-tools/5.0.html

※遷移先のページでそのまま「No thanks, just take me to the downloads!」をクリックすると、ユーザー登録をしなくてもダウンロードできます。

(FTPを選択→「Downloads」→「MySQLGUITools」)

※インストール不要なZIP版もあります。

※「MySQL Workbench」でもいいと思いますが、私はまだ使い方が良く分かりません。

(SQL DevelopmentがMySQL Query Browserに代わる機能です。)


他には、関数の色分け表示が可能なエディタを使用すると、ケアレスミスを防げると思います。

現在Eclipseでどちらのプラグインを使用しているのか分かりませんが一応・・・

PDTは関数は色分け表示しませんが、PHPeclipseでしたら、関数も色分け表示します。

http://www.phpeclipse.com/

Eclipseに拘らないのでしたら、PHPエディタという国産のフリーソフトも関数の色分け表示が可能です。

シンプルで使いやすいので、併用してもいいかもしれません。

http://phpspot.net/php/phpeditor.html

※Eclipseと同じで、「Ctrl+スペース」キーによる入力支援機能があります。

id:ku63t4td

丁寧な解説、ありがとうございました。大変参考になりました。

2010/03/17 13:57:59
  • id:GreenStar
    質問文の控え
    >>
    /* どなたか以下のエラーの原因をご教授ください。よろしくお願いいたします。
    環境はWinXP sp2,Apache2.0.39, php4.2.2,MySQL4です*/

    (PHPタグ省略(タグがあるとhtml表示されないため)
    mysql_connect("localhost","user","password");

    mysql_selectdb("rensyu");

    $result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESCLIMIT 3");

    $uriageStr = "";
    $count = 1;

    $data = mysql_fetch_array($result);

    while($data != false) {
    $uriageStr = $uriageStr."namae".$count."=".$data[0]."&kingaku".$count."=".$data[0]."&";
    }

    $uriage = substr($uriageStr,0,strlen($uriageStr)-1);
    print($uriage);


    /*
    MySQLにはrensyuデータベースを作成、それにuriageテーブルを作成、フィールドとしてnamaeとkingakuを作成、
    namaeにakiko,bunta,coco,daisuke,eikoを入力、それぞれにkingakuとして1,2,3,4,5を入力している。

    この場合http://localhost/get_uriage.phpと入力した場合次のような結果が表示されるはずです。
    namae1=eiko&kingaku1=5&namae2=daisuke&kingaku2=4&namae3=coco&kingaku3=3

    しかし、表示結果は
    warning: mysql_fetch_array(): supplied argument is not a vailed MySQL result resource in
    C:\www\get_uriage.php on line 13
    でした。
    TeraPadの行表示でで13行目は $data = mysql_fetch_array($result); です。(コメントは除く)

    尚 $data = mysql_fetch_array($result);

    while($data != false) {
    を以下のようにした場合は書き換えた部分に同じエラーが表示されました。
    while(!$data = mysql_fetch_array($result)){

    */
    <<
  • id:rouge_2008
    肝心のデータベースを選択していないのがエラーの原因です。

    if(!mysql_select_db("rensyu")) {
    echo 'rensyuデータベースの選択に失敗しました: ' . mysql_error() . "<br />\r\n";
    }

    上記が解消しても別のエラーが出ますので、次のようにしてください。
    // 以下の処理をコメントアウトして無効に、または削除します。
    //$data = mysql_fetch_array($result);

    /*
    while($data != false) {
    $uriageStr = $uriageStr."namae".$count."=".$data[0]."&kingaku".$count."=".$data[0]."&";
    }
    */

    // 代わりに以下を追加します。
    while($data = mysql_fetch_array($result)) {
    // 両方が$data[0]では、同じ「namae」しか取得・表示されません。
    $uriageStr = $uriageStr."namae".$count."=".$data[0]."&kingaku".$count."=".$data[1]."&";
    // 上記の代わりに以下のように項目名で取得する事も可能です。
    //$uriageStr = $uriageStr."namae".$count."=".$data['namae']."&kingaku".$count."=".$data['kingaku']."&";
    // 以下の記述がないと、すべて「namae1」「kingaku1」になります。
    $count++;
    }
    // 以下は変更なしです。
  • id:rouge_2008
    きちんとデータベースの選択もしてありましたね。
    すみません。見落としていました。(^^;
    上記コメントに書いた結果の取得・表示の方を修正してみてください。
    そこを直せば動作するはずです。
    ※既に回答されていますので書きませんでしたが、「DESC LIMIT」への修正も必要です。

    ※ポイントについてですが、もっと少なくても大丈夫です。
    今回の質問は基礎的な事で特に難しくありませんし、私だったら通常のポイントで構いませんが・・・
  • id:ku63t4td
    rouge_2008様
    ありがとうございました。解決いたしました。
  • id:ku63t4td
    rouge_2008さま
    phpのエラー表示はブラウザでもされますが、ブラウザで何の表示もされないエラーも多いです。
    Eclipseでもコードのミスは表示されますが、カンマ等が無いなどの初歩的なエラーしか表示されません。
    デバッガー等の使用もけっこう大変で上記GreenStar様が記されたような方法がベストだとは思いますが
    他に良いものがありましたら教えてください。

    質問を締め切ります、はてなのルールもありますので、よろしければ質問欄に上記のコメントをいただきますようお願いいたします.
  • id:GreenStar
    気づいておられるとは思いますが! 回答6は私の回答のコピペです!!

    他の質問でも同様の行為を繰り返しているので、はてなのほうへは通報しました!!
    質問者ご本人からの通報のほうがより効果を発揮する模様なので、ポイントはゼロ。不適切な回答者欄にチェックとともに、ほかの人のためにも下記より回答の削除依頼等していただければと願います!!
    1ポイントでも支払ってしまうと行為を認めたとなってしまいます! よろしくお願いします!!
    http://www.hatena.ne.jp/faq/q?c=13
  • id:rouge_2008
    効果的なエラーチェックは難しいですね。
    とりあえず回答させていただきました。
    よろしくお願いします。
  • id:snufkinski
    ku63t4td様

    エラー表示やデバッグの効果的方法についてですが、


    1.実行時エラーについては、ご指摘のとおり、何も表示されないことも多々ありますね。
    その理由として不具合の要因が、Linuxのパーミッションに関係するものであったり、ファイルへのパスが間違っていたりなどと、PHP以外の環境に起因するものであったりするからかもしれません。
    この様な場合には、Apacheのログ(error.log、またはaccess.logも合わせて)を確認するのが結果早いと思います。


    2.PHP内でのプログラム・ミスなどの不具合に関しては、初期は変数をスナップショットするなどで解決することが多いと思います。
    変数を確認表示する部品として "dBug.php"(http://dbug.ospinto.com/) などを埋め込んでおいて、"define("RUNMODE", "DEBUG");" などを共通ファイルに定義して、判断して表示切替させると便利です。

    実用例などは、"http://techblog.ecstudio.jp/tech-tips/debug-advance.html" さんが参考になります。


    3.上記、1.2.で解決しないようなものはやはり "xdebug" や "Eclipse" などに頼ることになるかと。


    私の手順ですが、ご参考になれば。
  • id:ku63t4td
    参考にさせていただきます。ありがとうございました。
  • id:rouge_2008
    ku63t4tdさん
    たくさんのポイントといるかをありがとうございました。
    あまりにも多すぎますので、一部ですがポイント送信でお返ししましたのでご確認ください。
    本当にどうもありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません