$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
Обратите внимание, что когда вы интерполируете подобные выражения, вы несете ответственность за проверку, поэтому вы не получаете уязвимостей в безопасности.