2011-11-21 10 views
5

親愛なるすべて。整数をサニタイズするときのintval&real_escape_stringの使用

私はmysqlデータベースのいくつかのテーブルで整数のPKを使用しています。 PHPスクリプトから入力する前に、私はintval($ id)と$ mysqli-> real_escape_string()を含むいくつかのサニタイズを行っています。 $のみINTVAL() 'EDであることSUPPLIER_IDながら

クエリはこの例では

insert into `tblproducts`(`supplier_id`,`description`) values('$supplier_id','$description') 

非常に簡単です、$の説明は、real_escape_string()を通過します。

私はちょっと不思議ですが、状況がある場合、intvalとreal_escape_stringの両方を整数に適用する必要があるときにDBに挿入していますか?だから基本的に私は本当に使用する必要がありますか?

$supplier_id = intval($mysqli->real_escape_string($supplier_id)); 

ありがとうございます。

+3

用意されたステートメントを利用する場合は、サニタイズとデータ型の保護に余計な労力を費やすことになります。とても簡単です。 – mario

+0

ご意見ありがとうございます。もともと、DBクラスはprep文なしで開発されていたので、基礎クラスをリファクタリングし、同時に作業インフラストラクチャを破壊する必要はありません。だから、あなたが言及した理由のためにprep文に切り替えることを検討していますが、すぐにはありません:) – paulus

+0

さらに、prep文は、私が知っている限り、一般的にはそうではありません私の状況。ですから、基本的にprep文に切り替えると、コードの量が大幅に減少することはありません。>したがって、可読性とパフォーマンスの低下も問題になります。私の意見では、prepare => bind => executeよりも、時折intおよびreal_escape_stringsを実行するほうが速くなります。私の場合、ゼロからコードを書き直すことを意味するすべてのクエリを処理する、ある種のスーパーメタDBクラスを開発しない限り。 – paulus

答えて

9

intvalreal_escape_stringは、データベースに接続し、charset/collat​​ionに基づいてエスケープする必要があるため、real_escape_stringより高速です。

1

あなたは変数にINTVALを実行した後real_escape_string $ mysqli->を使用する必要はありませんサニタイズ倍増することが

$val = (int)$val; 

必要はありません:

はあなたも同じようint型にキャストすることができます。 intval()は、整数でない場合は0を返し、整数の場合は値を返します。

Example: 
$variable = '5'; 
$variable2 = 'c5b'; 
if(intval($variable)) echo 'It is a variable'; # intval will return 5 or true 
if(intval($variable2)) echo 'It is a variable'; # intval will return 0 or false since it has a letter 

+1

intval($ variable2)は5を返しません0 – Derek

+0

私はそれが時折0を返し、他の回が5を返すようにしたので、答えを更新し、下に追加しました –

+0

今あなたは正しいです! – Derek

0

はこのような何か考えてみましょう「図5b」に設定されている場合INTVALは文字列の最初の整数を返します。いくつかの例があります:intval()を使用して

$x = "50 O'Brien Family Members at a Bar"; 

はあなたを与えるだろう「エスケープ」値は

50 

ですが、real_escape_stringはyあなたが本当にクエリで文字列値を使用したくない場所のOU

50 O\'Brien Family Members at a Bar 

real_escape_ STRINGは()のみを使用する必要があります。それ以外の場合は、より適切なツールを使用してください。

関連する問題