質問: "127.0.0.1:3306";のような記述ではそもそも繋がらず、require_once("init.php");の時点でエラーが発生し、現在の形になりました。 (このような記述は、カゴヤに外部接続を試みたときはうまくいったのですが......。) データベースが選択されていないという内容と思しきエラー・警告が発生するのですが、mysqlを確認してもデータベース名の誤字などは無さそうで、pass、nameという項目も正しく存在しており、主キーも設定されていました。 記述を目立って変更したのはcheck.phpのみなのですが、この記述が何等かのエラーを起こしているような気がします。 一応ポートの設定は3306も3307も試したのですが、どちらも同じ結果になってしまいました。 解決方法や原因について、ご教授いただけると大変助かります。 何卒よろしくお願いします。 ### 追記(10/24 19:50) ・init.phpのセミコロンの誤記について修正しました。 ・ポートについて3306ではなく3307が正しいようでしたので、修正しました。 ・init.phpに$db->query("USE `$DBNM`");を追加したところ、新たに警告が確認できました。 ・init.phpにvar_dump($DBNM);、var_dump($dsn);を行った結果を発生したメッセージを最上段に追記しました。 ・アドミン画面.phpの詳細を追記しました。 ### 補足情報(言語/FW/ツール等のバージョンなど) 両サーバーにおける環境の差異は以下のような形です。 ``` 【CPI】 ■データベースサーバー サーバ: 127.0.0.1 via TCP/IP サーバの種類: MySQL サーバのバージョン: 5.6.30 - Source distribution プロトコル バージョン: 10 ユーザ: mysqlログインユーザ名@localhost サーバの文字セット: UTF-8 Unicode (utf8) ■ウェブサーバー Apache データベースクライアントのバージョン: libmysql - 5.5.42 PHP 拡張: mysqli curl mbstring PHP のバージョン: 5.6.19 ■phpMyAdmin バージョン情報: 4.6.2 ``` ``` 【ロリポップ】 ■データベースサーバー サーバ: mysql110.phy.lolipop.lan (mysql110.phy.lolipop.lan via TCP/IP) Server type: MySQL サーバのバージョン: 5.6.23-log - MySQL Community Server (GPL) プロトコルバージョン: 10 ユーザ: mysqlログインユーザ名@IPアドレス サーバの文字セット: UTF-8 Unicode (utf8) ■ウェブサーバー Apache データベースクライアントのバージョン: libmysql - 5.1.73 PHP 拡張: mysqli ■phpMyAdmin バージョン情報: 4.0.10.15 ```
回答: `SQLSTATE[3D000]`というエラーメッセージは、クエリを実行する際にデータベースが選択されていないことを示しています(*)。 > > エラー: 1046 SQLSTATE: 3D000 (ER_NO_DB_ERROR) > > メッセージ: データベースが選択されていません > > > ご提示のコードから推測できるケースは、 * init.php または check.php 内で`$DBNM`という変数名を誤記している。 * どこか別の場所で変数`$DBNM`を unset したり、NULL や空文字に上書きしている。 などです。 そのようなことがないか、もう一度確認してみてください。 修正 === データベース名ではなく、ホスト名(と、ポート番号)の指定に誤りがありました。 check.php の変数`$SERV`を、以下のように修正してみてください。 ##### Before ``` $SERV="127.0.0.1;port:3307"; ``` ##### After ``` $SERV="127.0.0.1:3307"; ``` または ``` $SERV="127.0.0.1;port=3307"; ``` > > より完全な例は、このようになります。 > > mysql:host=localhost;port=3307;dbname=testdb > > > どういうわけか、DSN文字列にPDOまたはMySQLが解釈できないオプションが含まれている場合にも `SQLSTATE[3D000]`というエラーが返されるようです。 (紛らわしいですねw) 追記 === > > どういうわけか、DSN文字列にPDOまたはMySQLが解釈できないオプションが含まれている場合にも > > SQLSTATE[3D000]というエラーが返されるようです。 > > > について追って確認してみたところ、正しくは ``` DSN文字列にPDOまたはMySQLが解釈できない文字列が含まれている場合、【それ以降のオプションが無視される】。 ``` という動作になるようです。 `port:3307`のように、解釈不可能な文字列をDSNの先頭や末尾など、様々な位置に挿入してみると、 挿入した位置によってエラーの内容が変わることが確認できました。