Zend_Db Вопрос об обновлении инкремента

Должно ли это работать? (увеличить количество входов в систему?)

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

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

person MichaelICE    schedule 15.05.2009    source источник


Ответы (1)


$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

Обратите внимание, что когда вы интерполируете такие выражения, вы несете ответственность за проверку, поэтому вы не получаете уязвимостей безопасности.

person Bill Karwin    schedule 15.05.2009
comment
Будет ли то же самое для 'Now()'? - person MichaelICE; 15.05.2009