Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pętle i wyciąganie zamówień
Forum PHP.pl > Forum > Przedszkole
xaitras
Witam wszystkich

Już dawno nie potrzebowałem pomocy ale znowu poległem.
Myślę, że to dla was prosta sprawa ale dla mnie pętle to czasami czarna magia smile.gif

Opiszę najpierw problem:

Mam zbiór zamówień które wyciągam przez API (format danych json) - ale to ma mniejsze znaczenie.
Problem w tym, że jednorazowo mogę pobrać tylko 100 zamówień.
Próbuję na razie na prostym liczniku:

  1. include_once('funkcje.php');
  2. polacz_bl_przelewy();
  3. $counter = 0;
  4. foreach($dane['orders'] as $orders) {
  5. $nr_zam = $orders['order_id'];
  6. $counter++;
  7. }
  8. echo $counter;


Ale w takiej postaci liczy tylko do 100.
Za każdym razem kiedy łączę się z API musiałbym podać nowy numer zamówienia na którym skończył liczyć (taka opcja w api istnieje).
Teraz pytanie:

JAK TO ZROBIĆquestionmark.gif Wiem, że potrzebna jest druga pętla tylko nie wiem jak ją zastosować.

Pomóżcie bo mózg mi się gotuje..
trzczy
Nic nie rozumiem z twego kodu. Może napisz
jak wygląda zamówienie pierwszej setki,
potem napisz jak wygląda zamówienie drugiej setki,
potem napisz jak wygląda zamówienie trzeciej setki.

Być może wtedy widoczna będzie jakaś reguła, która pozwoli wymyślić pętlę automatyczną.
xaitras
Ok, trochę to jest skomplikowane ale postaram się:

- kod który pokazałem jest w stanie policzyć tylko 100 pozycji bo na więcej nie pozwala API.

- oryginalnie schemat pobierania jest taki:

1. Ustalenie początkowej daty i podanie jej w polu date_confirmed_from
2. Przetworzenie wszystkich odebranych zamówień. Jeśli odebrano 100 zamówień, oznacza to, że do pobrania może być ich jeszcze więcej.
3. Pobranie kolejnej paczki zamówień, podając w polu date_confirmed_from wartość z date_confirmed ostatnio pobranego zamówienia. Operacja powtarzana aż do otrzymania paczki z ilością zamówień mniejszą niż 100 (oznacza to że nie ma więcej zamówień do pobrania).
4. Zapisanie date_confirmed ostatnio przetworzonego zamówienia. Kolejne pobranie zamówień można wykonać od tej daty, aby nie pobierać dwukrotnie tych samych

Jednak istnieje też możliwość podania numeru zamówienia zamiast daty ("order_id").

Trzeba podawać ostatni otrzymany numer czyli: 100,200,300 itd. Podaje się go w parametrach połączenia.


- potrzebuję pętli która będzie wyciągać zamówienia po 100 aż do momentu kiedy osiągnie 0


Kod do połączenia z api:

  1. function polacz()
  2. {
  3. global $zam;
  4. $params = array ('token' => 'xxxxx','method' => 'getOrders','parameters' => '{"order_id": '.$zam.',"status_id": 40196, "get_unconfirmed_orders": true}');
  5. $query = http_build_query ($params);
  6. $contextData = array ('method' => 'POST','header' => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($query)."\r\n"."User-Agent:MyAgent/1.0\r\n",'content'=> $query );
  7. $context = stream_context_create (array ( 'http' => $contextData ));
  8. $result = file_get_contents ('https://xxx/xxx.php', false, $context);
  9. global $dane;
  10. $dane = json_decode($result, true);
  11. return $dane;
  12. }

nospor
Moze jednak podasz nam dokumentacje tego API?
xaitras
Proszę uprzejmie smile.gif

https://api.baselinker.com/?method=getOrders
trzczy
Cytat(xaitras @ 13.11.2017, 11:37:06 ) *
Trzeba podawać ostatni otrzymany numer czyli: 100,200,300 itd. Podaje się go w parametrach połączenia.
No to jak ten numer, np. 100, dodać tu do parametrów?
  1. $params = array ('token' => 'xxxxx','method' => 'getOrders','parameters' => '{"order_id": '.$zam.',"status_id": 40196, "get_unconfirmed_orders": true}');


Jak se odpowiesz na to pytanie, to napisz funkcję pobierającą w zależności od tego numeru:
  1. function getData($number) {
  2. //...
  3. }


Potem napisz pętlę for:
  1. for($i=0; $i<$total;$i=$i + 100) {
  2. //...
  3. getData($i);
  4. //...
  5. }

Wartość $total wyciągasz wcześniej za pomącą API, bo powinno to być w API.
nospor
No masz podany algorytm jak to masz robic. Zapisujesz date ostatniego i lecisz dalej. W czym problem? Gdy liczba zwroconych rekordow mniejsza od 100 to wychodzisz z petli

  1. $lastDate = null;
  2. while (true) {
  3. //pobierz paczke
  4.  
  5. if (count($daneZPaczki) < 100) {
  6. break;
  7. }
  8.  
  9. $lastDate = 'tu zapisz date ostatniego';
  10.  
  11. }
  12.  
xaitras
Cytat(trzczy @ 13.11.2017, 13:18:50 ) *
No to jak ten numer, np. 100, dodać tu do parametrów?
  1. $params = array ('token' => 'xxxxx','method' => 'getOrders','parameters' => '{"order_id": '.$zam.',"status_id": 40196, "get_unconfirmed_orders": true}');


Jak se odpowiesz na to pytanie, to napisz funkcję pobierającą w zależności od tego numeru:
  1. function getData($number) {
  2. //...
  3. }


Potem napisz pętlę for:
  1. for($i=0; $i<$total;$i=$i + 100) {
  2. //...
  3. getData($i);
  4. //...
  5. }

Wartość $total wyciągasz wcześniej za pomącą API, bo powinno to być w API.


No problem w tym że w tablicy nie znalazłem informacji na temat liczby zapisanych zamówień. Z takim parametrem byłoby łatwiej.
Nie wiem jak wyciągnąć ilość zamówień w danym statusie..
nospor
trzczy nie przeczytal dokumentacji i wymysla rzeczy, ktore sie maja nijak do ciebie. Podalem ci poprawne rozwiazanie,zgodne z dokumentacja
xaitras
Cytat(nospor @ 13.11.2017, 14:24:36 ) *
trzczy nie przeczytal dokumentacji i wymysla rzeczy, ktore sie maja nijak do ciebie. Podalem ci poprawne rozwiazanie,zgodne z dokumentacja


Wcześniej próbowałem z datą. Mój problem polega na tym, że pobieram też zamówienia które nie są potwierdzone a to koliduje z tą metodą.
Dlatego chciałem pobierać je po numerze 'order_id'

Siedzę nad tym już trochę czasu i wszystko mi się miesza.

Mógłbyś mi podpowiedzieć jak policzyć wszystkie zamówienia znajdujące się w danym statusie?
Potem już sobie poradzę z pobieraniem zamówień itd.

Żeby było jasne,nie chcę gotowego skryptu.. Niejasny jest dla mnie fragment kodu:

  1. while (true) {
  2. //pobierz paczke


wcześniej miałem:

  1. foreach($dane['orders'] as $orders) {
  2. $zam = $orders['order_id'];
  3. }
nospor
Cytat
Wcześniej próbowałem z datą. Mój problem polega na tym, że pobieram też zamówienia które nie są potwierdzone a to koliduje z tą metodą.
Dlatego chciałem pobierać je po numerze 'order_id'

Nic nie koliduje. Poprostu zamiast
date_confirmed_from
dajesz
date_from
xaitras
ok w funkcji do połączenia mam coś takiego:

  1. function polacz_bl_przeniesione_spec()
  2. {
  3. global $lastDate;
  4. $params7 = array ('token' => 'xxxx','method' => 'getOrders','parameters' => '{"status_id": 40196, "date_from": '.$lastDate.',"get_unconfirmed_orders": true}');
  5. $query7 = http_build_query ($params7);
  6. $contextData7 = array ('method' => 'POST','header' => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($query7)."\r\n"."User-Agent:MyAgent/1.0\r\n",'content'=> $query7 );
  7. $context7 = stream_context_create (array ( 'http' => $contextData7 ));
  8. $result7 = file_get_contents ('https://api.baselinker.com/connector.php', false, $context7);
  9. global $dane7;
  10. $dane7 = json_decode($result7, true);
  11. return $dane7;
  12. }




A próbuję pobierać tak:


  1. include_once('funkcje.php');
  2. $zam = 0;
  3. $lastDate = 0;
  4. while (true) {
  5.  
  6. polacz_bl_przeniesione_spec();
  7. foreach($dane7['orders'] as $orders) {
  8. $zam = $orders['order_id'];
  9. $data = $orders['date_from'];
  10. echo $zam."<br>";
  11. }
  12.  
  13. if (count($zam) < 100) {
  14. break;
  15. }
  16.  
  17. $lastDate = $data;
  18.  
  19. }



efekt:

Notice: Undefined index: date_from in C:\WebServ\httpd\PANEL\test.php on line 12
21406605

Notice: Undefined index: date_from in C:\WebServ\httpd\PANEL\test.php on line 12
21413239

Notice: Undefined index: date_from in C:\WebServ\httpd\PANEL\test.php on line 12
21422195

Notice: Undefined index: date_from in C:\WebServ\httpd\PANEL\test.php on line 12
21422499


itd.


zmieniłem

  1. $data = $orders['date_from'];


na

  1. $data = $orders['date_add'];


pobiera ale tylko 100 szt. jak pobrać następne i następne... ?
nospor
$zam = $orders['order_id'];
if (count($zam) < 100) {

Naprawde nie widzisz tu bledu?

poza tym date masz przekazac do polacz_bl_przeniesione_spec() jako parametr
xaitras
Cytat(nospor @ 13.11.2017, 15:36:51 ) *
$zam = $orders['order_id'];
if (count($zam) < 100) {

Naprawde nie widzisz tu bledu?

poza tym date masz przekazac do polacz_bl_przeniesione_spec() jako parametr



Może faktycznie już nie dowidzę.. smile.gif
Ale wierz mi próbuję na wszystkie sposoby..

Datę przekazuję do parametrów połączenia:

  1. $lastDate = $data;


a w połączeniu:

  1. 'parameters' => '{"status_id": 40196, "date_from": '.$lastDate.',"get_unconfirmed_orders": true}'


Podpowiesz co robię źle? Pętle to nie jest moja mocna strona..
Z resztą sobie radzę..
nospor
Cytat
Z resztą sobie radzę..

No wlasnie nie bardzo....:
nie wiesz co to parametr funkcji
nie wiesz na czym robi sie count(), nawet jak ci palcem wytkna
Obie te rzeczy nie zaliczaja sie do petli wiec nie tylko z petlami sobie nie radzisz wink.gif
xaitras
Cytat(nospor @ 13.11.2017, 16:16:35 ) *
No wlasnie nie bardzo....:
nie wiesz co to parametr funkcji
nie wiesz na czym robi sie count(), nawet jak ci palcem wytkna
Obie te rzeczy nie zaliczaja sie do petli wiec nie tylko z petlami sobie nie radzisz wink.gif



Zgadzam się z tobą i właśnie po to jest forum i ten dział żeby się czegoś nauczyć.. mam rację?

ok zróbmy to bez funkcji:

  1. $zam = '0';
  2. $lastDate ='0';
  3.  
  4. while (true) {
  5.  
  6. $params7 = array ('token' => 'xxxxx','method' => 'getOrders','parameters' => '{"status_id": 40196, "date_from": '.$lastDate.',"get_unconfirmed_orders": true}');
  7. $query7 = http_build_query ($params7);
  8. $contextData7 = array ('method' => 'POST','header' => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($query7)."\r\n"."User-Agent:MyAgent/1.0\r\n",'content'=> $query7 );
  9. $context7 = stream_context_create (array ( 'http' => $contextData7 ));
  10. $result7 = file_get_contents ('https://api.baselinker.com/connector.php', false, $context7);
  11. $dane7 = json_decode($result7, true);
  12.  
  13.  
  14. foreach($dane7['orders'] as $orders) {
  15. $zam = $orders['order_id'];
  16. $data = $orders['date_add'];
  17. echo $zam."<br>";
  18. }
  19.  
  20. if (count($orders) < 100) {
  21. break;
  22. }
  23.  
  24. $lastDate = '$data';
  25. }




Pomoże ktoś questionmark.gif
nospor
Cytat
Zgadzam się z tobą i właśnie po to jest forum i ten dział żeby się czegoś nauczyć.. mam rację?
oczywiscie ze masz smile.gif Chcialem jedynie cie poprawic, bo napisales ze tylko z petlami sobie nie radzisz. Chcialem cie nakierunkowac ze pare innych rzeczy tez nie ogarniasz.

Skoro juz to wyjasnilismy sobie, to teraz zajrzyj do manuala i poczytaja o parametrach funkcji. Date masz przekazac jako parametr funkcji

Co do count() to masz zliczyc zdaje sie liczbe zamowien a nie liczbe elementow w zamowieniu

wiec nie:
if (count($orders) < 100) {

a (wg ostatniego kodu co wrzuciles)
if (count($dane7['orders']) < 100) {

bo zdaje sie w $dane7['orders'] masz zamowienia, co nie?

edit:
no i to:

$lastDate = '$data';

No to juz naprawde podstawy podstaw niemajace z petlami zadnego zwiazku :/ Tak ma byc
$lastDate = $data;
xaitras
Cytat(nospor @ 13.11.2017, 16:50:14 ) *
oczywiscie ze masz smile.gif Chcialem jedynie cie poprawic, bo napisales ze tylko z petlami sobie nie radzisz. Chcialem cie nakierunkowac ze pare innych rzeczy tez nie ogarniasz.

Skoro juz to wyjasnilismy sobie, to teraz zajrzyj do manuala i poczytaja o parametrach funkcji. Date masz przekazac jako parametr funkcji

Co do count() to masz zliczyc zdaje sie liczbe zamowien a nie liczbe elementow w zamowieniu

wiec nie:
if (count($orders) < 100) {

a (wg ostatniego kodu co wrzuciles)
if (count($dane7['orders']) < 100) {

bo zdaje sie w $dane7['orders'] masz zamowienia, co nie?

edit:
no i to:

$lastDate = '$data';

No to juz naprawde podstawy podstaw niemajace z petlami zadnego zwiazku :/ Tak ma byc
$lastDate = $data;




  1. include("funkcje.php");
  2.  
  3. $zam = '0';
  4. $lastDate ='0';
  5.  
  6. while (true) {
  7.  
  8. polacz_bl_przeniesione_spec($lastDate);
  9. foreach($dane7['orders'] as $orders) {
  10. $zam = $orders['order_id'];
  11. $data = $orders['date_add'];
  12. echo $zam."<br>";
  13. }
  14.  
  15. if (count($orders) < 100) {
  16. break;
  17. }
  18.  
  19. $lastDate = $data;
  20.  
  21. }



w połączeniu:

  1. function polacz_bl_przeniesione_spec(&$lastDate)
  2. {
  3. global $lastDate;
  4. $params7 = array ('token' => 'xxxxxx','method' => 'getOrders','parameters' => '{"status_id": 40196, "date_from": '.$lastDate.',"get_unconfirmed_orders": true}');
  5. $query7 = http_build_query ($params7);
  6. $contextData7 = array ('method' => 'POST','header' => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($query7)."\r\n"."User-Agent:MyAgent/1.0\r\n",'content'=> $query7 );
  7. $context7 = stream_context_create (array ( 'http' => $contextData7 ));
  8. $result7 = file_get_contents ('https://api.baselinker.com/connector.php', false, $context7);
  9. global $dane7;
  10. $dane7 = json_decode($result7, true);
  11. return $dane7;
  12. }


Z tą zmienną $data próbowałem i tak i tak. Z $orders też.. W każdym przypadku nie wiem dlaczego z każdym wykonaniem pętli nie pobierają się kolejne zamówienia.. sad.gif
nospor
nadal masz
if (count($orders) < 100) {

z jednej strony prosisz o pomoc a jednoczesnie jak ci podadza poprawny kod to go ignorujesz
xaitras
Cytat(nospor @ 13.11.2017, 16:01:38 ) *
nadal masz
if (count($orders) < 100) {

z jednej strony prosisz o pomoc a jednoczesnie jak ci podadza poprawny kod to go ignorujesz


no i wymodziłem smile.gif

dziękuję za pomoc i cierpliwość
uczę się "w miarę potrzeby" i brakuje mi czasami podstawowej wiedzy wink.gif


Cytat(xaitras @ 13.11.2017, 17:09:12 ) *
no i wymodziłem smile.gif

dziękuję za pomoc i cierpliwość
uczę się "w miarę potrzeby" i brakuje mi czasami podstawowej wiedzy wink.gif


Mam jeszcze drobny kłopot. Jeśli ilość zamówień nie przekracza sto to licznik liczy mi poprawnie a
jeśli przekroczy setkę to zlicza o 1 zamówienie więcej. Generalnie co setkę dolicza dodatkowe zamówienie.. nie wiadomo skąd smile.gif

Kod:

  1. include("funkcje.php");
  2. $counter=0;
  3. $zam = '0';
  4. $lastDate ='0';
  5.  
  6. while (true) {
  7.  
  8. polacz_bl_przeniesione_spec($lastDate);
  9. foreach($dane7['orders'] as $orders) {
  10. $zam = $orders['order_id'];
  11. $data = $orders['date_add'];
  12. $counter++;
  13. }
  14.  
  15.  
  16. if (count($dane7['orders']) < 100) {
  17. break;
  18. }
  19.  
  20. $lastDate = $data;
  21.  
  22. }
  23. echo $counter;
nospor
Pewnei zamiast zwracac ci zamowienie od daty wyzej to zwraca ci od daty wyzej lub rownej, przez co powtarza po kazdym kroku jedno zamowienie
xaitras
Cytat(nospor @ 13.11.2017, 17:42:34 ) *
Pewnei zamiast zwracac ci zamowienie od daty wyzej to zwraca ci od daty wyzej lub rownej, przez co powtarza po kazdym kroku jedno zamowienie


dodałem $data++ i jest git smile.gif dzięki jeszcze raz
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.