※ ChatGPTを利用し、要約された質問です(原文:PHPからMSSQLへの接続結果の文字化け)
PHPからMSSQLへの接続結果の文字化け
このQ&Aのポイント
PHPからMicrosoft SQL Serverのデータベースへ接続し、ブラウザに日本語のデータを表示する際に文字化けが発生しています。この記事では、文字化けの原因と対処法について説明します。
文字化けの原因は、PHPからMSSQLへの接続時に文字コードの設定が不適切であることです。接続時に正しい文字コードを指定することで、文字化けを解消することができます。
また、SQL文で日本語のテーブル名を使用する場合は、文字化けを防ぐためにテーブル名の指定方法を変更する必要があります。具体的な対処法についても解説します。
PHPからMicrosoft SQLserverのデータベースへ接続を行い、データベースの内容をブラウザへ表示したいのですが、日本語が文字化けして困っております。
導入するまでの手順を書きます。
参考にしたページ
http://chorusde.hatenablog.jp/entry/20120621/1340300814
(1)マイクロソフトのホームページより「SQL Server Driver for PHP」をダウンロード、解凍。
(2)自分のPHPバージョンを確認。
Apache/2.4.4
PHP/5.4.19
MSVC9
Thread Safety/enabled
上記の環境からphp_pdo_sqlsrv_54_ts.dllとphp_sqlsrv_54_ts.dllを使用することを決定。
(3)C:\xampp\php\extの下に(1)で解凍したフォルダ内にあるphp_pdo_sqlsrv_54_ts.dllとphp_sqlsrv_54_ts.dllをコピー。
(4)C:\xampp\php\php.iniを開き、「extension=」と書いている951行あたりに
「extension=php_pdo_sqlsrv_54_ts.dll」
「extension=php_sqlsrv_54_ts.dll」
を追加
「mssql.secure_connection = OFF」を「ON」に修正
(5)XAMPPコントロール画面でApacheとMySQLを再起動。
その後、以下のコードで実行したところ日本語が文字化けしました。
以下のコードはこのページのサンプルコードをそのままコピペし少し修正したものです。
http://keicode.com/cgi/how-to-connect-to-mssql.php
<?php
$serverName = 'SQLEXPRESS';
$connectionInfo = array(
'UID' => 'username',
'PWD' => 'password',
'Database' => 'shop'
);
$conn = sqlsrv_connect( $serverName, $connectionInfo );
if( $conn === false ){
echo "Cound not connect.\n";
die( print_r( sqlsrv_errors(), true));
}
$tsql ="SELECT * from food";
$stmt = sqlsrv_query( $conn, $tsql );
if( !$stmt ) {
die( print_r( sqlsrv_errors(), true));
}
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC)) {
print_r($row);
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
このソースを実行しますと日本語が文字化けしてしまいます。(データを英語表記にすれば問題なく表示できます)
文字化けせずにブラウザに結果を表示するためにはどのようにすればよいでしょうか?
またSQL文の「"SELECT * from food"」の"food"の部分(テーブル名)を「食品」と日本語名に変更するとsql文が実行できなくなりエラーを起こします。
おそらく文字化けしてSQL文を認識してしまうため「そんなテーブル名はありませんよ」と怒られてしまうのだと思います。
初心者で凝縮ですが、どなたかアドバイスをお願いいたします。
お礼
返信が遅くなって申し訳ございません。 アドバイスの通り「sqlsrv_connect」ではなく「PDO_SQLSRV」を使って以下のように書き直してみました。 MSSQLconnection-test.php <?php $server = "SQLEXPRESS"; $user = "user"; $pwd = "password"; $db = "shop"; try{ $conn = new PDO( "sqlsrv:Server= $server ; Database = $db ", $user, $pwd); $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); }catch(Exception $e){ die(print_r($e)); } //エラーを起こさず無事にアクセスできた場合の処理 $sql = "SELECT * from food"; $stmt = $conn->query($sql); while($row = $stmt->fetch(PDO::FETCH_NUM)){ print ($row[0]); //No print($row[1]); //food print($row[2]."<br>"); //price } // コネクションとステートメントの開放 $stmt = null; $conn = null; ?> これでMicrosoftSQLサーバーからの結果を表示しても文字化けしなくなりました。 また、sql文で例えば「$sql="select * from 食品";」というように日本語のテーブル名を指定してもちゃんと結果を受け取ってくれます。 助かりました。ありがとうございましたm(_ _)m