2011-11-16 10 views
2

私は入力を1つずつエスケープすることが多く、2つの方法の違いについては不思議です。どちらがより一般的なプラクティスですか?私は最初に "エスケープが必要な"フィールドをエスケープしてみました。そして、それぞれの値に対して長いエスケープコードを書くことになりました。一度にSQL文全体をエスケープするときの短所は何ですか?入力パラメータを1つずつエスケープするか、SQLクエリ全体をエスケープする必要がありますか?

+1

SQL文全体を一度にエスケープすることはできません。それは、価値的にしか機能しません(そしてその値は文字列でなければなりません)。ただし、エスケープ処理は、古いデータベースインタフェース関数を使用しないことで回避できます。 (検索を使用して、PDOとバインドされたパラメータを探してください) – mario

+0

[MySQL/PDO/Prepared Statements]の可能な複製 - すべての大きなジャンプ、ちょっと圧倒し、ちょっと混乱しますか?](http://stackoverflow.com/questions/ 8061185/mysql-pdo-prepared-statements-all-a-big-jump-a-bit-overwhelming-and-a-lit) – mario

答えて

3

クエリ内で値を示すためにシングルクォートなどのものを使用しているため、エスケープしないようにしていますが、一重引用符を含む可能性のある値をエスケープしたいからです。

+0

mysqlがエスケープされたSQL文字列を受け入れていないことは確かですか? –

+0

これは "受け入れ"の問題ではありません - MySQL構文(つまり文字列を区切る)のコンテキストで必要なアポストロフィをエスケープすると、クエリが完全に変更され、おそらくそれが破られる可能性があります。 – andrewtweber

+0

@UğurGümüşhanそれは、単一の引用符が値の開始と停止を示す制御文字であるため、値を含む文全体をエスケープしたくない、エスケープされたSQL文字列を受け入れないということではありません。 – jakx

-1

mysql_real_escape_stringを使用すると、SQL文字列をエスケープしたほうが便利です。時間と記憶に関連して。必要に応じて、各入力レベルでいくつかのバリデーションを行うことができます。

+0

これは絶対に意味をなさない唯一の答えではありません。他人を助けようとする前に少しだけ学ぶ必要があるかもしれませんか? –

+0

確かに、私は助けて学びます。私はあなたがどこにいるのを得ようとしています – tmjam

0

準備文を使用し、バインドパラメータを使用します。何か他のことが起こるのを待っているハックです

+0

そうではありません。プリペアドステートメントとバインドパラメータをある種の魔法の詠唱として使用し、それを理解することなく、ハックを待っています。しかし、エスケープはセンスで使用するとまだ解読できません。 –

+0

@Shrapnelあなたはそれを詳しく説明できますか?教育目的のため。 – Repox

+0

すべてのデータを文字列として扱うことができるので、エスケープして引用することができる限り、「ハック待ち」はありません。 "それ以外のものは"準備されたステートメントよりも十分に良いです。一方、一度識別子を挿入しなければ、エスケープ| quotingもプリペアドステートメントもあなたを助けません。 –

0

各入力を1つずつエスケープします。これを全SQL問合せに対して行う場合は、エスケープ後もSQL文が有効であることを確認することはできません。あなたが

("a", "a") 

代わりの

("aaa") 

を受け取ることになります生成されたSQLで、私はエスケープだと思うのは、代わりに

aaa 

ユーザーが

a", "a 

を入力しますと言ってみましょう全体のSQL文は機能しませんそのような状況では

-1

各varをエスケープする長いコードが心配ですが、何らかの理由で関数の目的を忘れてしまいました。

function escape_me($value) { 
    $value = strip_tags($value); 
    $value = mysql_real_escape_string($value); 
    ......... 
} 

$var1 = escape_me($_POST['var1']); 

うまくいけば、あなたは正しい方向を指していることを望みます。

+0

私はescape_me関数を持っています。とにかくありがとう。 –

+1

@Uğurは重大な間違いのような機能を持っています。 –

+0

@ Col.Shrapnel入力をエスケープするのが悪いのはなぜですか?これは単なる例です。 – frustratedtech

1

少し多少のものがありますが、私はそれがとても重要だと感じています。

これは、問題に関する最初の質問ではありません。そして、あなたはまだポイントを取得していないようです。

あなたは本当にmysqlがエスケープされたSQL文字列を受け入れないのですか?

私は恩をお願いしますが、この質問はあなたの主な問題です。
説明を探すのではなく、理解を求める代わりに、何らかの肯定的な答えを求めているだけです。

この質問の結果は、問題の理解に基づいてあなた自身に与えた答えである必要があります。
この場合に限り、それはあなたに良いことをします。
それ以外の場合は、すぐ次のステップに遭遇します。

エスケープ文字列の意味を理解してください。
あなたの質問は、非常に基本的なSQLの知識を持っている人にとっては絶対に意味がありません。
もちろん、このようなクエリ全体のエスケープはうまくいかないでしょう。 SQLクエリの性質のためです。
この性質を理解するためには、が必然的に必要です。 いくつかの本を読んでください。 保証のためではなく、説明を求めてください。

関連する問題