前提・実現したいこと
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
1<?php 2 //セッション開始 3 session_start([ 4 'cookie_lifetime' => 1800, 5 ]); 6 7 $db['host']="(本運用環境のIPアドレス)"; //接続先を本運用DBにする 8 $db['user']="tc_guest"; 9 $db['pass']="(パスワード)"; 10 $db['dbname']="(DB名)"; 11 12 //エラーメッセージ初期化 13 $err_msg=""; 14 15 //ログインボタンが押された場合 16 if(isset($_POST["login"])){ 17 // 1.ユーザIDの入力チェック 18 if(empty($_POST["userid"])) { //emptyは値が空の判定 19 $err_msg='ユーザIDが未入力です。'; 20 }else if(empty($_POST["password"])) { 21 $err_msg='パスワードが未入力です。'; 22 } 23 24 if(!empty($_POST["userid"]) && !empty($_POST["password"])) { 25 //入力されたユーザIDを格納 26 $userid=$_POST["userid"]; 27 28 // 2.ユーザIDとパスワードが入力されていたら認証する 29 $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8',$db['host'],$db['dbname']); 30 31 // 3.エエラー処理 32 try { 33 $pdo=new PDO($dsn,$db['user'],$db['pass'],array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 34 …以下略 35 }catch (PDOException $e){ 36 $err_msg='データベースエラー:'; 37 echo $e->getMessage(); 38 }
発生している問題・エラーメッセージ
次のエラーメッセージが出ています。何故かここだけ文字化けしています。エラーコードから推測すると、おそらく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コマンドでアクセスできることは確認済みです。
CMD
1grant all privileges on DB名.* to tc_guest@"テスト環境サーバのIP" identified by 'パスワード' with grant option;
追加情報
ふと、テスト環境であるサーバAのMySQLのサービスをスタートさせたところ、ソースの処理が正常に動作しました。
ただし、DBはサーバBではなくサーバAを見に行っているようです。ソースはユーザ認証の処理なのですが、
サーバAにしか存在していないユーザ情報でログインされましたし、その後表示されるデータもサーバAにしかないデータが
出力されています。ということは、ソースの先頭で指定したホストの指定は全く意味がないということなのでしょうか…?
追記
新たにテスト確認したソースを開示します。
php
1<?php 2 3$db['host']="172.20.0.34";//サーバBのIPアドレス 4$db['user']="tc_guest"; 5$db['pass']="パスワード"; 6$db['dbname']="DB名"; 7 8$dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8',$db['host'],$db['dbname']); 9 10// 3.エエラー処理 11try { 12 $pdo=new PDO($dsn,$db['user'],$db['pass'],array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 13 14 $stmt=$pdo->prepare('select * from t_userdata'); 15 $stmt->execute(); 16 17 foreach($stmt as $row){ 18 echo $row["userid"] . " "; 19 } 20 21 22}catch(PDOExecption $e){ 23 echo $e->getMessage(); 24} 25 26?>
また、下記はサーバ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というのはどうも納得がいかないような…。
ともあれ、コメントをいただいた方々、お付き合いいただきありがとうございました。
一先ず本件については自己解決という形でクローズさせていただきますが、この件について知見をお持ちの方は引き続きご助言いただけると幸いです。
回答3件
あなたの回答
tips
プレビュー