Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Poruszanie się po tabeli mysql w php
Grunthor
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 17.06.2014

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


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ść.
Go to the top of the page
+Quote Post
Grunthor
post
Post #2





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 17.06.2014

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


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





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




update tabela set pole = pole + 5
Go to the top of the page
+Quote Post
Grunthor
post
Post #4





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 17.06.2014

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


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





Grupa: Zarejestrowani
Postów: 160
Pomógł: 6
Dołączył: 13.01.2012
Skąd: Bytom

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


Ź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ść'

Ten post edytował mrWodoo 17.06.2014, 18:34:54
Go to the top of the page
+Quote Post
Grunthor
post
Post #6





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 17.06.2014

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


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





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

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


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





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 17.06.2014

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


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





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


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ę
Go to the top of the page
+Quote Post
Grunthor
post
Post #10





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 17.06.2014

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


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





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




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





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 17.06.2014

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


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





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




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





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 17.06.2014

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


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





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




Napisalem wyraznie `
znajdz 10 roznic
`
'
Go to the top of the page
+Quote Post
Turson
post
Post #16





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Proponuję sprawdzac zapytania bezposrednio w phpmyadmin, to wywali gdzie błąd, a nie "coś nie tak"
Go to the top of the page
+Quote Post
Grunthor
post
Post #17





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 17.06.2014

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


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??
Go to the top of the page
+Quote Post

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: 28.12.2025 - 18:31