• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pętla sprawdzająca istnienie nie działa prawidłowo

Object Storage Arubacloud
0 głosów
151 wizyt
pytanie zadane 5 sierpnia 2020 w PHP przez Renzov Obywatel (1,220 p.)

Cześć wszystkim,

Mam pewien problem z pętlą do sprawdza czy dany record istnieje. Napisałem kod do generowania "unikalnego" id. Działa on na zasadzie, że pobiera aktualny czas w formarcie "ymdhis". Aby zabezpieczyć przed duplikatami, do kodu jest dodawana liczba "10" a następnie cały ciąg jest wysyłany i jest sprawdzane czy istnieje. Jeśli tak, to 10 przechodzi inkrementację i ponownie jest sprawdzane do czasu, aż nie będzie istniał rekord z takim ciągiem znaków.

Problem polega na tym, że pętla dodaje jeden rekord z datą i doczepiony ciągiem "100"

      $ref = new DateTime();
      $refFormated = $ref->format('ymdhis');

      $i = 9;
      do {

        $i++;
        $check = UsersPayments::where('reference', $refFormated . $i)->exists();

      } while ($check || $i < 100);

      $payment = UsersPayments::create([
        'reference'   => $refFormated . $i,
      ]);

 

2 odpowiedzi

0 głosów
odpowiedź 5 sierpnia 2020 przez Comandeer Guru (601,110 p.)
wybrane 13 sierpnia 2020 przez Renzov
 
Najlepsza

Tak skonstruowany warunek będzie prawdą nawet wówczas, gdy w bazie nie ma takiego identyfikatora. Przy OR najpierw jest sprawdzana wartość z lewej. Jeśli jest true, całość jest prawdziwa. Jeśli jest false, to drugi warunek decyduje o tym, czy całość zostanie uznana za prawdziwą. Tym sposobem dopóki i < 100, warunek zawsze zwróci true. Dopiero, gdy i będzie równe 100, obydwie części warunku zwrócą false i całość również będzie uznana za fałszywą.

Swoją drogą czemu nie użyjesz UUID?

0 głosów
odpowiedź 5 sierpnia 2020 przez Arkadiusz Waluk Ekspert (287,950 p.)
Spójrz na warunek w pętli. Masz tam że iteracja wykona się, gdy $check będzie true lub $i będzie mniejsze niż 100. Skoro $i to początkowo 9, a za każdym przejściem zwiększa się o 1, no to do 100 trochę brakuje. W związku z tym nawet jeśli $check Ci się nie spełni, to $i < 100 się spełni, dlatego pętla dochodzi aż do końca, gdy $check nie jest true ani $i nie jest mniejsze od 100 (bo ma wtedy 100).

Podobne pytania

–1 głos
1 odpowiedź 324 wizyt
pytanie zadane 14 października 2020 w C i C++ przez Wacław Sierpiński Początkujący (350 p.)
0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 9 października 2020 w PHP przez Dariusz Hozer Użytkownik (920 p.)
0 głosów
1 odpowiedź 235 wizyt
pytanie zadane 23 listopada 2018 w PHP przez progNewbie Obywatel (1,130 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...