3

これは機能するはずですか?(ログイン数を増やしますか?)

// update the login count
$data = array(
   'logins' => 'logins + 1'
);

$n = $db->update('users', $data, 'user_id = '.$_userId);    
4

1 に答える 1

4
$data = array(
   'logins' => new Zend_Db_Expr('logins + 1')
);

また、引用符を使用して、SQL インジェクションに対して脆弱にならないようにします。

$n = $db->update('users', $data, $db->quoteInto('user_id = ?', $_userId));

再コメント: はい。update() メソッドの場合、Zend_Db_Expr 型のオブジェクトを使用しない限り、リテラル値を送信していると見なされます。これを自分でテストできます:

$db->getProfiler()->setEnabled(true);
$n = $db->update('users', $data, $db->quoteInto('user_id = ?', $_userId));
$qp = $db->getProfiler()->getLastQueryProfile();
echo $qp->getQuery() . "\n";

配列で指定したリテラル値はすべて$dataパラメーター化されるため、クエリは次のようになります。

UPDATE `users` SET `login` = ? WHERE user_id = 123

クラス Zend_Db_Expr のオブジェクトを使用すると、パラメーター化する代わりに、文字列を文字通りクエリに挿入することが認識されます。

UPDATE `users` SET `login` = NOW() WHERE user_id = 123

このように式を補間する場合は、セキュリティの脆弱性が発生しないように検証する必要があることに注意してください。

于 2009-05-15T18:57:49.233 に答える