PHPからMSSQLへの接続結果の文字化け

このQ&Aのポイント
  • PHPからMicrosoft SQL Serverのデータベースへ接続し、ブラウザに日本語のデータを表示する際に文字化けが発生しています。この記事では、文字化けの原因と対処法について説明します。
  • 文字化けの原因は、PHPからMSSQLへの接続時に文字コードの設定が不適切であることです。接続時に正しい文字コードを指定することで、文字化けを解消することができます。
  • また、SQL文で日本語のテーブル名を使用する場合は、文字化けを防ぐためにテーブル名の指定方法を変更する必要があります。具体的な対処法についても解説します。
回答を見る
  • ベストアンサー

PHPからMSSQLへの接続結果の文字化け

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文を認識してしまうため「そんなテーブル名はありませんよ」と怒られてしまうのだと思います。 初心者で凝縮ですが、どなたかアドバイスをお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.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.connection.php

do79tama13
質問者

お礼

返信が遅くなって申し訳ございません。 アドバイスの通り「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

関連するQ&A

  • PHPからSQLServer

    PHPからSQLServerに接続しようと試みております。 ですが、以下のソースで $conn = mssql_connect("localhost", "sa", ""); mssql_select_db("hoge", $conn); 以下のワーニングが発生してしまいます。 Warning: mssql_connect(): Unable to connect to server: localhost Warning: mssql_select_db(): supplied argument is not a valid MS SQL-Link resource クエリアナライザでは"sa"、""で接続できるのですが・・・ 接続のために行なったことはphp.iniの extension=php_mssql.dll のコメントアウトを外しました。 ご存知の方がおられましたらご教授頂けませんでしょうか。 サーバ OS:Windows2000Server SP4 WebServer:Apache2.0.54 言語:PHP4.3.11 RDBMS:SQLServer2000 端末 OS:Windows2000Professinal SP4 IE6 SP1

    • 締切済み
    • PHP
  • PHP5 PDO MSSQL 使用できない

    以下のような環境で、SqlServer2005がうまく繋がりません。 WindowsXP SP3 Apache2.2 PHP5.2.17 ZendFramework1.11.1 PDO-MSSQL Eclipse DBへの接続はできるのですが、queryを実行すると error: 10038 Attempt to initiate a new SQL Server operation with results pending. [10038] (severity 7) [(null)] がでてしまい、エラーとなってしまいます。 ntwdblib.dll(2000.80.2039.0)、php_pdo_mssql.dllの差し替え等いろいろやって見ましたが改善しません。 なお、アプリはLinux上では動いている現役版ですが、WindowsXP上にEclipseの開発環境を新たに設ける為、試行錯誤をしているところです。 どなたか、このような経験をされた方がおりましたら、助言を頂きたいのですが、 よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHPグラフ作成について

    今PHPでGDを使い円グラフを作成しようとしていますが うまくいきません. 環境はwindowsで,PHPversion 5.2.3です. GDを使うためには, PHP.iniの extension=php_gd2.dllの行からコメントをはずして Apacheを再起動すると本に書いてありましたので, PHP.iniの extension=php_gd2.dll extension=php_gettext.dll extension=php_gmp.dll extension=php_ifx.dll extension=php_imap.dll extension=php_interbase.dll extension=php_ldap.dll extension=php_mbstring.dll extension_dir=C:\program Files\PHP\ext extension=php_mcrypt.dll extension=php_mhash.dll extension=php_mime_magic.dll extension=php_ming.dll extension=php_msql.dll extension=php_mssql.dll extension=php_mysql.dll extension=php_mysqli.dll extension=php_oci8.dll extension=php_openssl.dll extension=php_pdo_firebird.dll extension=php_pdo_mssql.dll extension=php_pdo_mysql.dll extension=php_pdo_oci.dll extension=php_pdo_oci8.dll extension=php_pdo_odbc.dll extension=php_pdo_pgsql.dll extension=php_pgsql.dll extension=php_pspell.dll extension=php_shmop.dll extension=php_snmp.dll extension=php_soap.dll extension=php_sockets.dll extension=php_pdo.dll extension=php_pdo_sqlite.dll extension=php_sqlite.dll extension=php_sybase_ct.dll extension=php_tidy.dll extension=php_xmlrpc.dll extension=php_xsl.dll extension=php_zip.dll のコメントをはずし, Apacheをrestartしました. しかし,グラフをつくるプログラムを書いて実行すると, Warning: require_once(jpgraph/jpgraph.php) [function.require-once]: failed to open stream: No such file or directory in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\prog\traning\piegraph.php on line 11 Fatal error: require_once() [function.require]: Failed opening required 'jpgraph/jpgraph.php' (include_path='.;C:\Program Files\PHP\pear') in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\prog\traning\piegraph.php on line 11 のようなエラーが出てしまいます. これはGDがきちんとインストールされていないから, このようなエラーがでるのでしょうか? もしそうであればGDをインストールする方法をご存知の方や 解決方法をご存知の方いらっしゃいましたら いらっしゃいましたら教えていただけないでしょうか? お願いします.

    • 締切済み
    • PHP
  • PDO+PHP+MSSQLで文字化け

    ExcelからADO経由でSQLSERVER Express2014に登録したデータをPHPでPDO経由で取得しようと思っていますが、文字化けで困っています。 print_r($row);で取得したレコードを表示したところ、データ自体は文字化けしていませんがフィールド名が化けています。 PHPファイルの保存形式、SET NAMESでの文字コード、PHP.INIの設定等、どこで指定すればいいのかご教授願えませんでしょうか? 情報不足であれば追加します。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP mssql_connectで接続できません

    すみません。PHPからMSSQLサーバーに接続できずに困っています。 ブラウザを経由するとCentos上のPHPからWindowsのSQLサーバーに接続できない状態です。 コマンドラインからPHPを実行した場合は接続できるのですが、 同じPHPファイルにブラウザからアクセスした場合はなぜか接続エラーになってしまいます。 なぜブラウザからだと接続エラーになってしまうのか原因が分かる方はいらっしゃいますでしょうか? または同じ症状になったことがある方はいらっしゃいますか? PHPとfreeTDSは以下の様な記述になっています。 ■PHPの記述 $link = mssql_connect('MSSQL', 'ユーザー名', 'パスワード'); ■freeTDSの記述 [MSSQL] host = 192.168.0.1 port = 1433 tds version = 8.0 charset = UTF-8 client charset = UTF-8 language = japanese ■phpinfoのmssqlの情報 mssql MSSQL Support enabled Active Persistent Links 0 Active Links 0 Library version FreeTDS Directive Local Value Master Value mssql.allow_persistent On On mssql.batchsize 0 0 mssql.charset no value no value mssql.compatability_mode Off Off mssql.connect_timeout 5 5 mssql.datetimeconvert On On mssql.max_links Unlimited Unlimited mssql.max_persistent Unlimited Unlimited mssql.max_procs Unlimited Unlimited mssql.min_error_severity 10 10 mssql.min_message_severity 10 10 mssql.secure_connection Off Off mssql.textlimit Server default Server default mssql.textsize Server default Server default mssql.timeout 60 60 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • mSQL関数って、何?(汗)

    PHPマニュアルには、 「以下の関数により mSQL データベースサーバにアクセスすることが 可能になります。mSQL に関する詳細な情報は、 &raquo; http://www.hughes.com.au/ にあります。 」 と、ありました。 Mini SQLとも、書いてありました。 (PHPEclipseというのをインストールしたら、php.iniの設定が、有効になっていました。 extension=php_msql.dll extension=php_mssql.dll  : extension=php_pdo_mssql.dll ) コメントにすれば、問題ないようなので、コメントにしておきましたが、新しいデータベースということなのでしょうか?

    • ベストアンサー
    • PHP
  • SQL Server 2008とPHPの連携

    $DBHost = '\SQLEXPRESS'; $DBUser = 'sa'; $DBPass = 'password'; $DB = 'database'; $r = mssql_connect($DBHost, $DBUser, $DBPass); として接続しようとしているのですがうまくいきません Management Studioでは サーバー名 OWNER-PC\SQLEXPRESS 認証 SQL Server認証 ユーザー sa パスワード password でちゃんと接続出来ます 環境は Windows 7 32bit XAMPP(apache2.2 + PHP5.3) でやっています 上記のソースで実行すると Fatal error: Call to undefined function mssql_connect() in C:\public_html\conf\config.php on line 7 というエラーが出て7行目は $r = mssql_connect($DBHost, $DBUser, $DBPass); これになっています $DBHostをlocalhost\SQLEXPRESSなどにしてもうまくいきません php.iniのextension=php_mssql.dllもちゃんとセミコロンははずしてあります 何か間違っているでしょうか? アドバイスよろしくお願いします

    • 締切済み
    • PHP
  • php +MS SQL server

    phpでMSSQLサーバへ接続しようとしています。 WINDOWS/system32にはntwdblib.dll を、 php.iniにはextension=php_mssql.dll のコメントを外してあります。 ですが、phpinfo()を見ても、mssqlの記述がなく、 mssql_connect('database','user','password')を記述すると、undefined function となってしまいます。 何か接続に必要な処理が足りないのでしょうか。 どなたかアドバイスお願いします。

    • ベストアンサー
    • PHP
  • phpからsqlserverへの接続

    $serverName = '.\\SQLEXPRESS'; $connectionInfo = array( 'UID' => 'sa', 'PWD' => 'ks78', 'Database' => 'Movies' ); $conn = sqlsrv_connect( $serverName, $connectionInfo ); if( $conn === false ){ echo "Cound not connect.\n"; die( print_r( sqlsrv_errors(), true)); } 上記スクリプトですと接続できるのですが、 下記のスクリプトではどうしても接続ができません。 エラーからサーバー名?と思いManagement studio のサーバー名 localhost\SQLEXPRESS に変更しても接続できませんでした。 お教え願います。 $DBSERVER = ".\\SQLEXPRESS"; //SQL Serverサーバー名 $DBUSER = "sa"; //ログインユーザー名 $DBPASSWORD = "ks78"; //パスワード $DBNAME = "sample"; //データベース名 //SQL Serverに接続 $con = mssql_connect($DBSERVER, $DBUSER, $DBPASSWORD); if ($con) { print "SQL Serverに接続しました!<BR><BR>"; } else { print "SQL Serverに接続できませんでした!<BR><BR>"; }

    • 締切済み
    • PHP
  • PHPの書き方について

    PHPを独学で勉強中で、気になったことがあるので質問させていただきます。 最初に買った書籍とその次に買った書籍で書き方が違うところがあるので、普通はどちらでやるのか、また、使い分けがあるのかが知りたいです。 たとえば、データベースを1行ずつ取り出す処理で、1冊目では $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM ○○"; $stmt = $pdo->prepare($sql); $stmt->execute(null); $res = ""; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $res .= $row['△△'] ."," .$row['□□'] ."<br>\n"; } ・・・というコードがあったのですが、2冊目には同じような処理が mysqli_fetch_assoc()を使って書かれていたり、 接続の仕方も1冊目では「new PDO($dnsinfo,$USER,$PW);」を使って書かれているのが、2冊目では「mysqli_connect()」になっていたり、 他にも同じような処理がよく似たコードで書かれています。 調べてみると、PHP5.5から1冊目のやり方になった・・・ような記事を見つけたのですが、どちらの本もPHP5.5と書いてあり、いまいちよくわかりません。 詳しい方いらっしゃいましたらご教示お願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう