Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Poruszanie się po tabeli mysql w php
Forum PHP.pl > Forum > PHP
Grunthor
Witam serdecznie.

Od niedawna zacząłem przygodę z php i potrzebuję niewielkiej pomocy przy pisaniu skryptów.

Stworzyłem system logowania i dodawania danych do bazy danych mysql. Teraz chciałbym zmieniać te dane automatycznie na serwerze codziennie(dodawać jakieś wartości do poszczególnych rekordów tabeli). Dodam, że każdy wiersz tabeli to jest pojedynczy użytkownik który się wcześniej zarejstrował, a kolumny to są poszczególne dane użytkownika(id, email, haslo, tel, etc). Chciałbym aby skrypt pobierał sobie jakiś konkretny rekord użytkownika, następnie dodał do tego rekordu znaną mi wartość i nadpisał wcześniej wartość już tą po dodaniu. Następnie przeskoczył do kolejnego wiersza i powtórzył tą operacje aż do momentu gdy wiersze tabeli się skończą.

Jedyne rozwiązanie jakie przychodzi mi do głowy to pobranie całej tabeli z bazy danych i po każdej operacji dodawania, przeskakiwanie do kolejnych wierszy za pomocą pętli "for()" i na końcu wysłania całej tabeli do bazy danych.

Czy jest to prawidłowe rozwiązanie, czy może jest jakaś prostrza metoda na automatyczne uaktualnianie bazy danych nowymi wartościami??

Z góry dziękuję za pomoc i wyrozumiałość.
Grunthor
Dokładnie! Generalnie to użytkownik ma rekord o nazwie "Przebieg" i do tego rekordu(każdego użytkownika) zwiększa przebieg o wartość obliczoną wcześniej. DLa przykładu:

1 wiersz w tabeli to: Id, email,.., przebieg_auta.

Chce aby codziennie przebieg auta każdego użytkownika zwiekszał się o wartość $x.

Oczywiście każdy użytkownik(wiersz w bazie) ma przebieg jaki podał podczas rejestracji.
nospor
update tabela set pole = pole + 5
Grunthor
Cytat(nospor @ 17.06.2014, 17:22:22 ) *
update tabela set pole = pole + 5


Rozumiem, że to zmieni wartość wszystkich rekordów o nazwie "pole"??

A żeby sprawdzać czy wcześniej zmieniony rekord w danym wiersszu nie przekracza jakiejs wartości to musze zapewne pobrać wszystko do tablicy dwuwymiarowej i wtedy skakać po całej tablicy??

Chodzi o to, że sprawdzam dla danego użytkownika czy wcześniej zmieniany rekord nie przekracza ew wartości. Jeżeli przekracza to wtedy temu użytkownikowi wysyłam maila np.questionmark.gif
mrWodoo
Źle rozumiesz, to zmieni WSZYSTKIM rekordom w tabeli 'tabela' (UPDATE tabela) kolumnę pole na wartość tego pola + 5, żeby zdefiniować co ma zostać zmienione wg. kryterii używasz klauzuli WHERE kolumna = 'wartość'
Grunthor
OK< teraz rozumiem.

A mogę jakoś przejść po tabeli i sprawdzać ten rekord?? Chodz mi o to, że zmienie te wszystkie pola jak powyżej, lecz później chciałbym sprawdzić czy pole w wierszy 5 o nazwie przebieg nie rpzekroczyło jakiejś wartości, jeżeli przekroczyło to wysyłam o zaistaniałej sytuacji wiadomość email na adres podany w innej kolumnie w tym też wierszu.

Muszę wtedy całą tabele zapisywać do tablicy dwuwymiarowej i operować na niej dwiema pętlami for??
kartin
Poszukaj sobie jakiś kurs podstaw SQL i poczytaj. Dobrze na tym wyjdziesz. Wszystko co chcesz zrobić można zrobić w bazie danych, a na siłę chcesz pobierać całą tablicę i przeszukiwać ją w PHP.
  1. SELECT ...
  2. FROM ...
  3. WHERE pole > 666
Znajdzie wszystkie wiersze w których pole ma wartość większą nic 666
Grunthor
Cytat(kartin @ 17.06.2014, 19:57:07 ) *
Poszukaj sobie jakiś kurs podstaw SQL i poczytaj. Dobrze na tym wyjdziesz. Wszystko co chcesz zrobić można zrobić w bazie danych, a na siłę chcesz pobierać całą tablicę i przeszukiwać ją w PHP.


Masz rację, to chyba będzie najlepsze rozwiązanie.
Przypisywanie do tablicy jest z C/C++ bo tam tylko tak wykonywałem tego typu rzeczy:P.

Dziękuje wszystkim za pomoc!

Wybaczcie, lecz nie chciałem zakładać nowego wątku.
  1. <?php
  2. include("config.php");
  3.  
  4. mysql_query("UPDATE Dane_Użytkownika SET Przebieg = Przebieg + Miesieczny_przebieg_auta/365");
  5. $wynik = mysql_query("SELECT Przebieg, email Nazwa Podzespołu, Przebieg do zniszczenia FROM Dane_Użytkownika as a
  6. INNER JOIN Główne_dane as b ON a.Przebieg>=b.Przebieg do zniszczenia"); //or die(mysql_error());
  7. //mysql_query("UPDATE Dane_Użytkownika SET Warning = 1 WHERE Przebieg > 80000");
  8. while($r = mysql_fetch_assoc($wynik))
  9. {}
  10. while($r = mysql_fetch_assoc($wynik)){
  11. $od = "From: grunek1@gmail.com \r\n";
  12. $od .= 'MIME-Version: 1.0'."\r\n";
  13. $od .= 'Content-type: text/html; charset=iso-8859-2'."\r\n";
  14. $adres = "grunek1@gmail.com";
  15. $tytul = "Alert o zbliżającej się wymianie";
  16. $wiadomosc = "Elementy wymagające uwagi:\n".$r['Nazwa Podzespołu']."\n";
  17. mail($adres, $tytul, $wiadomosc, $od);
  18. }
  19.  
  20.  
  21. ?>


Powyższy kod ma za zadanie:
1) Zaktualizować kolumnę "Przebieg"
2) Następnie wybrać te rekordy w których Przebieg jest wiekszy/równy niż Przebieg do zniszczenia
3) wrzucam te rekordy do zmiennej $r
4) jeżeli odpowiednie rekordy wylądują w tablicy asocjacyjnej to ma wysłać maila na podany adres o treści" ..."

Nie wiem czy jest to właściwa konstrukcja??

Zamysł jest taki, że posiadam dwie tabele: Jedna to Dane użytkownika, a druga to jakieś dane z elementami.
skrypt musi sprawdzić czy np. Pole Przebieg u pierwszego użytkownika nie jest wieksze niż pola z elementami w drugiej tabeli. Jeżeli jest wieksze to wtedy skrypt musi pobrać ten element. I tak musi pobrać wszystkie takie elementy, wypisać ich nazwy aby użytkownik wiedział gdzie szukać i na koniec wysłać maila z tymi elementami do tego użytkownika. Muszę tą czynność powtórzyć oczywiście tyle razy ilu jest użytkowników czyli tyle razy ile jest wierszy w tabeli 1.

Prosiłbym o pomoc, gdyż to co napisałem niestety nie działa, a już sięgnałem po troche wiedzy z SQLa.

Z góry serdecznie dziękuję
Turson
Cytat
$wynik = mysql_query("SELECT Przebieg, email Nazwa Podzespołu, Przebieg do zniszczenia FROM Dane_Użytkownika as a
INNER JOIN Główne_dane as b ON a.Przebieg>=b.Przebieg do zniszczenia"); //or die(mysql_error());

Serio masz spacje i polskie znaki diaktryczne w nazwach kolumn?

  1. while($r = mysql_fetch_assoc($wynik))
  2. {}

Po co to jest skoro niżej masz masz tą samą pętlę
Grunthor
Tak, ale to dlatego, że odziedziczyłem tą baze po kimś i jeszcze ejj nie zmieniłem struktury.

Ta linijka jest podwojona bo nie wiem dlaczego ale z 1 while nie działa... tzn nie wykonuje tego co jest wewnątrz 1 whila. Jak jest drugi to jest ok.

Wyciągnąłem to z tego tematu:
http://www.goldenline.pl/grupy/Komputery_I...ablicy,2653178/
nospor
Pierwsza petla pobiera wszytkie rekordy wiec druga petla nie ma prawa ci juz dzialac, wiec cos krecisz piszac ze z pierwszą ci dziala a bez pierwszej nie.
Kolejny dowod na to ze cos krecisz to fakt, ze twoje zapytanie to jeden wielki blad i nie ma prawa ci dzialac z jedną, dwoma czy nawet z 10cioma petlami smile.gif
Grunthor
Cytat(nospor @ 24.06.2014, 09:45:54 ) *
Pierwsza petla pobiera wszytkie rekordy wiec druga petla nie ma prawa ci juz dzialac, wiec cos krecisz piszac ze z pierwszą ci dziala a bez pierwszej nie.
Kolejny dowod na to ze cos krecisz to fakt, ze twoje zapytanie to jeden wielki blad i nie ma prawa ci dzialac z jedną, dwoma czy nawet z 10cioma petlami smile.gif


Właśnie sprawdziłem to kolejny raz i rzeczywiście coś jest nie tak. Musiałem popełnić jakiś błąd gdy wcześniej to sprawdzałem.
Gdzie jest błąd w takim razie w moim zapytaniu:)?

mysql_query("SELECT Przebieg, email Nazwa Podzespołu, Przebieg do zniszczenia FROM Dane_Użytkownika as a
INNER JOIN Główne_dane as b ON a.Przebieg>=b.Przebieg do zniszczenia");
1) SELECT mówi które kolumny będę pobierać
2) FROM mówi z której bazy w połączeniu z inną bazą
3) ON -> podaje warunek które wiersze ma pobrać

Wybaczcie, cienki w uszach jeszcze jestem z sql i phpa;p
nospor
pola w SELECT nalezy oddzielac przecinkiem. Ty czasami o tym zapominasz
nazwy pol, ktore mają spacje i inne krzaki nalezy brac w ``
czyli nie
bla bla
a
`bla bla`

I ma zniknac pierwsza pusta petla ktora nic nie robi.
Grunthor
Moje zapytanie po poprawieniu wygląda teraz tak:

$wynik = mysql_query("SELECT Przebieg, email, 'Nazwa Podzespołu', 'Przebieg do zniszczenia' FROM Dane_Użytkownika as a
INNER JOIN Główne_dane as b ON a.Przebieg>=b.'Przebieg do zniszczenia'");

Oczywiście po usunięciu jednej z pętli while. Niestety coś wciąż jest nie tak z zapytaniem?
nospor
Napisalem wyraznie `
znajdz 10 roznic
`
'
Turson
Proponuję sprawdzac zapytania bezposrednio w phpmyadmin, to wywali gdzie błąd, a nie "coś nie tak"
Grunthor
Mam pewien problem z poruszaniem się po bazie danych a mianowicie:
  1. <?php
  2. include("config.php");
  3. $wiadomosc = "Elementy wymagające uwagi:\n";
  4. mysql_query("UPDATE Dane_Użytkownika SET Przebieg = Przebieg + Miesieczny_przebieg_auta/365");
  5. $wynik = mysql_query("SELECT email, `Nazwa Podzespołu`, `Przebieg do zniszczenia` FROM Dane_Użytkownika as a
  6. INNER JOIN Główne_dane as b ON a.Przebieg>=b.`Przebieg do zniszczenia`");
  7. while($r = mysql_fetch_assoc($wynik)){
  8. mysql_query("UPDATE Dane_Użytkownika SET Warning = 0");
  9.  
  10.  
  11. echo $r["Nazwa Podzespołu"]; //wyświetlanie dla testów
  12. $wiadomosc = $wiadomosc .$r["Nazwa Podzespołu"]."\n";
  13. //mail($r["email"], $tytul , $wiadomosc, 'grunek1@gmail.com');
  14. }
  15.  
  16. $od = 'grunek1@gmail.com';
  17. $tytul = 'Alert o zbliżającej się wymianie';
  18. while($r = mysql_fetch_assoc($wynik)){
  19. $adres = $r["email"];
  20. mail($r["email"], $tytul , $wiadomosc, 'grunek1@gmail.com');
  21. }
  22. ?>


Tabela A[
email
Przebieg]

Tabela B[
Nazwa Podzespołu
Przebieg do zniszczenia
]
Pobieram rekordy z tabeli A i B tylko wtedy gdy Przebieg>=Przebieg do zniszczenia.
Następnie zapisuje kolejne elementy z tabeli B do zmiennej $wiadomość tak aby później wyslac to emailem do użytkowników których warunek zapytania jest spełniony.
O ile potrafię pobrać i zapisać odpowiednie "Nazwy Podzespołów" to nie potrafie później wysłać wiadomości email dla której warunek zapytania jest spełniony.

Moglibyście mi pomóc jak pętle stworzyć aby owy email został wysłany na adres pobrany z bazy danych??
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.