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

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

ただいまの
回答率

90.33%

  • PHP

    21413questions

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

  • MySQL

    6207questions

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

  • XAMPP

    530questions

    XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

PHPの接続先DBを変更したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 137

ysk1118

score 5

 前提・実現したいこと

XAMPP(Apache,PHP,MySql)をインストールしたPCが2台あります。(仮にサーバAとサーバBとします。)
サーバAでPHPの動作テストを行い、サーバBにコピーして本運用という運用を考えています。
ただし、DBはテスト環境(サーバA)でも本運用のDB(サーバB)を使用して動作テストを行いたいのですが、
この場合、下記のようなソースコードでは、$db['host']のIPアドレスにサーバBを指定すればよいと思いましたが、
実際にやってみるとデータベースエラーになってしまいます。
PDOによる接続先DBの指定=db['host']と考えていますが、これは間違った認識なのでしょうか?

なお、サーバAはXAMPPインストール先がC:\xampp、サーバBはD:\xamppとなっています。
これも原因の一つに考えられますか?

<?php
    //セッション開始
    session_start([
        'cookie_lifetime' => 1800,
    ]);

    $db['host']="(本運用環境のIPアドレス)"; //接続先を本運用DBにする
    $db['user']="tc_guest";
    $db['pass']="(パスワード)";
    $db['dbname']="(DB名)";

    //エラーメッセージ初期化
    $err_msg="";

    //ログインボタンが押された場合
    if(isset($_POST["login"])){
        // 1.ユーザIDの入力チェック
        if(empty($_POST["userid"])) {    //emptyは値が空の判定
            $err_msg='ユーザIDが未入力です。';
        }else if(empty($_POST["password"])) {
            $err_msg='パスワードが未入力です。';
        }

        if(!empty($_POST["userid"]) && !empty($_POST["password"])) {
            //入力されたユーザIDを格納
            $userid=$_POST["userid"];

            // 2.ユーザIDとパスワードが入力されていたら認証する
            $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8',$db['host'],$db['dbname']);

            // 3.エエラー処理
            try {
                $pdo=new PDO($dsn,$db['user'],$db['pass'],array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
                …以下略
       }catch (PDOException $e){
                $err_msg='データベースエラー:';
               echo $e->getMessage();
            }

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

次のエラーメッセージが出ています。何故かここだけ文字化けしています。エラーコードから推測すると、おそらくNo such file or directoryだと思いますが…。

SQLSTATE[HY000] [2002] �Ώۂ̃R���s���[�^�[�ɂ���ċ��ۂ��ꂽ���߁A�ڑ��ł��܂���ł����B


ご指摘に沿い、apacheのエラーログを確認しました。エラーを発生させた日時に該当するエラーログを抽出しましたが、
直接エラーと関与するような記述は見受けられませんでした。

[Fri Nov 30 12:13:37.889772 2018] [ssl:warn] [pid 3408:tid 616] AH01909: www.example.com:443:0 server certificate does NOT include an ID which matches the server name
[Fri Nov 30 12:13:38.046179 2018] [core:warn] [pid 3408:tid 616] AH00098: pid file D:/xampp/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Fri Nov 30 12:13:38.249217 2018] [ssl:warn] [pid 3408:tid 616] AH01909: www.example.com:443:0 server certificate does NOT include an ID which matches the server name
[Fri Nov 30 12:13:38.296097 2018] [mpm_winnt:notice] [pid 3408:tid 616] AH00455: Apache/2.4.25 (Win32) OpenSSL/1.0.2j PHP/7.1.6 configured -- resuming normal operations
[Fri Nov 30 12:13:38.296097 2018] [mpm_winnt:notice] [pid 3408:tid 616] AH00456: Apache Lounge VC14 Server built: Dec 17 2016 10:42:52
[Fri Nov 30 12:13:38.296097 2018] [core:notice] [pid 3408:tid 616] AH00094: Command line: 'd:\\xampp\\apache\\bin\\httpd.exe -d D:/xampp/apache'
[Fri Nov 30 12:13:38.296097 2018] [mpm_winnt:notice] [pid 3408:tid 616] AH00418: Parent: Created child process 4036
[Fri Nov 30 12:13:39.483729 2018] [ssl:warn] [pid 4036:tid 624] AH01909: www.example.com:443:0 server certificate does NOT include an ID which matches the server name
[Fri Nov 30 12:13:39.749383 2018] [ssl:warn] [pid 4036:tid 624] AH01909: www.example.com:443:0 server certificate does NOT include an ID which matches the server name
[Fri Nov 30 12:13:39.796265 2018] [mpm_winnt:notice] [pid 4036:tid 624] AH00354: Child: Starting 150 worker threads.

 試したこと

本環境のMySQLに対して、外部ホスト接続許可は行いました。具体的には、コマンドプロンプトで下記コマンドを実行し、
テスト環境サーバからmysqlコマンドでアクセスできることは確認済みです。

grant all privileges on DB名.* to tc_guest@"テスト環境サーバのIP" identified by 'パスワード' with grant option;

 追加情報

ふと、テスト環境であるサーバAのMySQLのサービスをスタートさせたところ、ソースの処理が正常に動作しました。
ただし、DBはサーバBではなくサーバAを見に行っているようです。ソースはユーザ認証の処理なのですが、
サーバAにしか存在していないユーザ情報でログインされましたし、その後表示されるデータもサーバAにしかないデータが
出力されています。ということは、ソースの先頭で指定したホストの指定は全く意味がないということなのでしょうか…?

 追記

新たにテスト確認したソースを開示します。

<?php

$db['host']="172.20.0.34";//サーバBのIPアドレス
$db['user']="tc_guest";
$db['pass']="パスワード";
$db['dbname']="DB名";

$dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8',$db['host'],$db['dbname']);

// 3.エエラー処理
try {
    $pdo=new PDO($dsn,$db['user'],$db['pass'],array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));                

    $stmt=$pdo->prepare('select * from t_userdata');
    $stmt->execute();

    foreach($stmt as $row){
        echo $row["userid"] . " ";
    }


}catch(PDOExecption $e){
    echo $e->getMessage();
}

?>


また、下記はサーバA,Bそれぞれのt_userdataテーブルの中身です。
イメージ説明
↑サーバA
イメージ説明
↑サーバB
次の条件で上記コードのphpファイルにアクセスした際の結果です。
条件1:サーバAのMysqlサービス開始 → 18895 5823 22192 15739 99999 22299 1
条件2:サーバAのMysqlサービス停止 → Fatal error: in C:\xampp\htdocs\dakoku\test.php on line 12
条件3:サーバAのMysqlサービス開始・サーバBのサービス停止 → 18895 5823 22192 15739 99999 22299 1
以上のことから、ソース上で指定したIPアドレスは意味を成していないように思われます。

 追加情報2

別のphpファイルソースを編集していた際、誤ってパスワードの記載までを変えてしまったことに気付かず処理を行いました。
当然、エラーが出力されたのですが、このエラー内容の一部に

PDO->__construct('mysql:host=172....', 'tc_guest', 'test', Array)

とありました。
hostの指定がIPアドレスの第1オクテットしか表示されていないため、
もしやと思って、$db['host']への設定値をIPアドレスからホスト名に変更してみたところ、
無事DBの参照先を切り替えることに成功しました。
自己解決という形になってしまいましたが、ホスト名指定にIPアドレス指定がNGというのはどうも納得がいかないような…。

ともあれ、コメントをいただいた方々、お付き合いいただきありがとうございました。
一先ず本件については自己解決という形でクローズさせていただきますが、この件について知見をお持ちの方は引き続きご助言いただけると幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kunai

    2018/11/30 13:25

    ありがとうございます。コード上で、そのIPアドレスを記載した状態で書いてみてもらえますか?ちゃんとソースコードからコピペする形で。

    キャンセル

  • kunai

    2018/11/30 14:39

    アクセスしているのは間違いなくサーバAなのでしょうか。アクセスログ確認してみてもらえます?

    キャンセル

  • ysk1118

    2018/11/30 15:17 編集

    サーバAのアクセスログに「172.20.16.85 - - [30/Nov/2018:15:14:04 +0900] "GET /dakoku/test.php HTTP/1.1" 200 47 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"」と出力されていましたので、サーバAへのアクセスで間違いないと思います。※16.85のIPはweb閲覧したクライアントPCです。

    キャンセル

回答 3

+2

$dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8',$db['host'],$db['dbname']);

DSN の文字列を生成する際には、経験上むやみにスペースを入れない方が良いです。
上記の場合、自分の PHP 環境では、mysql: と host の間のスペースを解釈することによって? host 指定が無視されるように見えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/05 10:15

    ご指摘ありがとうございました。スペースを取り除いてみましたが、状況変わらずでした。

    キャンセル

  • 2018/12/07 09:44

    自己完結後ですが、ご指摘されたようにスペースがある状態ではhost指定が無視されていることが分かりました。
    (host指定をリモートホスト名とし、スペースありで実行確認するとローカルDBデータ参照されたため)
    今後は無用なスペースを入れないようにしたいと思います。貴重なご助言ありがとうございました。

    キャンセル

check解決した方法

0

自己解決してしまいました。

    $db['host']="(本運用環境のIPアドレス)"; //接続先を本運用DBにする


この部分を

    $db['host']="(本運用環境のDBサーバ名)"; //接続先を本運用DBにする


とすることで、解決いたしました。DBホストの指定にIPアドレスがNGとは正直考えにくいのですが、
一先ずはこれで解決としておきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

接続先DB側パソコンでファイアウォールがあるならポート開放が必要、
セキュリティーソフトが強すぎて接続元になるwebサーバーからそもそもつなぎにいけないこともあるので、
念のためwebサーバー側パソコンでもポート開放。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/30 16:33

    サーバA,B共に、Symantec Endpoint Protectionを使用していますが、ファイアウォール機能は除外して運用しています。接続元PCも同様です。

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    21413questions

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

  • MySQL

    6207questions

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

  • XAMPP

    530questions

    XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。