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

    +167

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    ...
    $query = "INSERT INTO `test`.`users` (`id` ,`email` ,`password` ,`nick` ,`sex` ,`date_birth` ,`about`) VALUES(NULL,'$email','$password','$nick','$sex','$dataBirth','$about')";
    $db->query($query);
    
    $query = "SELECT `id` FROM `users` WHERE `email` = '$email' AND `password` = '$password'";
    $result = $db->select($query);
    ...

    теперь так определяется ключ, вставленный автоинкрементом

    Запостил: rtfm, 03 Ноября 2010

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

    • > теперь так определяется ключ, вставленный автоинкрементом

      к слову. а как он правильно определяется? в те времена когда я активно БД мучал (~8-10 лет назад), по другому на чистом SQL было никак.
      Ответить
      • На чистом SQL - к сожалению, никак.
        В данном же случае нужно воспользоваться методом mysql_insert_id интерфейса для взаимодействия с MySQL.
        В PHP подобные методы есть во всех (или почти во всех) интерфейсах для взаимодействия с СУБД.
        Ответить
        • подобный метод в похапе может возвращать неправильное значение в случае очень большого id.
          Лучше через мускул...
          Ответить
        • сеньксь. бум держать в уме.
          Ответить
      • почти в любой бд есть LAST_INSERT_ID() или @@IDENTITY
        Ответить
    • id можно получать и перед вставкой, например в postgresql используются sequence для получения уникального значения ключа, но к ним можно обращаться и напрямую, в мускуле можно их самому реализовать, благо их реализация не очень сложна. Но кому как удобней, имхо
      Ответить
      • получение значения перед вставкой - плохое решение.
        в нагруженных системах, между этими двумя обращения sequence может измениться сотню раз.
        Ответить
        • Так мне уже будет все равно, когда я беру значения из sequnce, то он автоматически увеличивается, к sequence я обращаюсь один раз перед вставкой , потом он меня больше не интересует.

          к примеру для postgresql ,
          Есть sequence table_id_seq пусть текущее значение в нем 5
          идет запрос на вставку
          Абстрактный код:
          $id = select nextval('table_id_seq'); # id будет равен 6
          insert into table(id,name) value($id,$value);

          Если следом идет еще один запрос на вставку то он получит уже значение 7, но нам будет уже все равно
          Ответить
          • в принципе, да.
            я забыл про возможность увеличения sequence при получения значения.
            а что будет есть запрос на вставку не пройдет? например, из-за невалидности данных или синтаксической ошибке в запросе. sequence будет делать много "пропусков", что тоже не хорошо.

            не лучше ли получать реальный номер ПК уже после вставки?
            Ответить
            • Ну мне кажется что это не проблема, запас значений у него достаточно большой, так что должно на всех хватить.
              А то что в базе будет идти 1 а потом сразу 10 id , как мне кажется тоже не является проблемой.

              Также по-идее невалидность данных должна быть проверена до вставки , не говоря уж о синтаксической ошибке в запросе, и то что запрос не пройдет является скорее исключением ,а не правилом, так что в общем случае столбец id будет идти у вас дружным слитным и радующим глаз рядом )
              Ответить
        • Думаю возможно такое реализовать и на mysql используя транзакции, хотя mysql использую редко и могу ошибаться
          Ответить

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