[제나플러스] shift_jis 홈페이지 사용시 에러대처방법
본문
php.iniで以下の設定があるとき
magic_quotes_gpc = On
クライアントより<form>フォームで送られた文字列データが全てエスケープされ、「" → ¥"」「¥ → ¥¥」など変換処理が行われます。
またクッキーも同様です。
ここで問題になってくるのが、Shift-JISを扱うときです。5C文字化けに遭遇します。
『ソ』、『噂』、『圭介』、『能』という字も、エスケープされます。
エスケープしないようにするためには、Magic quotesの設定をOffにするのが単純な方法ですが、設定変更できない場合などあります。
またこれが設定されているかされていないかで、いちいち意識するのも面倒であったりします。
たとえば開発環境のサーバーではできてたのに、本番環境のサーバーではできなかったり。
そんなときに限って本番環境では.htaccessが使えなかったり。
煩わしさをなくしてくれるのが、次のコードです。
これをデフォルトで使うライブラリファイルや設定ファイルに入れておけば、magic_quotes_gpcを意識する必要はありません。
(設定ファイルに入れるのは、コーディングルール的にお勧めしません。)
magic_quotes_gpcのgpcは、GET、POST、COOKIEの意味ですので、エスケープの対象となるのはグローバル変数の$_GET、$_POST、$_REQUEST、$_COOKIEです。(PHP5)
(PHP4では、SERVER/ENVもエスケープされるようです。)
もしmagic_quotes_gpcがOnだったら、これらを逆変換stripslashesしてしまう。
Offの時にはなにもしない、というコードです。
一応、.htaccessで、magic_quotes_gpcをOffにする方法は、次のように書いた,htaccessをPHPの入っているディレクトリに設置するだけです。
上のコードで、strip_magic_quotes_slashes関連のエラーが出るって人は、次のコードに置き換えてみてください。
このコードを使ってて問題になるのが、他の人の書いたプログラムを使うときです。
いつも、自分のプログラムではこのコードをデフォルトで入れてるから、magic_quotes_gpc = Onで起こるこれらのトラブルを忘れちゃってたときですね。
『なんで普段はできるのに、別の人が書いたプログラムでは¥マークが入っちゃうの?』
って思ったりします。
COOKIEもエスケープされるかの確認コード
magic_quotes_gpc = On にして試してみてください。
<?
$cookie=isset($_COOKIE["test"])?$_COOKIE["test"]:"¥¥";
setcookie("test",$cookie);
echo $cookie;
?>
magic_quotes_gpc = On
クライアントより<form>フォームで送られた文字列データが全てエスケープされ、「" → ¥"」「¥ → ¥¥」など変換処理が行われます。
またクッキーも同様です。
ここで問題になってくるのが、Shift-JISを扱うときです。5C文字化けに遭遇します。
『ソ』、『噂』、『圭介』、『能』という字も、エスケープされます。
エスケープしないようにするためには、Magic quotesの設定をOffにするのが単純な方法ですが、設定変更できない場合などあります。
またこれが設定されているかされていないかで、いちいち意識するのも面倒であったりします。
たとえば開発環境のサーバーではできてたのに、本番環境のサーバーではできなかったり。
そんなときに限って本番環境では.htaccessが使えなかったり。
煩わしさをなくしてくれるのが、次のコードです。
これをデフォルトで使うライブラリファイルや設定ファイルに入れておけば、magic_quotes_gpcを意識する必要はありません。
(設定ファイルに入れるのは、コーディングルール的にお勧めしません。)
// magic_quotes_gpc = On の場合の対策
if (get_magic_quotes_gpc()) {
function strip_magic_quotes_slashes($arr)
{
return is_array($arr) ?
array_map('strip_magic_quotes_slashes', $arr) :
stripslashes($arr);
}
$_GET = strip_magic_quotes_slashes($_GET);
$_POST = strip_magic_quotes_slashes($_POST);
$_REQUEST = strip_magic_quotes_slashes($_REQUEST);
$_COOKIE = strip_magic_quotes_slashes($_COOKIE);
}
if (get_magic_quotes_gpc()) {
function strip_magic_quotes_slashes($arr)
{
return is_array($arr) ?
array_map('strip_magic_quotes_slashes', $arr) :
stripslashes($arr);
}
$_GET = strip_magic_quotes_slashes($_GET);
$_POST = strip_magic_quotes_slashes($_POST);
$_REQUEST = strip_magic_quotes_slashes($_REQUEST);
$_COOKIE = strip_magic_quotes_slashes($_COOKIE);
}
magic_quotes_gpcのgpcは、GET、POST、COOKIEの意味ですので、エスケープの対象となるのはグローバル変数の$_GET、$_POST、$_REQUEST、$_COOKIEです。(PHP5)
(PHP4では、SERVER/ENVもエスケープされるようです。)
もしmagic_quotes_gpcがOnだったら、これらを逆変換stripslashesしてしまう。
Offの時にはなにもしない、というコードです。
一応、.htaccessで、magic_quotes_gpcをOffにする方法は、次のように書いた,htaccessをPHPの入っているディレクトリに設置するだけです。
<Files .htaccess>
order allow,deny
deny from all
</Files>
php_value "magic_quotes_gpc" "Off"
order allow,deny
deny from all
</Files>
php_value "magic_quotes_gpc" "Off"
上のコードで、strip_magic_quotes_slashes関連のエラーが出るって人は、次のコードに置き換えてみてください。
// magic_quotes_gpc = On の場合の対策
if(!function_exists('strip_magic_quotes_slashes')) {
if (get_magic_quotes_gpc()) {
function strip_magic_quotes_slashes($arr)
{
return is_array($arr) ?
array_map('strip_magic_quotes_slashes', $arr) :
stripslashes($arr);
}
$_GET = strip_magic_quotes_slashes($_GET);
$_POST = strip_magic_quotes_slashes($_POST);
$_REQUEST = strip_magic_quotes_slashes($_REQUEST);
$_COOKIE = strip_magic_quotes_slashes($_COOKIE);
}
}
if(!function_exists('strip_magic_quotes_slashes')) {
if (get_magic_quotes_gpc()) {
function strip_magic_quotes_slashes($arr)
{
return is_array($arr) ?
array_map('strip_magic_quotes_slashes', $arr) :
stripslashes($arr);
}
$_GET = strip_magic_quotes_slashes($_GET);
$_POST = strip_magic_quotes_slashes($_POST);
$_REQUEST = strip_magic_quotes_slashes($_REQUEST);
$_COOKIE = strip_magic_quotes_slashes($_COOKIE);
}
}
このコードを使ってて問題になるのが、他の人の書いたプログラムを使うときです。
いつも、自分のプログラムではこのコードをデフォルトで入れてるから、magic_quotes_gpc = Onで起こるこれらのトラブルを忘れちゃってたときですね。
『なんで普段はできるのに、別の人が書いたプログラムでは¥マークが入っちゃうの?』
って思ったりします。
COOKIEもエスケープされるかの確認コード
magic_quotes_gpc = On にして試してみてください。
<?
$cookie=isset($_COOKIE["test"])?$_COOKIE["test"]:"¥¥";
setcookie("test",$cookie);
echo $cookie;
?>
추천0
관련링크
댓글목록 0
등록된 댓글이 없습니다.