За последние 24 часа нас посетили 23423 программиста и 1602 робота. Сейчас ищут 893 программиста ...

Найти первый свободный id из списка

Тема в разделе "PHP для новичков", создана пользователем SamyRed, 15 май 2016.

  1. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Здравствуйте.
    Вопрос простой и короткий:
    Как правильно найти самый первый свободный id из таблицы БД?
    --- Добавлено ---
    ЗЫ желательно без ополнительных таблиц
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ещё бы знать что это такое
     
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Есть таблица с несколькими колонками, первая из которой id. Если есть свободный элемент (1,2,4,5,6,7), то нужно получить его номер (в данном случае 3)
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @SamyRed, id лучше делать auto_increment
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Куда пропал номер 3?
     
  6. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    id без автоинкремента у меня, но мне надо находить свободные id для удобства. Пользователь должен сам выбирать id
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    просто тогда проверяй, свободный номер или нет
     
  8. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Как? Каким циклом лучше это делать? А то я если сделаю, то любой увидивший этот код скажет "Из какой жопы его родили)"
     
  9. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    это не стандартная задача, по этому выбирай из таблицы какое то количество данных, а точнее только id ну а дальше..
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ну раз пользователь выбирает 5, ты проверяешь, есть ли в базе ID с номером 5 если нету, даёшь пользователю его присвоить себе, если занято, говоришь что занято, пусть выбирает другое.
     
  11. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Не, вы не совсем правильно поняли, Нужно именно рекомендовать пользователю первый свободный id, а не проверять тот что он уже ввёл. Хотя этой идеей я тоже воспользуюсь.
     
  12. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну а что значит рекомендовать, а вдруг пока ты ему "рекомендуешь", его уже займут?
    PS ты сначала обращается к БД получаешь все доступные и ему предлагаешь.
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ну да, об этом не было речи.

    Тогда сделай отдельную таблицу, где будешь записывать свободные диапазоны.
     
  14. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Никто не займёт. Это всё происходит в админпанели, и админ будет только 1, ну или несколько. Так что об этом переживать точно не нужно.
    --- Добавлено ---
    --- Добавлено ---
    Все доступные это 3 и от 11 до бесконечности??
    Длинноватый цикл будет))
     
  15. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    зачем цикл, ты из БД берешь все ID, только ID, начиная с 1 до 1000 допустим и потом уже в РНР при помощи цикла перебираешь, что тут такого.
     
  16. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ну так, а ты сразу сказал "Все доступные")))
    --- Добавлено ---
    Ну да ладно. Сейчас попробую. Спасибо.
    --- Добавлено ---
    Соорудил я вот такую конструкцию:
    Код (PHP):
    1.             if (@mysql_num_rows ($result)){
    2.                 while($date_array = mysql_fetch_array ($result)) {
    3.                      $arr[] = $date_array['id'];
    4.                 }
    5.                 for ($i = 0; $i < count ($arr); $i++){
    6.                     if ($arr[$i + 1] - $arr[$i] > 1){
    7.                         $free_id = $arr[$i];
    8.                         break;
    9.                     }
    10.                 }
    11.             } else $free_id = 1;
    Но вместо свободного она возвращает id тот который перед свободным. А если меняю $free_id = $arr[$i] на $free_id = $arr[$i + 1] то следующий.
     
  17. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @SamyRed, чтобы рекомендовать первый свободный, надо все записи получить, проверить идентификаторы, определить какой самый первый отсутствующий по порядку id потом его рекомендовать. Как - то накладно получается, если у тебя в базе будет очень много записей.
     
  18. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Всё. Нашёл. Я вместо номера свободного ид возвращал тот ид, который уже есть в базе. Всем спасибо. Всё получилось.
    --- Добавлено ---
    В базе бдет порядка 10-ти записей. Так что не накладно)
     
  19. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Меня сейчас закидают гнилыми помидорами, но можно сделать так:
    PHP:
    1. $result = mysqli_query($db, "SELECT 'id' FROM table ORDER BY 'id'");
    2. $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
    3. $i=0;
    4. a:
    5. $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
    6.  
    7. if ($i == $row['id']) {
    8. $i++
    9. goto a;
    10.  } else {
    11. $freeId = $row['id'];
    12. }
    13. // $freeId - первый свободный ID
    Логика, думаю, ясна. Можешь реализовать по своему. Не знал как выйти из цикла, поэтому написал ручной цикл...
     
  20. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Давно я goto не видел)))
    --- Добавлено ---
    Вернее ни разу не видел))))
    --- Добавлено ---
    Колонки таблицы, вроде, выделяются знаками ``. а '' это для значений.
     
  21. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    да я вообще не знаю как использовать goto
     
  22. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    @TeslaFeo, в твоём случае вместо goto нормально использовать while
     
  23. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Так его все и используют) Зачем вообще этот goto нужен?
     
  24. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    @mr.akv это не мой случай.
    Лучше объясните чем плох goto?
    О нем я узнал еще в QBasic и Turbo Pascal. Но что в нём такого плохого и смешного - вообще не понимаю...

    З,Ы,
    как всё предсказуемо...
     
  25. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    @TeslaFeo, представь, какая каша в коде может получиться, если использовать goto в больших программах?)