17

次のコードがあります。

function dbPublish($status)
{
 global $dbcon, $dbtable;

 if(isset($_GET['itemId']))
 {
  $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';
  $stmt = $dbcon->prepare($sqlQuery);
  $stmt->bind_param('ii', $status, $_GET['itemId']);
  $stmt->execute();
  $stmt->close();
 }
}

この場合、mysql_real_escape_string が必要ですか、それとも大丈夫ですか?

4

3 に答える 3

30

いいえ、値を自分でエスケープする必要はありません (つまり、を呼び出す必要はありませんmysqli_real_escape_string)。準備済みステートメントを使用している場合: DB エンジンがそれ自体を行います。

(実際には、mysql_real_escape_stringバインドされたパラメーターを呼び出して使用すると、文字列が 2 回エスケープされます。これは良くありません。どこでも文字をエスケープすることになります...)


補足として: 値は( で示されるように'ii') 整数として渡されるため、準備済みステートメントを使用していなくても、 を呼び出すmysql_real_escape_string必要はありません: その名前が示すように、この関数はエスケープするために使用されます... 文字列.

整数については、通常intval、SQL クエリに挿入するデータが実際に整数であることを確認するために使用します。

(ただし、準備されたクエリを使用しているため、そのようなエスケープを自分で行う必要はありません)

于 2010-02-17T20:55:32.483 に答える
1

いいえ、いけません。2 つを組み合わせると、目に見えるエスケープ文字がデータに表示されます。

于 2010-02-17T20:57:11.347 に答える
0
function dbPublish($status)    
{    
 global $dbcon, $dbtable;    

 if(isset($_GET['itemId']))    
 {    
  $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';    
  $stmt = $dbcon->prepare($sqlQuery);    
  $stmt->bind_param('ii', $status, $_GET['itemId']);    
  $stmt->execute();    
  $stmt->close();    
 }    
}   
于 2010-03-25T01:39:02.323 に答える