php初心者です。

よろしくお願いします。
formで入力してそのデータを

$sql = "insert into customer_table(name,post1,post2,add,tel,email,service,time,com)
values('$name','$post1','$post2','$add','$tel','$email','$service','$time','$com')";
pg_query($sql);

DBに登録しようとクエリを実行しようとしたのですが、

Query failed: ERROR: invalid byte sequence for encoding "SJIS": 0xfea1 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". in C:\Program Files\Apache Group\Apache2\htdocs\sample\sq_input.php on line 17

このようなエンコーディングのエラーが出ます。
なぜなのでしょうか?

環境はwindows xp,apache,php,postgresqlです。
どなたかよろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/02/10 07:40:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:t_shiono No.1

回答回数256ベストアンサー獲得回数22

ポイント35pt

最初にお断りしておきますが、手元で確認できないのではずしていたらごめんなさい。

エラーはその通りに解釈すると、SQLクエリー中に不正な文字データがあるよってことです。

恐らく、作成したテーブルはSJISを利用するようにしたのですよね?


とすると、入力されたデータがSJIS以外の場合には、この現象になるかと思います。


これが発生する理由としては、入力のフォームがUTF8などSJIS以外のエンコーディングになっていると、ブラウザはフォームの文字コードでデータを送ってくるので、問題となります。

解決策としては、

1.フォームの文字コードを変換する

2.テーブルの文字コードを変換する

3.入力データを変換する

があります。

1や2が可能ならばそれはそれでよいかと思います。

3であった場合は、

PHPの設定で自動的に変換させることもできますが、手っ取り早いのは、

$enc = mb_detect_encoding($data);
$data = mb_convert_encoding($data, "SJIS", $enc);

などとして、$dataをSJISに変換してからSQLクエリーを作成してみてください。

この際に$encをechoなどで出力してみると、元のエンコーディングも確認できます。



あとは、実は携帯サイトで絵文字なんかが入っていると同等のことは起こるかもしれません。


参考になれば。

id:yohsinn

CLIENT_ENCODINGで設定はSJISに変えたのですが、あのようなエラーが出てしまいます。ちなみに全て英数字の入力ならエラーは出ません。やはりデータ型がおかしいのですかね?

2008/02/04 11:52:59
id:littlebangkok No.2

回答回数13ベストアンサー獲得回数1

ポイント35pt

このエラーは、Shift-JIS ではありえない文字列「0xfea1」が検出されたというエラーです。

考えられる可能性は下記の通りです。

  1. 不正な文字列が GET か POST された。
  2. 記録するデータとデータベースの文字列が一致しない。
  3. 文字コードの変換が PHP スクリプト上で適切に行われていない。
  4. PHP スクリプトの文字コードが Shift-JIS ではない。

いずれにしろ、文字コードが問題となっている可能性が高いです。

HTML ファイル、PHP スクリプト、データベースの文字コードをまずは確認してください。

あと、別件ですが、下記のスクリプトで正しく変数は展開されているのでしょうか?

通常シングルクォーテーションで囲まれている場合、変数ではなく文字列として展開されます。

$sql = "insert into customer_table(name,post1,post2,add,tel,email,service,time,com)

values('$name','$post1','$post2','$add','$tel','$email','$service','$time','$com')";

正しく展開されているならば、問題ないと思います。もし、展開されないようでしたら、下記のように記述してみてください。

$sqi = sprintf("INSERT INTO CUSTOMER_TABLE

(name, post1, post2, add, tel, email, service, time, com)

VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s');",

$name, $post1, $post2, $add, $tel, $email, $service, $time, $com

);

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません