人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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です。
どなたかよろしくお願いします。

●質問者: yohsinn
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:ADD Apache byte dB DOES
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● t_shiono
●35ポイント

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

エラーはその通りに解釈すると、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などで出力してみると、元のエンコーディングも確認できます。



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


参考になれば。

◎質問者からの返答

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


2 ● littlebangkok
●35ポイント

このエラーは、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

);

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ