Zend_Db Вопрос ... обновление инкрементора - PullRequest
3 голосов
/ 15 мая 2009

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

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

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

1 Ответ

4 голосов
/ 15 мая 2009
$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

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

...