• ベストアンサー

Shift_jisの『十』を含む文字列検索エラーについて

宜しくお願い致します。 PHP+MySQLでシステムを構築しております。 PHPで作製したフォームからSQL文を発行する際に漢数字の『十』が含まれるとちゃんと検索されません。 ネットで調べてみたところ、この『十』はShift_jisでは『5c』文字となるため、『十』の2バイト目が『5c』(\と同じ)なので、2文字目が消されてしまい、うまく検索できないという事がのっておりました。 この現象を回避する為に、検索時に『十』の後にバックスラッシュ(\)を3個付加してみたところ、うまく検索できました。 そこで、PHPのフォーム上で正規表現により『十』を検索し、『十\\\』に置き換えてみようと試みたのですが、PHPのフォーム自体がShift_jisで作られている為、『十』を認識できず、PHPエラーが返されてしまいます。 こういった場合、どの様にすれば回避できるのでしょうか? ご教授の程、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> mysql_real_escape_string() expects parameter 2 to be resource, null given 意訳すると、mysql_real_escape_string関数の2つ目のパラメータは資源型でなければならないが、実際には資源型ではなくnullだった、というような意味です。 mysql DBへの接続に失敗していませんかね? まず、以下で切り分けしたら如何でしょうか。 $link = mysql_connect(*, *, *); // *は適宜書き換えて下さい if (!$link) { die('接続できませんでした: ' . mysql_error()); } else { echo('接続しました'); }

nikuq
質問者

お礼

ありがとうございます! mysql_connectの前にこの関数を使っていました(-_-;) 今度はエラーが返らず正常な動作をしました。 具体的なスクリプトまでご記入いただき、誠にありがとうございます! 本当に助かりました!!

その他の回答 (1)

回答No.1

まず、問題が発生するのは、「十」だけではありません。 正しくない対策をすると、セキュリティの面で脆弱になります。 ですので、しっかりと対策をすることをお勧めします。 何点か、一般的な注意事項を書きます。 ・PHPとmysqlのエンコーディングを合せる  PHPでinternal_encodingをSJISにするならば、MySQLの各種エンコーディング設定をSJISにした方が、問題が少ないです。 ・php.ini設定で、magic_quotes_gpcをoffにする  少なくともSJISを使う場合は必須です。 ・addslashesを使わないでエスケープする  方法1:mysql_real_escape_stringを使う    例えば、$sql="select foo from bar where hoge='". mysql_real_escape_string($_GET['hoge']). "'";  方法2:mysqli関数のmysqli_stmt_bind_paramなどを使う    これについては、mysqlのバージョンの制限があります    詳細は、PHPマニュアルを参照して下さい

nikuq
質問者

補足

ありがとうございます。早速試してみました。 PHPのバージョンが4台なので、mysqli_stmt_bind_paramは使用できなかったので、mysql_real_escape_stringを使用してみました。 php.iniのmagic_quotes_gpcをOFFに設定し、mysql_real_escape_stringを使用してみたところ、下記の様なエラーが返って来ました。 mysql_real_escape_string() expects parameter 2 to be resource, null given エラーの内容を直訳すると、 パラメータ2が資源(与えられるヌル)であるのを予想する となっておりますが、何の事やらさっぱりです・・・

関連するQ&A