1. PHP / Говнокод #8675

    +165

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    try {
        $newUserId = $users->insert($data);
    } catch (Exception $e) {
        if ($e->getCode() == '23000') {
            $this->customRedirect(
                array(
                    'notice',
                    'User already exists',
                )
            );
            return;
        } else {
            throw new Exception(null, null, $e);
        }
    }

    Быстрая проверка на уникальность.

    Запостил: grudzinsky, 29 Ноября 2011

    Комментарии (13) RSS

    • А как ещё проверить уникальность в момент вставки?
      Ответить
      • Ну а почему бы до вставки не проверить
        Ответить
      • транзакции?
        не, не слышал.
        Ответить
        • А как проверить уникальность в момент вставки используя транзакции?
          Ответить
          • В теории для это нужно чтоб БД умела переключаться на уровень изоляции serializable.
            Ответить
            • ммм... поясните на примере в виде SQL запросов.
              Ответить
    • Если за проверкой идет сразу вставка, то шанс что, кто-то вклинится в этот момент и займет ваш уникальный логин очень маль, и даже если произойдет, то ни чего страшного не случиться, просто отработаете это как обычную ошибку базы данных. А обработка кодов ошибок базы данных на уровне логики приложения чисто бред, по моему скромному мнению.
      Ответить
      • да не, иногда бывает, что нужно по-разному реагировать на ошибку. Если вот как в сабже, была попытка дубля, это один случай, просто показать юзеру сообщение, а если там, скажем, база совсем сдохла - нужно показать совсем другой экран (или, скажем, стартовую страницу).
        и уж лучше по коду, чем вылавливать текст ошибки )
        Ответить
        • Ну тогда хотя бы проверку на код ошибки унести внутрь класса для работы с БД, и оттуда генерировать исключение Not_Unique_Exception, как-то так, ну или на крайний случай 23000 заменить на константу ))
          Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий