Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Pobiera id do warunku if
Forum PHP.pl > Forum > Przedszkole
szuki
Witam, mam jeszcze jeden problem. Wydaje mi się, że ten może być nieco bardziej skomplikowany. Mam trzy działające warunki:

  1. $idaukcji = $c[0];
  2.  
  3. $sprawdzbaze = mysql_query("select * from sold where id_auction='$idaukcji'");
  4.  
  5. if (mysql_num_rows($sprawdzbaze) > 0) {
  6. while ($row3 = mysql_fetch_array($sprawdzbaze)){
  7.  
  8. if($row3["id_auction"] === $c[0] && $row3["count"] === $c[5] && $row3["login"] === $c[2] && $row3["date"] === $unixtime_to_date){
  9. echo "Nic nie zrobiłem.</br>";
  10. }
  11.  
  12. else if($row3["id_auction"] === $c[0] && $row3["login"] !== $c[2]){
  13.  
  14. echo "Dodałem brakujące elementy z danej oferty</br>";
  15. $import = "INSERT INTO sold (id_auction,count,login,date) values('$Auction','$c[5]','$c[2]','$unixtime_to_date')"; // Import do bazy MYSQL
  16. mysql_query($import) or die(mysql_error());
  17. }
  18. }
  19.  
  20.  
  21. else if($row3["id_auction"] != $c[0] && $row3["count"] != $c[5] && $row3["login"] != $c[2] && $row3["date"] != $unixtime_to_date){
  22.  
  23. echo "Zaimportowałem wszystko.</br>";
  24. $import = "INSERT INTO sold (id_auction,count,login,date) values('$Auction','$c[5]','$c[2]','$unixtime_to_date')"; // Import do bazy MYSQL
  25. mysql_query($import) or die(mysql_error());
  26. }
  27. }


Załóżmy, że po wykonaniu skryptu mam w bazie 2 rekordy o tym samym id_auction:

id|id_auction|count|login|date

1|26179|1|szuki|2012-09-25
2|26179|3|kotis|2012-09-22

Gdy odpalę skrypt ponownie, to poniższy warunek nie jest już spełniony:

  1. else if($row3["id_auction"] === $c[0] && $row3["login"] !== $c[2])


Ok, id_auction jest takie samo, ale są dwa loginy. A w założeniu funkcja ma omijać wszystkie wpisy o tym samym numerze i loginie. W tym przypadku warunek już nie jest spełniony, bo załóżmy w pętli porównywany jest aktualnie pobrany login, z tym 2 (a później na odwrót). Jak obejść ten problem (nie wiem jak to jaśniej napisać)? ID ma włączone auto_increment, także jest unikalne. Myślałem, że mógłbym zrobić to tak:

  1. else if($row3["id_auction"] === $c[0] && $row3["login"] !== $c[2] && $row3["id"] !== NO WŁAŚNIE CO?)


Ewentualnie za każdym razem generować w pętli niepowtarzalny ciąg znaków, a wraz z importem przy spełnionych warunkach też dodawać klucz, np tak:

  1. <?php
  2. srand((double)microtime()*1000000);
  3. $id = md5(uniqid(rand()));
  4. echo $id;
  5. ?>


Wtedy klucz na pewno będzie zawsze inny, no ale te rozwiązanie wydaje się najgorszym ze wszystkich. Chyba największy sens ma sprawdzanie ID, tylko jak wyciągnąć inne z bazy, by porównać wartości?

Wiem, że to zawiłe.

Z góry dzięki za pomoc, pozdrawiam.
b4rt3kk
Szczerze mówiąc to nie mam bladego pojęcia o co chodzi. Może mógłbyś napisać tak krok po kroku co powinno się dziać? Np.

1. pobieram id
2. sprawdzam czy istnieje w bazie, jeśli tak to coś tam
3. jeśli nie to coś tam

to by może troszkę rozjaśniło sytuację.
szuki
Okej, no więc tak:

1. Odpalam skrypt, który pomogłeś mi w poprzednim temacie poprawić. W efekcie otrzymuję:

Zaimportowałem wszystko.
Zaimportowałem wszystko.
Zaimportowałem wszystko.
Zaimportowałem wszystko.
Dodałem brakujące.

Czyli (według skryptu) zapytanie pobiera id_auction z bazy, a następnie wykonuje się trzeci IF (ponieważ nie odnalazł danego id_auction):

  1. else if($row3["id_auction"] != $c[0] && $row3["count"] != $c[5] && $row3["login"] != $c[2] && $row3["date"] != $unixtime_to_date)
  2. echo "Zaimportowałem wszystko.</br>";


Jednak jak widać raz wykonuje się drugi IF (ponieważ napotkał id_autcion, ale nazwa użytkownika jest inna):

  1. else if($row3["id_auction"] === $c[0] && $row3["login"] !== $c[2])
  2. echo "Dodałem brakujące elementy z danej oferty</br>";


No i tutaj wszystko jest ok > wykonuje się import do innej bazy (która na początku, przed pierwszym wykonaniem skryptu była pusta).

A teraz inaczej, tak wygląda baza po wykonaniu się pierwszy raz skryptu:


1|21419|1|nick1|2012-09-25 (-> Zaimportowałem wszystko.)
2|26141|3|nick2|2012-09-22 (-> Zaimportowałem wszystko.)
3|21271|1|nick3|2012-09-25 (-> Zaimportowałem wszystko.)
4|26179|2|nick4|2012-09-12 (-> Zaimportowałem wszystko.)
5|26179|1|nick5|2012-09-21 (-> Dodałem brakujące.)

Do tego momentu jest ok. Teraz załóżmy, że chciałbym odpalić skrypt jeszcze raz, by sprawdzić czy coś się zmieniło i zaktualizować bazę. W efekcie otrzymam:

Nic nie zrobiłem.
Nic nie zrobiłem.
Nic nie zrobiłem.
Nic nie zrobiłem.
Dodałem brakujące.
Dodałem brakujące.

(Do testów wykonuje to na tej samej puli sprzedanych ofert - także powinno wszystko pominąć -> "Nic nie zrobiłem".) Jak widać drugi warunek poległ, zdublowało ostatni wpis.

Czyli 4 razy zadziałał pierwszy IF, ale tam gdzie numer zamówienia jest ten sam, drugi IF już sobie nie radzi. Prawdopodobnie (tak na logikę) dzieje się tak dlatego, że:

  1. else if([b]$row3["id_auction"] === $c[0][/b] && [b]$row3["login"] !== $c[2][/b])


Pierwszy warunek jest spełniony:

- id_auction występuje już w bazie

niestety drugi też, bo w bazie są dwa loginy i pewnie porównuje je na przemian i cały czas wychodzi na to, że dany login nie występuje w bazie. Pytanie teraz jak to naprawić i czy można do tego wykorzystać id, której jest niepowtarzalne?

Cholera, nie wiem czy da się to jaśniej wyjaśnić.
b4rt3kk
Hmm, a czemu konkretnie ma służyć ten skrypt? Czy łączy dane z dwóch baz? Tablic z bazy? Jeśli tak to jaka jest ich struktura? Czym jest tablica $c? No i pierwszy if jako że nic nie robi, nie jest chyba potrzebny (prócz tego, że wypisuje, że nic nie zrobił)? Myślę, że dałoby radę ograniczyć liczbę warunków w IF poprzez skonstruowanie bardziej precyzyjnego zapytania.

Najlepiej przedstaw jeszcze strukturę tablic, (które chcesz połączyc?) i strukturę tablicy, którą byś chciał otrzymać.
szuki
Pierwszy IF jest tymczasowo, żeby zobrazować lepiej skutek wykonania skryptu.

Sprawa wygląda tak:

Mam tabelę "produkty", w której, trzymam tylko sprzedane produkty (od jakiegoś czasu),nazwa, numer oferty, cenę i okres trwania całej oferty. Następnie z tej tabeli pobieram produkty, które spełniają określony warunek, np. wszystkie z grudnia. Wtedy identyfikator wysyła zapytanie do innego serwera, a on w odpowiedzi daje informacje o kupujących (bądź kupującym, wszystko zależy od tego ile osób kupiło daną rzecz), dacie zakupu i ilości sztuk.

Na podstawie tych danych (to właśnie jest $c) porównuje wartości w tych naszych IFach. Czyli można powiedzieć, że relacje. Tak to niestety wygląda i nie mogę tego "systemu" zmienić (pisał to mój brat, którego już z nami nie ma, a muszę to rozwinąć). Na podstawie tego będą generowane informacje o najczęściej kupujących, sprzedaży miesięcznej, itd. Nie wiem co jeszcze mogę napisać.

Nie wiem czy zrozumiałeś w czym mam problem. Muszę przed wykonaniem 2 ifa pobrać wszystkie loginy o danym id_aucion, by dopiero (podstawiać każdy nick) wykonać warunek, ewentualnie wykorzystać id z auto increment.
b4rt3kk
Czyli wygląda to tak?

tabela produkty:
id_aukcji | nazwa | numer_oferty | cena | okres_trwania_ferty

znajduje się na Twoim serwerze, tak? I produkty są unikatowe (i nr oferty)? Natomiast

tabela kupujacy:
id | numer_oferty | ilosc_sztuk | nick | data_zakupu

znajduje się na innym serwerze? I nr oferty może się już tutaj powtórzyć? Tzn. kilku klientów może kupić ten sam produkt.

I teraz chcesz zapisać te dane na swoim serwerze? Musisz mi przedstawić dokładnie strukturę obu tych tabel, co do kolumny, produkty i kupujący i która na jakim serwerze się znajduje, to coś się postaram wymyślić.
szuki
A co myślisz o tym, by tam gdzie jest drugi IF dodać kolejne zapytanie do bazy i pętlę, powiedzmy: SELECT login FROM sold where id_auction = "$Auction"; a następnie pętla, a w niej sprawdzany właśnie ten warunek? Chyba najszybsze rozwiązanie. Wtedy jeżeli będzie załóżmy nawet 10 loginów, to wszystkie je podstawi i sprawdzi, a następnie wykona warunek.
b4rt3kk
Ciężko powiedzieć, bo nie do końca rozumiem strukturę tych tabel, która gdzie i która co zawiera. smile.gif
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.