0

コードは次のとおりです。

  //check if the starting row variable was passed in the URL or not
  if (!isset($_GET['pg']) or !is_numeric($_GET['pg'])) {
 //we give the value of the starting row to 0 because nothing was found in URL
  $startrow = 0;
//otherwise we take the value from the URL
} else {
$startrow = (int)mysql_real_escape_string($_GET['pg']);
}

mysql_real_escape_string();を追加しようとするときはいつでも。!issetの$ _GET ['pg')に対して、コードは実行されず、エラーメッセージは表示されません。

4

3 に答える 3

2

pg値をintにキャストしないでください。代わりに、整数値が含まれていることを確認するか、クエリを実行しないでください。クエリを実行する予定がなかった場合(これは表示されません)、mysql_real_escape_string()接続が必要なため、これは完全に間違ったツールです。

$_GET['pg']行うべき適切なことは、の内容が整数であることを検証することであり、それをエスケープすることではありません。

is_numeric()は非整数の実数に対してTRUEを返すため、正の整数を検証するために使用する傾向がありますctype_digit()。負の整数の可能性も必要な場合は、次を使用できますctype_digit(abs($_GET['pg']))

if (!isset($_GET['pg']) or !ctype_digit($_GET['pg'])) {
   // it wasn't an integer
   // initialize to your default value
}
else {
  // $_GET['pg'] *has to be a valid int* or we wouldn't have entered the else block
  // no need to escape or further process it - it's safe to use
}
于 2012-04-07T19:55:53.260 に答える
1

0以上の整数値が必要です。入力が無効な場合は0です。

$startrow = max(0, isset($_GET['pg']) ? $_GET['pg'] : 0);

mysql_real_escape_string()整数値には必要ありません。コーディングスタイルによっては、これはPHPでも可能です。

$startrow = max(0, @$_GET['pg']);

PHP 5.4を使用している場合は、非常に優れたパフォーマンスを発揮します。

于 2012-04-07T20:27:59.920 に答える
0

mysql_real_escape_stringにはデータベースへの接続が必要です(2番目のパラメーター)。指定されていない場合は、最後に開いた接続が使用されます。以下を参照してください。

http://php.net/manual/en/function.mysql-real-escape-string.php

コードのこの時点で、データベースへの接続が作成されていない可能性がありますか?その場合、警告が表示されます(php構成で警告の表示が許可されているかどうかを確認してください)

于 2012-04-07T20:00:29.303 に答える