PHPからPDOでSQLserver2012へ接続する際の文字コードの問題
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 3,820
現在私はPHPを使用し、SQLserver2012へ接続使用と試みております。
ドライバー等をインストールし、
$con=new PDO("sqlsrv:server=$serverName;Database=$dbName","","");
での接続は完了しました。
しかし、途中でファイルの文字コードを「UTF-8」から「Shift_JIS」に変えなければならなくなりました。
そこで、ファイルの文字コードをUTF-8NからShift_JISに変換したところ、SQLのクエリが通らなくなってしまいました。(結果が空です)
これはなぜでしょうか。(もう一度UTF-8に戻すと正常に取得できます)
ご教授いただけたら幸いです。宜しくお願い致します。
以下プログラムです。
<?php
$serverName=".\\hoge";
$dbName="moge";
//PDO
$con=new PDO("sqlsrv:server=$serverName;Database=$dbName","","");
if($con){
echo "connected!";
}else{
die("error!=>".$con->errorInfo());
}
$sql="select * from テーブル名";
foreach($con->query($sql) as $res){
print_r($res);
}
exit;
?>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
DBとの接続に際して、一概にPG側だけの問題とは言い切れないので、以下の点確認してみると良いと思います。
1.DB側のエンコードはなにが定義されていますか?
もしもPG側と相違があるのであれば合わせてみてはどうでしょうか?
2.DBへのConnectionが出来ていないのでしょうか?それともqueryを投げた結果が空なのでしょうか?問題の切り分けがまったく異なるので、try&catch を掛けて状況の切り分けを行ってみてください。どこかでエラーが出ているのであればエラー内容も貼るといいと思います。
3.上記を前提にDBConnectに問題はないと仮定して、処理部の
$con->query($sql)
をvar_dump 掛けると何が格納されていますか?想定どおりarrayは格納されていますか?
大体この辺を調べてみて問題の切り分けをしてみてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
$con=new PDO("sqlsrv:server=$serverName;Database=$dbName;charset=sjis","","");
こんな感じでcharsetするとどうでしょう?
SQLserverは使った事がなくて動作確認が…
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2015/04/17 13:14
結論から申し上げさせて頂きます。
ShintaroIshida様のご助言のおかげ様で、【無事解決】に至りました。
本当にありがとうございました。
以下はご助言に対する回答と、解決に至るまでのプロセスを記述致します。
1.SQLserver2012を初めて利用するので、エンコードの確認方法がわからず申し訳ないのですが・・・
PHPファイルのエンコードがUTF-8の際、取得した情報を
mb_detect_encoding();
にて確認した所、ASCIIとUTF-8という情報を取得できました。
2.echoにて「connected!」の文字は表示されますので、おそらく接続はできていると思います・・。さらにPHPファイルのエンコードがUTF-8の時は取得すらできました。
3.sjisに変更してからは、var_dumpには何も入っておりませんでした。
以下はプロセスになります。【問題】=>《解決方法》という形式で記述させていただきます。
【PHPファイルをUTF8からSJISに変更したことによって接続できなくなった問題】
《クエリが格納されております、$sqlに、mb_convert_endocing($sql,"UTF-8","auto")を施しました。》
しかしここで新たな問題が・・・
【mb_convert_encodingのautoが、文字エンコードを検知できない】
クエリには日本語が書かれておりましたので、
《mb_language("Japanese");を手前に記述》することによって無事解決しました。
ただ・・・取得した情報をforeach にて as $key=>$resをすると
【$resだけが文字化けをする問題】が起こりました。
こちらの原因は不明ですが、単純にコンバートすれば良いと思い、
《mb_convert_encoding($res,"sjis","auto");》
とすることにより無事取得出来ました。(もちろん、こちらもmb_language("Japanese")が前提です。
以上