Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Numeracja dok a pętla
Randallmaster
post
Post #1





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


Cześć, mam problem z ustaleniem działania funkcjonalności... a mianowicie. w pętli wykonuje pobranie numeru dokumentu, który póżniej zapisuje. Natomiast po zapisaniu dublują mi się numeracja i nie dodaje +1, do ostatniego numeru. Co oznacza że w pętli wszystko dzieje się za szybko i funkcja nie zdąży pobrać aktualnego numeru. Czy muszę spowolnić pętle o 1 sec na sprawdzaniu czy można zrobić to inaczej.

Ten post edytował Randallmaster 15.12.2015, 23:42:21
Go to the top of the page
+Quote Post
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Można zrobić to inaczej.
Go to the top of the page
+Quote Post
Randallmaster
post
Post #3





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


Cytat(darko @ 16.12.2015, 00:30:19 ) *
Można zrobić to inaczej.


Takiej pomocy jak od ciebie jeszcze nigdy nie otrzymałem (IMG:style_emoticons/default/smile.gif) Dzięki...
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Zadałeś pytanie, otrzymałeś bardzo konkretną odpowiedź.

To tak jak ostatnio z życia wzięte: "Przepraszam, chciałem kupić trochę części do auta. Muszę oddać mechanikowi czy można to inaczej zrobić?"
Go to the top of the page
+Quote Post
Randallmaster
post
Post #5





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


  1. //w $data znajduje się lista dokumentów przykładowo 5 wierszy
  2. foreach($data as $r){
  3. $lastNr = getLastNumberDocument(); //w pętli wykonuje pobranie ostatniego numeru dokumentu zapisanego w poprzedniej pętli z $lastNr (zwraca int). funkcja wykona się 5 razy, więc powinno za pierwszym razem pobrać 0 (brak dokumentów), później 1, 2, 3, 4(czyli ostatnie zapisane numery z $lastNr). Na każdym poziomie pętli. Funkcja nie widzi tego co zostało zapisane w pętli poprzedniej ;/
  4.  
  5. //stworzenie następnego numeru dokumentu
  6. $lastNr += 1;
  7.  
  8. //zapis do bazy danych numeru $lastNr
  9. }


Idea jest taka że funkcja getLastNumberDocument() nie widzi tego co zapisuje do bazy danych w pętli czyli za każdym zwraca mi $lastNr = 1. I posiadam wtedy zdublowane dokumenty np. PZ/1, PZ/1, PZ/1, a powinno być PZ/1, PZ/2, PZ/3

Ten post edytował Randallmaster 16.12.2015, 09:01:53
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


A gdzie masz zapisanie do BD?

PHP działa Liniowo (generalnie), więc w Twoim przypadku nie ma mozliwości o jakiej piszesz.

Jedyna możliwość to taka że nie zapisujesz do bazy, ot co.

No i pokaż kod getLastNumberDocument()

Ten post edytował Pyton_000 16.12.2015, 09:02:08
Go to the top of the page
+Quote Post
Randallmaster
post
Post #7





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


  1. //w $data znajduje się lista dokumentów przykładowo 5 wierszy
  2. foreach($data as $r){
  3. $lastNr = getLastNumberDocument(); //w pętli wykonuje pobranie ostatniego numeru dokumentu zapisanego w poprzedniej pętli z $lastNr (zwraca int). funkcja wykona się 5 razy, więc powinno za pierwszym razem pobrać 0 (brak dokumentów), później 1, 2, 3, 4(czyli ostatnie zapisane numery z $lastNr). Na każdym poziomie pętli. Funkcja nie widzi tego co zostało zapisane w pętli poprzedniej ;/
  4.  
  5. //stworzenie następnego numeru dokumentu
  6. $lastNr += 1;
  7.  
  8. //zapis do bazy danych numeru $lastNr
  9. $this->SaveData($lastNr);
  10. }


Zapisuje do bazy. Przykładowo jeżeli będę wykonywał ręcznie pętle po 1 wierszu. Wtedy działa poprawnie. A jeżeli naraz w pętle wrzucę 5 pozycji to ma problem z odczytaniem tego co zapisałem w $this->SaveData
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Dalej nie pokazałeś kodów funkcji.
Ale strzelam że

nie:
Kod
$lastNr = getLastNumberDocument();


a:

Kod
$lastNr = $this->getLastNumberDocument();


Ten post edytował Pyton_000 16.12.2015, 09:12:35
Go to the top of the page
+Quote Post
Randallmaster
post
Post #9





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


Cytat(Pyton_000 @ 16.12.2015, 09:01:48 ) *
No i pokaż kod getLastNumberDocument()


No funkcji mam trochę więcej i pokazanie całego kodu nie ma tu trochę sensu ponieważ działanie funkcji zwraca dane poprawnie, poza tym jeżeli po kolei wykonuje naraz w pętli 5 wierszy to nie widzi tego co w nich zapisywałem. Jeżeli na pętli dam opóźnienie o 1 sec to widzi. Chciałem tym kodem przybliżyć problem. Bo to nie chodzi o kod tylko samo działanie pętli i kolejność wykonywania

Może inaczej.

Jeżeli PHP działa liniowo to czy czeka na odpowiedź zapytania które wysyła do bazy danych, czy leci dalej w przypadku inserta? wygląda na to że puszcza zapis do bazy danych ale nie czeka aż zostanie potwierdzone zapisanie do bazy danych i wykonuje się dalej co skutkuje tym że pętla się wykona a on za każdym razem w funkcji getLastNumberDocument() widzi pustą zwrotkę.

Jest funkcja która zezwala na wykonanie następnej pętli jeżeli podana zmienna np. nie jest pusta?

Problem został rozwiązany. Wynikało to po stronie frameworka cakephp jeżeli widział on że zapytanie w ramach odświeżania było wykonywane to pobierał ten sam wynik.

Ten post edytował Randallmaster 16.12.2015, 09:26:18
Go to the top of the page
+Quote Post
NickOver
post
Post #10





Grupa: Zarejestrowani
Postów: 332
Pomógł: 10
Dołączył: 13.03.2014
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


To o czym mówisz nazywa się "Race Condition". W skrócie, jeśli system pozwala wykonywać wiele operacji jednocześnie które są od siebie w pewien sposób zależne może zdarzyć się tak że coś się wykona szybciej mimo że zostało wywołane później. W Twoim przypadku najpierw leci insert a potem select, ale jeśli select pobierze dane szybciej niż insert je włoży to po prostu ich nie będzie (bo gdy były pobierane nie było ich). KLIK <- link do manuala mysql który trochę może pomóc.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 7.10.2025 - 05:02