質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CMS

CMS(Content Management System)は複数のユーザーでコンテンツを編集することが可能なWebサイトの管理/構築用のプラットフォームを指します。また、会社単位で運用管理するものはECMと呼びます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

4回答

4017閲覧

PHPのPDOの記述に起因すると思しきエラー(CPIサーバー)

arito91

総合スコア11

CMS

CMS(Content Management System)は複数のユーザーでコンテンツを編集することが可能なWebサイトの管理/構築用のプラットフォームを指します。また、会社単位で運用管理するものはECMと呼びます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2016/10/23 17:40

編集2016/10/24 10:51

###前提・実現したいこと
PHP・mysql初心者です。

以前、ロリポップサーバーで使用するために作成したCMSを流用してCPIサーバーで使用しようと考えたのですが、上手くいかず、後述のエラーが発生します。これらのエラーは、ロリポップサーバー利用時には確認できませんでした。

###発生している問題・エラーメッセージ

string(16) "使用する想定のデータベース名" string(67) "mysql:host=127.0.0.1;port:3307;dbname=使用する想定のデータベース名;charset=utf8" Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: 1044 Access denied for user 'mysqlログインユーザ名'@'localhost' to database '使用する想定のデータベース名' in /usr/home/ユーザ名/html/ディレクトリ名/init.php on line 8 Warning: PDO::query(): SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected in /usr/home/ユーザーID/html/ディレクトリ名/アドミン画面.php on line 19 Fatal error: Call to a member function rowCount() on a non-object in /usr/home/ユーザー名/html/ディレクトリ名/アドミン画面.php on line 20

###該当のソースコード
アドミン画面(一部).php

PHP

1<?php 2ini_set("display_errors", On); 3error_reporting(E_ALL); 4?> 5<?php 6 session_start(); 7 $u = htmlspecialchars($_POST['id'],ENT_QUOTES); 8 $p = htmlspecialchars($_POST['pass'],ENT_QUOTES); 9 require_once("init.php"); 10?> 11 12<html> 13 <head> 14 <title>管理マスター</title> 15 <link href="styles/css.css" rel="stylesheet" type="text/css" /> 16 </head> 17 <body> 18 <?php 19 $ps = $db->query("SELECT pass FROM member WHERE name='$u'"); 20 if($ps->rowCount()>0){ 21 $r=$ps->fetch(); 22 if($r['pass']===$p){ 23 $_SESSION['us']=$u; 24 ?> 25 <script> 26 27 </script> 28 <header> 29 <h1><a href="master.php"><img src="./images/logo.png"/></a></h1> 30 </header> 31 32 <div id="master_flex"> 33 <div id="master_menu"> 34 <!--メニュー--> 35 <?php require_once("左部メニューリンク.php"); ?> 36 </div> 37 38 <div id="master_contain" class="toppage"> 39<!--------------------下層ページリンクHTML部分--------------------> 40 </div> 41 </div> 42 <?php 43 }else{ 44 session_destroy(); 45 ?> 46 <p>パスワードが違います。</p> 47 <a href="index.php">ログイン画面に戻る</a>"; 48 49 <?php 50 } 51 }else{ 52 session_destroy(); 53 ?> 54 55 <p>IDとパスワードは正しく入力してください。</p> 56 <a href="index.php">ログイン画面に戻る</a> 57 <?php 58 } 59 ?> 60 </body> 61</html>

init.php

PHP

1<?php 2 require_once("./dbcheck/check.php"); 3 $dsn = "mysql:host=$SERV;dbname=$DBNM;charset=utf8"; 4 $db = new PDO($dsn, $USER, $PASS); 5 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 6 $db->query("USE `$DBNM`"); 7?>

check.php(CPI時)

PHP

1<?php 2 $SERV="127.0.0.1;port:3307"; 3 $USER="mysqlログインユーザ名"; 4 $PASS="mysqlパスワード"; 5 $DBNM="使用する想定のデータベース名"; 6?>

check.php(ロリポップ時)

PHP

1<?php 2 $SERV = "mysql110.phy.lolipop.lan"; 3 $USER = "ユーザー名"; 4 $PASS = "パスワード"; 5 $DBNM = "使用する想定のデータベース名"; 6?>

###試したことなど

ロリポップとはサーバーの指定方法が違うため、check.phpを変更したのですが、それでもうまく繋がらず……。
http://shared-blog.kddi-web.com/products/58を参考に修正したのですが、$SERV = "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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

SQLSTATE[3D000]というエラーメッセージは、クエリを実行する際にデータベースが選択されていないことを示しています(*)。
https://dev.mysql.com/doc/refman/5.6/ja/error-messages-server.html

エラー: 1046 SQLSTATE: 3D000 (ER_NO_DB_ERROR)

メッセージ: データベースが選択されていません

ご提示のコードから推測できるケースは、

  • init.php または check.php 内で$DBNMという変数名を誤記している。
  • どこか別の場所で変数$DBNMを unset したり、NULL や空文字に上書きしている。

などです。

そのようなことがないか、もう一度確認してみてください。

修正

データベース名ではなく、ホスト名(と、ポート番号)の指定に誤りがありました。

check.php の変数$SERVを、以下のように修正してみてください。

Before

php

1$SERV="127.0.0.1;port:3307";
After

php

1$SERV="127.0.0.1:3307";

または

php

1$SERV="127.0.0.1;port=3307";

http://php.net/manual/ja/ref.pdo-mysql.connection.php

より完全な例は、このようになります。

mysql:host=localhost;port=3307;dbname=testdb

どういうわけか、DSN文字列にPDOまたはMySQLが解釈できないオプションが含まれている場合にも
SQLSTATE[3D000]というエラーが返されるようです。
(紛らわしいですねw)

追記

どういうわけか、DSN文字列にPDOまたはMySQLが解釈できないオプションが含まれている場合にも

SQLSTATE[3D000]というエラーが返されるようです。

について追って確認してみたところ、正しくは

DSN文字列にPDOまたはMySQLが解釈できない文字列が含まれている場合、【それ以降のオプションが無視される】。

という動作になるようです。

port:3307のように、解釈不可能な文字列をDSNの先頭や末尾など、様々な位置に挿入してみると、
挿入した位置によってエラーの内容が変わることが確認できました。

投稿2016/10/24 06:22

編集2016/10/27 14:22
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arito91

2016/10/24 10:19

ご回答ありがとうございます。 $DBNMについて再確認してみたのですが、この他のphpファイルを読み込んでいたり、この部分以外で$DBNMを扱っている部分がなさそうでした……。
KiyoshiMotoki

2016/10/24 10:26 編集

では、  $db = new PDO($dsn, $USER, $PASS); の直前に以下の2行を追加し、何が表示されるか確認してみてください。  var_dump($DBNM);  var_dump($dsn);
arito91

2016/10/24 10:47

var_dumpを追記してみたところ、以下のような形で表示されました。 (ポートは3307番が正しかったようなので、書き換えました。) 見た感じ、それぞれに入っている変数はcheck.phpに入っているものと同様のものが入っているようです。 string(16) "使用する想定のデータベース名" string(67) "mysql:host=127.0.0.1;port:3307;dbname=使用する想定のデータベース名;charset=utf8"
KiyoshiMotoki

2016/10/24 11:04

情報の追記、ありがとうございます。 回答を追記しましたので、確認願います。 (当初の回答は見当違いでした)
arito91

2016/10/24 11:23

先ほど追記していただいた内容で編集を行ったところ、無事管理画面へのログインに成功しました! かなり詰まっていたところなので非常に助かりました。 皆様、貴重なお時間でご協力いただきありがとうございました。
guest

0

対処療法として、init.php の最後(setAttributeした次の行)に下記コードを追加してデータベースを明示的に指定してみてください。

php

1 $db->query("USE `$DBNM`");

もしこれでエラーが無くなれば、やはり MySQLサーバー 接続時にデータベースの選択が何らかの理由でできていないと思われます。

投稿2016/10/24 02:25

miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arito91

2016/10/24 10:14

setAttributeした次の行に追記したところ、既存の警告・エラーに加えて以下のような警告が新たに表示されました。 シンタックスエラーと表示されているので、何らかの誤記が存在している形でしょうか……? Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: 1044 Access denied for user 'mysqlログインユーザ名'@'localhost' to database '使用する想定のデータベース名' in /usr/home/ユーザ名/html/ディレクトリ名/init.php on line 6
guest

0

nameは予約後だからquartで囲ってないときのエラーに見えますが

nameを ` で囲ってください

投稿2016/10/23 23:33

編集2016/10/23 23:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arito91

2016/10/24 01:04 編集

ご回答ありがとうございます。 該当部分を $ps = $db->query("SELECT pass FROM member WHERE name='$u'"); ↓ $ps = $db->query("SELECT pass FROM member WHERE `name`='$u'"); に変更してみたのですが、該当のエラーは解消できないままでした……。 pass、memberもクォートで囲うのも試してみましたが、その場合もうまく動きませんでした。
KiyoshiMotoki

2016/10/24 06:41

name は予約語ではなく "nonreserved keyword" です(*)。 そのため、バッククォートで囲む必要はありません。 * 下のリンクの表で NAME に"(R)"が付いていないことから、それが分かります。 https://dev.mysql.com/doc/refman/5.7/en/keywords.html > Nonreserved keywords are permitted as identifiers without quoting.
guest

0

1番目のエラーメッセージの通りデータベースが選択されていないので、どのデータベースに対してクエリを実行してよいかわからずエラーとなっているようです。DB接続はできているのでホストやポートまわりの設定は問題ないと思います。

なぜロリポップでは動くのかわからないのですが、DSNの記述方法がまちがっているようです。

php

1// 修正前 2$dsn = "mysql:host=$SERV;dbname=$DBNM,charset=utf8"; 3 4// 修正後 5$dsn = "mysql:host=$SERV;dbname=$DBNM;charset=utf8";

投稿2016/10/23 18:44

編集2016/10/23 18:58
miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arito91

2016/10/24 01:16

ご回答ありがとうございます。 こちらについて、ロリポップのファイルのほうでは修正後の状態になっており、今回編集するにあたって誤って操作してしまったようです。大変失礼致しました。 修正してみたのですが、質問に書いたエラー表示が直らず、修正前・修正後ともに同様のエラーが発生することを確認しました。 (ロリポップサーバーでは、;が,になっているとinit.phpの4行目でエラーが出るようでした。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問