Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP]Pętle i wyciąganie zamówień
xaitras
post
Post #1





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


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 (IMG:style_emoticons/default/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Ć(IMG:style_emoticons/default/questionmark.gif) Wiem, że potrzebna jest druga pętla tylko nie wiem jak ją zastosować.

Pomóżcie bo mózg mi się gotuje..

Ten post edytował xaitras 13.11.2017, 10:52:44
Go to the top of the page
+Quote Post
trzczy
post
Post #2





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


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ą.

Ten post edytował trzczy 13.11.2017, 11:09:25
Go to the top of the page
+Quote Post
xaitras
post
Post #3





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


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. }

Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Moze jednak podasz nam dokumentacje tego API?
Go to the top of the page
+Quote Post
xaitras
post
Post #5





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


Proszę uprzejmie (IMG:style_emoticons/default/smile.gif)

https://api.baselinker.com/?method=getOrders
Go to the top of the page
+Quote Post
trzczy
post
Post #6





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


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.

Ten post edytował trzczy 13.11.2017, 12:22:36
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.  
Go to the top of the page
+Quote Post
xaitras
post
Post #8





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


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..
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




trzczy nie przeczytal dokumentacji i wymysla rzeczy, ktore sie maja nijak do ciebie. Podalem ci poprawne rozwiazanie,zgodne z dokumentacja
Go to the top of the page
+Quote Post
xaitras
post
Post #10





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


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. }


Ten post edytował xaitras 13.11.2017, 13:43:37
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
xaitras
post
Post #12





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


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... ?


Ten post edytował xaitras 13.11.2017, 14:33:41
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




$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
Go to the top of the page
+Quote Post
xaitras
post
Post #14





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


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ę.. (IMG:style_emoticons/default/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ę..

Ten post edytował xaitras 13.11.2017, 14:46:33
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
xaitras
post
Post #16





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


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 (IMG:style_emoticons/default/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ś (IMG:style_emoticons/default/questionmark.gif)


Ten post edytował xaitras 13.11.2017, 15:38:11
Go to the top of the page
+Quote Post
nospor
post
Post #17





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/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;
Go to the top of the page
+Quote Post
xaitras
post
Post #18





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


Cytat(nospor @ 13.11.2017, 16:50:14 ) *
oczywiscie ze masz (IMG:style_emoticons/default/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.. (IMG:style_emoticons/default/sad.gif)

Ten post edytował xaitras 13.11.2017, 15:56:51
Go to the top of the page
+Quote Post
nospor
post
Post #19





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




nadal masz
if (count($orders) < 100) {

z jednej strony prosisz o pomoc a jednoczesnie jak ci podadza poprawny kod to go ignorujesz
Go to the top of the page
+Quote Post
xaitras
post
Post #20





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


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 (IMG:style_emoticons/default/smile.gif)

dziękuję za pomoc i cierpliwość
uczę się "w miarę potrzeby" i brakuje mi czasami podstawowej wiedzy (IMG:style_emoticons/default/wink.gif)


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

dziękuję za pomoc i cierpliwość
uczę się "w miarę potrzeby" i brakuje mi czasami podstawowej wiedzy (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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;


Ten post edytował xaitras 13.11.2017, 17:43:55
Go to the top of the page
+Quote Post
nospor
post
Post #21





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Pewnei zamiast zwracac ci zamowienie od daty wyzej to zwraca ci od daty wyzej lub rownej, przez co powtarza po kazdym kroku jedno zamowienie
Go to the top of the page
+Quote Post
xaitras
post
Post #22





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 27.06.2017

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


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 (IMG:style_emoticons/default/smile.gif) dzięki jeszcze raz
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 19.09.2025 - 22:09