Zend_Db_Table: Что происходит, когда вставка приводит к ошибке? - PullRequest
1 голос
/ 17 апреля 2009

Вероятно, на этот вопрос легко ответить, но я не вижу его в документации ...

Что происходит, когда вставка приводит к ошибке? Выдается ли исключение? Какой тип? Я пытаюсь понять, что произойдет при попытке вставить повторяющиеся данные в уникальный столбец.

Так что я чувствую, что мне нужно сначала проверить ...

protected function _emailAlreadySubscribed($email)
{
    $select = $this->_model->select()->where('email = ?', $email);
    $rows = $table->fetchAll($select);
    if ($rows->count()) {
        return true;
    }
    return false;
}

Это правильный способ проверки?

Ответы [ 3 ]

3 голосов
/ 17 апреля 2009

Нет, проверка того, существует ли уже электронная почта, является , а не допустимым решением. Кто-то еще может вставить повторяющееся значение после вашей проверки, но до вашей INSERT. Единственное решение - заблокировать всю таблицу.

Когда вы нарушаете уникальный ключ в Zend_Db_Table::insert(), выдается Zend_Db_Statement_Exception (или его подкласс).

См. Также Вставка MySQL: сначала проверить?

2 голосов
/ 18 июля 2009

Я играл с Zend Framework, чтобы попытаться обнаружить исключения БД и обработать их. К сожалению, как только вы поймали исключение, метод getCode () всегда возвращает «0», поэтому я использовал следующий код для проверки на наличие дубликатов:

try { 
    $model->insert($data);
    $added++; 
} catch (Zend_Db_Exception $e) {
    if(strstr($e->getMessage(), '1062 Duplicate')) {
        // duplicate
        $duplicates++;
    } else {
        // general error
        $errors++;
    }
}

Не самый изящный код, который я знаю, поэтому, если кто-то знает, как лучше обрабатывать эти исключения, или имеет ссылку на код исключения, пожалуйста, добавьте!

0 голосов
/ 18 апреля 2009

Для вставок я проверяю, чтобы в моей таблице БД были правильные индексы (в данном случае это уникальный индекс для emailAddress), а затем я просто упаковываю свою вставку в блок try / catch.

Я позволю БД сказать мне, если это обман, а не проверять сначала.

Вставка будет выдавать исключения при сбое базы данных. Затем вы можете проверить причину сбоя базы данных, используя исключение, и отобразить соответствующий обмен сообщениями для вашего пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...