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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PHP

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

3229閲覧

WebサーバがLinuxサーバ、DBがWindowsサーバの場合の文字化け対策について

xxhiroxx_chan

総合スコア41

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PHP

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2015/12/07 07:05

編集2015/12/07 07:10

xxhiroxx_chanと申します。

Apache+PHP+SQLServerでWEBページを開発したのですが、
DBにブラウザからの入力データを登録する際に時々文字化けが発生し、
対策方法がわかりません。

WEBサーバがLinuxでの開発はほぼ初心者です。
対策方法を教えてください。

よろしくお願いいたします。

具体的な環境は以下です。

■WEBサーバ
・CentOS ※バージョン不明

(※curl Host x86_64-redhat-linux-gnu)

・Apache2 ※「.」以下のバージョン不明

(※Apache API Version 20051115)

・PHP5.3.3

■データベース

・Windows Server 2012 R2 64bit OS

・SQLServer2014

またPHP.iniのmbstringは、以下の通りです。

mbstring.detect_order auto

mbstring.encoding_translation On

mbstring.func_overload 0

mbstring.http_input auto

mbstring.http_output SJIS

mbstring.http_output_conv_mimetypes ^(text/|application/xhtml+xml)

mbstring.internal_encoding EUC-JP

mbstring.language Japanese

mbstring.strict_detection Off

mbstring.substitute_character no value

ブラウザ上にShift-JISで入力された文字列を

EUC-JPのphpファイル内でにて、

(1)Shift-JISにエンコード

(2)SQLServerにデータを格納。

を行っています。

コードの一部は以下のようなものです。

//文字コードをSJISへ変換------------------------------

function convStringtoSJIS($string) {

//文字コードを変更 $string = mb_convert_encoding($string,"SJIS","EUC-JP"); //[\]を取り除く $string = stripslashes($string); //HTMLタグを除去する $string = htmlspecialchars($string,ENT_QUOTES); return $string;

}

//--------------------------------------------------

//--------------------------------------------------
・・・・・

$inputname = convStringtoSJIS($_POST['inputname']);

$inputml = convStringtoSJIS($_POST['inputml']);

$subject = convStringtoSJIS($_POST['subject']);

$message = convStringtoSJIS($_POST['message']);

$url = convStringtoSJIS($_POST['url']);

$title = convStringtoSJIS($_POST['title']);

$inputdatetime = date("Y/m/d H:i:s");

//データを登録

$sql = "
INSERT INTO dbo.T_Kiji (
KijiNo,
KijiSubNo,
InputID,
InputName,
InputML,
Subject,
Message,
URL,
InputDate, InputTime
) VALUES (
'$kijino',
'$kijisubno',
'$inputid',
'$inputname',
'$inputml',
'$subject',
'$message',
'$url',
'$inputdate',
'$inputtime')";

$rs = mssql_query($sql);
・・・・・

//--------------------------------------------------

例えば、以下のように文字化けします。

お忙しい中垂オ訳ございませんが、再度ご調整くださり
会の開催がかないますよう、どうぞよろしくお願いいたします。

このたびも下記URLより、可狽ネ日程に○をつけてください。

以上、どうぞよろしくお願い申し上げます。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

stripslashesは、文字コードを考えずに処理しますので、「申し訳」の「申」の2バイト目にあるバックスラッシュと同じコードまで引き抜いてしまいます。

データベースに入れるデータは汎用の関数ではなく、正しいエスケープ関数を使いましょう(現状ではシングルクオートにもエスケープが利いていないので、SQLインジェクションの脆弱性があります)…と思ったらmssqlにないみたいですね。英語版のStackoverflowを覗いてみましたが、「PDOへの乗り換え」も一案かもしれません。

投稿2015/12/07 07:14

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxhiroxx_chan

2015/12/07 07:20

早速ありがとうございました! stripslashesについて大変参考になりました。 また、「正しいエスケープ関数」とは、 「その環境、環境にあったエスケープ関数を正しく理解し、必要なものを選択して使用する」 とのことでしょうか? そうであるなら、何か参考になるサイトを教えて頂ければ幸いです。
maisumakun

2015/12/07 07:28

ふつうはPDOのPDO->quote()とか、MySQLi用のmysqli_real_escape_stringというように、接続ライブラリ側で用意してあるものなのですが、PHPのmssqlにはなぜかないようで、むしろびっくりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問