dポイントプレゼントキャンペーン実施中!

PHPで作成したWEBページでMySQLのデータを更新すると、特定文字のみ文字化けします。
現在、発見されているのは”予定”という文字です。
文字化けすると”嵐閨”という文字になります。
サーバ環境はLinuxFedoraCore3、Apache2.0.52、PHP4.3.11、MySQL4.1.10です。

phpMyAdminから同じテーブルへ”予定”という文字を入力すると、問題なく表示されています。

PHPで作成したコマンド・コードが悪いのではなく、
httpd.confやphp.iniの設定が悪いように思うのですが、何が悪いのか分かりません。

このような症状についてご存知でしたら、ご指導願いします。

A 回答 (2件)

$sql全体をエスケープするのじゃなくてセットする値のみをエスケープします。


この場合は
$location= mysql_escape_string($location);
$color= mysql_escape_string($color);
$sql = "update location_tbl set location = '$location', color = '$color'";
$resultId = mysql_query($sql);
になります。
    • good
    • 0
この回答へのお礼

二度にわたる親切な回答に感謝しております。
重ね重ねありがとうございます。

回答に通りに変更したところ、正常に動作いたしました。

mysql_escape_stringについて、知識がなかったものでwebで調べたところsql全体をエスケープしていたものをみたもので使い方を誤って認識していました。

まったく同じモジュールを、Windowsのwebサーバーで動かすと、問題なく動くのが不思議です。
apache、php、MySQLともほぼ同じバージョンなのですが。

apache、php、MySQL等の言語の設定かとも思い、my.cnfファイルを変えたり、データベースオープン時にmysql_set_character_setを加えたりしてみたのですが、解決できませんでした。

問題が解決できとても助かりました。
ありがとうございました。

お礼日時:2005/07/26 09:41

予定 97 5C 92 E8


嵐閨 97 92 E8 81
予定の予に含まれる5C(アスキー文字で\)が取り除かれたための文字化けと思われます。
MySQLに文字をinsertする前に文字をmysql_escape_string()でエスケープしてないのではないでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
おっしゃる通りの不具合でした。
「予\定」と入力すると、正常に表示されました。

mysql_escape_string()を以下のように作ってみたのですが、データの更新に失敗してしまいます。

$location = "社長室";
$color = "#FFFFFF"
$sql = "update location_tbl set location = '$location', color = '$color'";
print "$sql";
$sql = mysql_escape_string($sql);
print "$sql";
$resultId = mysql_query($sql);

mysql_escape_string()の前後に$sqlをプリントさせたところこのようになりました。

前: update location_tbl set location = '社長室', color = '#FFFFFF'

後: update location_tbl set location = \'社長室\', color = \'#FFFFFF\'

mysql_escape_string()は成功しているようなのですが、
データベースの更新に失敗している理由が分かりません。
ご指導お願いします。

お礼日時:2005/07/25 15:47

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