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

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

ただいまの
回答率

90.61%

  • PHP

    19870questions

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

  • MySQL

    5701questions

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

PHPでDBにアクセスするためのphp.ini設定

解決済

回答 3

投稿

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

gsuisk

score 64

PDOを使ってMySQLにアクセスしたいのですが、エラーが出てしまいます。

例外が投げられた時のメッセージなのですが、エラー自体が文字化けしています。

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

DBを扱うにはphp.iniの設定が必要だと聞き、設定箇所を調べたのですが情報が古いのか異なる点が多く困っています。

使用しているPHPのバージョンは7.17です。

該当箇所と思われる、現在php.iniに記載されているのは以下です。

extension=php_mysqli.dll

;extension=php_pdo_firebird.dll
extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll

extension=php_mysql.dll があるはずみたいなのですが、私の場合、mysqliと単語が違います。また extension=php_pdo.dll を追加すれば良いらしいのですが、php_pdo関係の記述がいくつかあってよくわかりません。

どこを変更すればよいのか教えていただけると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

こちらの現象、再現できました。
多分ですが、環境は Windows 系をご使用されているのだと思います。

現象:

SQLSTATE[HY000] [2002] 対象のコンピューターによって拒否されたため、接続できませんでした。
という内容のマルチバイト箇所が文字化けしています。
*Shift-JIS を UTF-8 で表示しています。

解決方法:

try - catch でエラーをecho $e->getMessage();と表現していると思いますが、以下のように修正してください。

echo mb_convert_encoding($e->getMessage(), "UTF-8", "Shift-JIS");


これを入れることで、DB 接続後のエラーメッセージが文字化けする可能性がありますが、lc_messages = 'ja_jp'等、明示的に日本語利用を設定していなければ、シングルバイト文字でエラー表示されるため、影響はないと思います。

原因(というか、現象からの考察):

本来、エラーメッセージは、接続後の DB が指定された文字コードで PHP に渡すのですが、本件のように DB 接続前にエラーが出てしまうと、多分、PDO ドライバの動作環境の文字コードが採用されるようです。

最後に

この現象は、「接続以前にエラーが起きる」場合で、かつ「そのエラーメッセージをマルチバイトで表示する」場合のみ発生します。
その為、基本的に、接続してしまえば対処の必要もないので、上記の解決方法を取る必要もないと思います。
結果として、自己解決内容が非常に正しいものでした。
評価を下げていましたが、再評価しました^^;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

直接的な回答にはなりませんが、
DBの方がUTF-8になっているか確認してみてはいかがでしょうか

 参考リンク

PHPのPDOでMySQL使ったら文字化けしたときの対処方法
https://amg-solution.jp/blog/247

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/11 18:21

    ありがとうございます。DSNのホスト名を変えたら接続できました!

    キャンセル

+1

参考書に記載されていたホスト名が'localhost:8889'だったのですが、これを'localhost'に変えたら接続できました。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/11 21:45

    質問の内容って解決していないと思いますよ。。。

    キャンセル

  • 2017/09/11 23:11

    本当ですか?文字化けするのはやはりどこかに問題があるからなのでしょうか?

    キャンセル

  • 2017/09/11 23:18

    多分
    echo '日本語';
    の出力も文字化けすると思います。

    キャンセル

  • 2017/09/12 21:53

    echo '日本語';
    は文字化けせずに「日本語」と出力されました。

    キャンセル

  • 2017/09/12 22:35 編集

    確かに SQLSTATE[HY000] [2002] の後にマルチバイトは続かないですね。。。
    かなりおかしなことになっている気がします。

    キャンセル

  • 2017/09/14 11:33 編集

    すみません。MySQL の lc_messages に `ja_jp` を設定すると、エラーメッセージが日本語になることを確認しました。
    上記は誤った情報でした。
    申し訳ない。

    ちなみに、手元の環境で少し触ってみましたが、現象はまだ再現できていません。
    多分、lc_messages に `ja_jp` が設定された上で、DB の吐き出す文字コードとクライアントの文字コードがあっていないのだと思いますが。。。

    キャンセル

  • 2017/09/14 12:08

    現象の確認が取れました。
    非常に面白い現象でした。
    別で回答を書きましたので、興味があればお読みください。
    結論として、この自己解決は、全く正しかったです。
    評価を下げていましたが、再評価しました。

    キャンセル

  • 2017/09/15 01:03

    そうなんですね!参考になります。ありがとうございました。

    キャンセル

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

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

関連した質問

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

  • PHP

    19870questions

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

  • MySQL

    5701questions

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