![]() |
![]() ![]() |
![]() |
![]() ![]()
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 |
|
|
![]() ![]()
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.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 677 Pomógł: 11 Dołączył: 18.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
Można zrobić to inaczej. Takiej pomocy jak od ciebie jeszcze nigdy nie otrzymałem (IMG:style_emoticons/default/smile.gif) Dzięki... |
|
|
![]()
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ć?" |
|
|
![]() ![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 677 Pomógł: 11 Dołączył: 18.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
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 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 677 Pomógł: 11 Dołączył: 18.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
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 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 677 Pomógł: 11 Dołączył: 18.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
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.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 7.10.2025 - 05:02 |