• 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

0 głosów
437 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 (607,960 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 (291,530 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ź 567 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ź 412 wizyt
pytanie zadane 9 października 2020 w PHP przez Dariusz Hozer Użytkownik (920 p.)
0 głosów
1 odpowiedź 705 wizyt
pytanie zadane 23 listopada 2018 w PHP przez progNewbie Obywatel (1,130 p.)

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,328 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...