よろしくお願いします。
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です。
どなたかよろしくお願いします。
最初にお断りしておきますが、手元で確認できないのではずしていたらごめんなさい。
エラーはその通りに解釈すると、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などで出力してみると、元のエンコーディングも確認できます。
あとは、実は携帯サイトで絵文字なんかが入っていると同等のことは起こるかもしれません。
参考になれば。
このエラーは、Shift-JIS ではありえない文字列「0xfea1」が検出されたというエラーです。
考えられる可能性は下記の通りです。
いずれにしろ、文字コードが問題となっている可能性が高いです。
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
);
CLIENT_ENCODINGで設定はSJISに変えたのですが、あのようなエラーが出てしまいます。ちなみに全て英数字の入力ならエラーは出ません。やはりデータ型がおかしいのですかね?