- ベストアンサー
インクルードによる不具合
PHP初心者です。 以下2つのファイルを使って簡単な接続テストを行ってから徐々に 目的のものを作り上げていこうとしたのですが、どうにもうまく動作しません。(2つは同一ディレクトリにある) ・「mysql.php」:DB接続とSQLの発行 ・「test.php」:ブラウザ出力(本体:mysql.php呼び出し元) 実行すると「*** DB/SQLテスト ***」のみブラウザに出力されるため、試しに「mysql.php」で行うDB接続とSQL発行をすべてtest.phpに直接書いてインクルードせず単体で実行したところ、目的の結果が表示されました。 なので問題はインクルード文にあるのだと思うのですが検討がつきません。 どなたかお力をお貸し下さい。 ちなみに以下のコードは参考にしたテキストの例題をもとに見やすくするため余分な処理やエラー処理などを省いたものです。 ■mysql.php <?php class MySQL{ var $m_con; var $m_rows = 0; function MySQL(){ $this->m_con = mysql_connect("ホスト名", "ユーザ名", "パスワード"); mysql_select_db("データベース名", $this->m_con); } function query($sql){ $this->m_rows = mysql_query($sql, $this->m_con); return $this->m_rows; } } ?> ■test.php <html> <head> <meta http-equive="Content-type" content="text/html; charset=utf-8"> <title>SQLtest</title> </head> <body> *** DB/SQLテスト ***<br> <?php include("mysql.php"); $mysql = new MySQL; $sql = "SELECT * FROM staff"; $mysql->query($sql); while($row = mysql_fetch_array($this->m_rows)){ echo $row["id"]; echo $row["name"]; echo "<br>"; } ?> </body> </html>
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
補足の通り書いているのだとすると・・ ・コメントアウトが不正 / -> // ・DBの接続情報が不正 mysql_connect($this->m_HostName, $m_UserName, $m_Password); -> mysql_connect($this->m_HostName, $this->m_UserName, $this->m_Password);
その他の回答 (3)
- php504
- ベストアンサー率42% (926/2160)
DB classを作るならDB操作を全てclass内に実装しないとやりにくくないですか。 PEAR/DBとかPDOとか既存のものを使うのはだめでしょうか。
お礼
ご協力ありがとうございました。
補足
的外れの返答だったならすいません。 元々のサンプルコードは以下のようなDB操作をまとめてやるものでしたが 問題箇所を探す上でコードを改変し、また質問する上でその方がゴチャゴチャせずに理解して頂けると思ってこちらに載せました。 最初はmysql.iniも同一ディレクトリに用意してテストしていたのですが、うまくいかなかったので直接コード内に書くようにし、さらに関連の薄いコードを削っていきました。 この間、エラーメッセージはなかったように思います。 PEAR/DBとかPDOはまだ知識としてないのでわかりません。 このサンプルのやり方で出来たなら次のステップでもテキストを参考に進められるのでできる限りこのやり方での解を知りたいと思っています。 ■mysql.php <?php /=============================================== / ■:MySQLクラス /=============================================== class MySQL{ /----------------------------------- / □:変数宣言 /----------------------------------- var $m_con; var $m_HostName = ""; var $m_UserName = ""; var $m_Password = ""; var $m_Database = ""; var $m_rows = 0; /----------------------------------- / □:コンストラクタ /----------------------------------- function MySQL(){ $filename = "mysql.ini"; if (!file_exists($filename)){ die("mysql.iniファイルが見つかりません"); }else{ $fp = fopen($filename,"r"); if (!$fp){ die("mysql.iniファイルが見つかりません"); }else{ $this->m_HostName = trim(fgets($fp)); $this->m_UserName = trim(fgets($fp)); $this->m_Password = trim(fgets($fp)); $this->m_Database = trim(fgets($fp)); } fclose($fp); } //MYSQLへ接続 $this->m_con = mysql_connect($this->m_HostName, $m_UserName, $m_Password); if (!$this->m_con){ die("MYSQLの接続に失敗しました"); } if(!mysql_select_db($this->m_Database, $this->m_con)){ die("データベースの選択に失敗しました"); } } /----------------------------------- / SQLクエリ処理 /----------------------------------- function query($sql){ $this->m_rows = mysql_query($sql, $this->m_con); if (!$this->m_rows){ die("MYSQLでエラーが発生しました<br><b>{$sql}</b></br>".mysql_errno().";".mysql_error()); } return $this->m_rows; } /----------------------------------- / SQLクエリ処理 /----------------------------------- function fetch(){ return mysql_fetch_array($this->m_rows); } /----------------------------------- / SQLで変更された行数を取得 /----------------------------------- function affected_rows(){ return mysql_affected_rows(); } /----------------------------------- / 列数取得 /----------------------------------- function cols(){ return mysql_num_fields($this->m_rows); } /----------------------------------- / 行数取得 /----------------------------------- function rows(){ return mysql_num_rows($this->m_rows); } /----------------------------------- / 結果の開放 /----------------------------------- function free(){ mysql_free_result($this->m_rows); } /----------------------------------- / MYSQLをクローズ /----------------------------------- function close(){ mysql_close($this->m_con); } /----------------------------------- / SQLエラー情報(No.+ msg) /----------------------------------- function errors(){ return mysql_errno().": ".mysql_error(); } /----------------------------------- / SQLエラーNo. /----------------------------------- function err_no(){ return mysql_errno(); } } ?> ■test.php <?php require_once("mysql.php"); ?> <html> <head> <meta http-equive="Content-type" content="text/html; charset=utf-8"> <title>SQLtest</title> </head> <body> *** DB/SQLテスト *** <?php $mysql = new MySQL; $sql = "SELECT * FROM staff"; $mysql->query($sql); while($row = $mysql->fetch()){ echo $row["id"]; echo $row["name"]; echo "<br>"; } ?> </body> </html>
- tany180sx
- ベストアンサー率63% (239/379)
> while($row = mysql_fetch_array($this->m_rows)){ $this が間違いでは? display_errors と error_reporting の設定を変更して エラーを表示すればエラーが出ませんか?
補足
$thisの部分は書き換えましたが結果は変わりませんでした。 アドバイス頂いたエラー表示に関してはよくわからないのですが、 (info.phpで設定を調べたところdisplay_errors=on , error_reporting=81 でした) もともと各処理ではdieを使ってエラー表示するようにしていましたが、 実行しても何も表示されませんでした。 実行すると「*** DB/SQLテスト ***」が表示されるだけで ソースを見ても以下のようにインクルード直前で途切れています。 <html> <head> <meta http-equive="Content-type" content="text/html; charset=utf-8"> <title>SQLtest</title> </head> <body> *** DB/SQLテスト ***<br>
- yambejp
- ベストアンサー率51% (3827/7415)
とりあえず while($row = mysql_fetch_array($this->m_rows)){ は while($row = mysql_fetch_array($mysql->m_rows)){ じゃないですかね?
お礼
ご協力ありがとうございました。
補足
早速ありがとうございます。 指摘の箇所を修正して実行してみましたがやはり結果は変わりませんでした。 mysql_fetch_arrayの部分はもともとmysql.php内で関数化されているのを 呼び出すコードだったのですが、なるべく問題箇所をDB接続くらいにまで 絞って示したかったので自分で中途半端に書き換えてしまったものでした。 すいません。
お礼
ご協力ありがとうございました。 これってありがとうポイントみたいなものはどうやったらつけられるんでしょう・・・?
補足
あぁ・・・やってしまいました。 我ながらなんて痛いヤツなんでしょう。最低です・・・ ご指摘のとおり、コメント文が不適切だったのが主な原因でした。 ただこのあと修正したものでテストすると「MYSQLの接続に失敗しました」がでました。 iniファイルの情報を直打ちする形で絞っていき、値が正常に読み取れていないと 推測できたのでいろいろ試したところ、「mysql.ini」の文字コードを「utf-8」から「sjis」に変更することで無事接続できました。 なぜ「utf-8」ではいけなかったのかは不勉強なのでわかりませんが、とりあえずはこれで進めることができるようになりました。 なぜエラーメッセージがでないのか、なぜincludeで処理が途切れてしまうのかという点で自分の知識の及ばない範囲の不具合かもしれないと、勝手に舞い上がってしまいました・・・ 確かにコメント文はコピペでアップロード前にいい加減に付け足した覚えがあります。 エディタ機能の色分けで気づきそうなものですが、完全な思い込みで盲目になってました。 この問題にご協力頂き、真剣に考え時間を費やして下さった皆様本当に申し訳ありませんでした。 皆様の丁寧なご指摘で問題点以外でもいろいろ参考になりました。 ありがとうございました。