アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPからMicrosoft SQLserverのデータベースへ接続を行い、データベースの内容をブラウザへ表示したいのですが、日本語が文字化けして困っております。

導入するまでの手順を書きます。

参考にしたページ
http://chorusde.hatenablog.jp/entry/20120621/134 …

(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文を認識してしまうため「そんなテーブル名はありませんよ」と怒られてしまうのだと思います。

初心者で凝縮ですが、どなたかアドバイスをお願いいたします。

A 回答 (1件)

>> 上記の環境からphp_pdo_sqlsrv_54_ts.dllとphp_sqlsrv_54_ts.dllを使用することを決定。



とありますが、実際にご利用になられているのは

PHP 用 Microsoft SQL Server ドライバ
http://php.net/manual/ja/book.sqlsrv.php

のほうみたいですね。こちらは日本語版マニュアルが存在しないほどマイナーな関数で、わざわざこれを利用するメリットは全くないと思います。せっかくなので

PHP Data Objects
http://www.php.net/manual/ja/book.pdo.php
Microsoft SQL Server 関数 (PDO_SQLSRV)
http://www.php.net/manual/ja/ref.pdo-sqlsrv.php

こっちで書きませんか?下の記事はMySQL向けに書いていますが、ある程度は参考になると思います。

PHPでデータベースに接続するときのまとめ
http://qiita.com/mpyw/items/b00b72c5c95aac573b71

DSNに関しては下記を参照してください。

PDO_SQLSRV DSN
http://php.net/manual/ja/ref.pdo-sqlsrv.connecti …
    • good
    • 0
この回答へのお礼

返信が遅くなって申し訳ございません。


アドバイスの通り「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

お礼日時:2013/11/15 13:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!