2017-04-16 2 views
0

データベースに挿入したいすべての文字列をエスケープしたい。MySQLのリアルエスケープ - 独自のエスケープ - oをöに?

function escape($value) { 
    $return = ''; 
    for($i = 0; $i < strlen($value); ++$i) { 
     $char = $value[$i]; 
     $ord = ord($char); 
     if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126) 
      $return .= $char; 
     else 
      $return .= '\\x' . dechex($ord); 
    } 
    return $return; 
} 
:しかし、私の問題は、だから私は、私はstackoverflow.comにここで見つけるこのエスケープ関数を、使用して...私がチェックする以上10.000の文字列を持っているので、データベースクエリがあまりにも多くなり、

です

これは機能しています。しかし、私の問題は、私はどのöäまたはそのような文字を持っていないこと、である...

私はこの関数を呼び出す前に、私はこのような文字列があります:Königseditionを、私は、この関数を呼び出した後、私はK\xc3\x83\xc2\xb6nigseditionを取得する必要があります。しかし問題は、何らかの理由で私のデータベースにKxc3xb6nigseditionを得ることです...

どうすればKönigseditionに戻すことができますか?

または、その後、私はより10.000 SQLクエリよりもしなければならないので、文字列をエスケープするとUTF 8書式設定を維持するために、SQLリアルエスケープ関数を使用せずに、文字列をエスケープする他の方法は何ですか? (私はこの方法が好きです!)

挨拶とありがとう!

+1

パラメータ化クエリはどうですか? – frz3993

+0

"何らかの理由で"あなたのデータベースに文字列があります。あなたはそうでない "エスケープ"関数を呼び出すことではありません。 INSERTステートメントまたはUPDATEステートメントを実行したため、データベースに文字列があります。その "エスケープ"関数からの文字列の戻り値を挿入する場合、それはあなたのデータベースに文字列を取得する "理由"です。なぜ私はあなたが挿入した文字列と異なる文字列*がデータベースに存在すると期待するのか理解できません。なぜこのエスケープ機能を使用しますか?私はその目的を理解していない。 – spencer7593

+0

バインドプレースホルダでプリペアドステートメントを使用し、挿入する文字列の値を指定するだけです。値として渡される文字列のエンコーディングが、MySQLクライアントとカラムに対して指定された文字セットと一致することを確認してください。 https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html – spencer7593

答えて

2

文字列のエンコーディングに「エスケープ」する必要はありません。テーブル、接続、入力がすべて同じエンコーディング(UTF-8など)を持っていることを確認してください。

テーブルには、列(およびテーブル自体が好ましい)が、つまりutf8_general_ciの照合順序になっていることを確認してください。

PDOを使用する場合は、DSNに;charset:utf8を追加するか、PDOを使用しない場合は、SET NAMES utf8のクエリを実行してから、他のクエリを実行してください。 charsetを持つDSNの例はmysql:host=HOSTNAME;dbname=DATABASE;charset=utf8です。

ページにUTF-8エンコーディングがあることを確認し、Content-TypeヘッダーContent-Type: text/html; charset=utf-8をHTMLページに送信して、ブラウザがUTF-8でコンテンツを(フォームで)送信するようにします。

+0

私はUTF-8を持っています! - しかし、私が 'escape'関数を使うとUTF-8が得られません。 –

+0

なぜパラメータ化されたクエリやPDOの' quote() 'メソッドを使うのであれば、"エスケープ "する必要がありますか? – Dygnus

+0

'quote(...) 'を使うと、クエリは失敗します... –

関連する問題