[PHP-users 32031] php+mysql+PrototypeをEUC-JP環境で運用したい。

高橋政利 takahashi @ hoshino-dk.co.jp
2007年 4月 26日 (木) 17:21:16 JST


高橋です。
いつもお世話になっております。
PHPのMLで聞く事なのかと悩みましたが、他に無いので投稿させていただきます。

環境は
Windows XP home SP2
Apache 2.0.54
PHP 5.1.4
MySQL 4.0.24-nt
PEAR 1.5.3
です。

ローカル環境で、社内WEBを作成・管理しているのですが、この度Ajaxを試用し
てみようと思い、WEBサイトにて調査しました。
Prototype.js が良さそうなので Prototype 1.5 を導入して以下のスクリプトに
て非同期通信が出来るところまではできたのですが、マルチバイト文字で文字化
けが発生してしまいます。
Ajaxについては「UTF-8が基本」と紹介しているサイトをいくつも見ていました
ので「やはり」とは思っていたのですが、EUC-JPで構築されたWEBアプリケーショ
ンでのマルチバイトの取扱は不可能なのでしょうか?
mb_convert_encoding やら mb_http_output やら マルチバイト文字列関数を色
々と試してみたのですが、ダメでした。なんか考え方の根底から間違えているよ
うな気もします。

Apache及びMySQLの文字コードはEUC-JPで統一しています。
運用中のサイトの修正を考えるとUTF-8に移行するのは、ちょっと気が重いです。

実行後の結果ですが、アラートには「??????を登録しました。」、MySQLには
「??????と入力」と出力されていますので、GETで引き渡しているマルチバイト
文字列のみが文字化けしている状態です。半角英数字では期待値で処理出来てい
ますので、何処かで文字コードの変換をしてあげれば良いような気がします。

どなたか解決策をご存じの方がいらっしゃいましたらご教授願います。


PHPの設定は以下の通りです。

output_buffering = Off
default_charset = "EUC-JP"

mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = EUC-JP
mbstring.http_output = EUC-JP
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;
;mbstring.func_overload = 0
;mbstring.strict_encoding = Off


コードは以下の通りです。

サーバー側
[check_ajax.php]

<?php
require_once("DB.php");
$dsn = 'mysqli://hogehoge:hogehoge@localhost/ajax_db';
$db = DB::connect($dsn);
if (PEAR::isError($db)) { die($db->getMessage()); }

$sql = 'INSERT INTO table1 (nyuji) VALUES (?)';
//$data = array(1, 4);
$data = $_GET['input_data'] .'と入力';

$res =& $db->query($sql, $data);
if (PEAR::isError($res)) { die($res->getMessage()); }

echo $_GET['input_data'] .'を登録しました。';
?>


クライアント側
[test_ajax.php]

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>てすと</title>
<!-- Ajaxライブラリ prototypeを読み込む !-->
<script src="../js/prototype.js" type="text/javascript"></script>
<script type="text/javascript">
	//ボタンをクリックしたときのイベント
  function ajax_input() {
		var url = "check_ajax.php";
		var pars = "input_data=" + encodeURI($("input_text").value);
		new Ajax.Request(url,{method:"get", parameters:pars, onComplete:ajaxReturn});
	}
	// Ajax処理後に動作するプログラム
	function ajaxReturn(request) {
		alert(request.responseText);
	}
</script>
</head>

<body>
	クリックで非同期登録します。<br>
	登録内容
	<input id="input_text" type="text"><br>
	<input type="button" value="クリック" onclick="ajax_input()"><br>
</body>
</html>

ユーザーから入力された情報をMySQLに登録して、結果をアラートしています。




PHP-users メーリングリストの案内