Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Usuwanie użytkowników pętlą po uwzględnieniu warunku
Forum PHP.pl > Forum > Przedszkole
Lethys
Witam,

Chcę zrobić prosty skrypt, który mi wypiszę użytkowników którzy dodali artykuł ze słaba punktacją (-5 bądź mniej punktów). W tabeli artykuly, każdy artykuł ma kolumnę id_dodajacy na podstawie której chcę wypisać użytkowników ktorzy dodali słaby artykuł.



  1.  
  2. $artykul_dostep = mysql_fetch_array(mysql_query("select * from artykuly where punkty<=-5")) or mysql_error();
  3.  
  4.  
  5. foreach($artykul_dostep as $userr)
  6. {
  7. $dany_user = mysql_fetch_array(mysql_query("select * from uzytkownicy where id=$userr[id_dodajacego]")) or mysql_error();
  8.  
  9. echo '<br>'.$dany_user[login].'</br>';
  10. }
  11.  
  12.  


Co źle robię? Chcę to zrobić pętlą foreach.
kapslokk
Tak na pierwszy rzut oka to:
  1. $dany_user[login]

a powinno być
  1. $dany_user['login']


i w zapytaniu też nie masz apostrofów smile.gif
Lethys
Cytat(kapslokk @ 10.08.2015, 11:47:28 ) *
Tak na pierwszy rzut oka to:
  1. $dany_user[login]

a powinno być
  1. $dany_user['login']


i w zapytaniu też nie masz apostrofów smile.gif



Niby skrypt ruszył ale nie działa jak powinien. Wyświetla mi nick pierwszego z brzegu usera kilka razy (nie zgadadza się z liczbą z warunku), pomijając innych userów oraz co jakiś czas zostawiając puste linijki

Kishin
Po co robisz dodatkowe zapytanie w pętli?

Nie lepiej?
  1. SELECT * FROM artykuly a
  2. LEFT JOIN uzytkownicy u ON u.id_dodajacego=a.id
  3. WHERE punkty<=-5


i potem foreacha zrobić i wyciągasz już sobie co tylko chcesz
com
pokaż poprawiony kod smile.gif
Lethys
Cytat(Kishin @ 10.08.2015, 12:13:36 ) *
Po co robisz dodatkowe zapytanie w pętli?

Nie lepiej?
  1. SELECT * FROM artykuly a
  2. LEFT JOIN uzytkownicy u ON u.id_dodajacego=a.id
  3. WHERE punkty<=-5


i potem foreacha zrobić i wyciągasz już sobie co tylko chcesz



Nie działa takie zapytanie sad.gif

  1. $podobienstwa_dostep = mysql_fetch_array(mysql_query("select * from artykuly a left join uzytkownicy u on u.id_dodajacego=a.id where punkty<=-5")) or mysql_error();
  2.  
  3. foreach($podobienstwa_dostep as $userr)
  4. {
  5.  
  6. echo ''.$userr['login'].'</br>';
  7. }
Kishin
ehh mój błąd

  1.  
  2. SELECT * FROM artykuly a
  3.  
  4. LEFT JOIN uzytkownicy u ON u.id=a.id_dodajacego
  5.  
  6. WHERE punkty<=-5
  7.  
  8.  
  9.  





Lethys
Cytat(Kishin @ 10.08.2015, 12:33:55 ) *
ehh mój błąd

  1.  
  2. SELECT * FROM artykuly a
  3.  
  4. LEFT JOIN uzytkownicy u ON u.id=a.id_dodajacego
  5.  
  6. WHERE punkty<=-5
  7.  
  8.  
  9.  


Nadal nie działą, zrobie to standardowo ale skrypt mi wyświetla losowe kilka nicków z bazy zamiast moje nicki według warunku.

Aktualny skrypt:

  1.  
  2. $podobienstwa_dostep = mysql_fetch_array(mysql_query("select * from artykuly where punkty<=-5")) or mysql_error();
  3.  
  4.  
  5. foreach($podobienstwa_dostep as $userr)
  6. {
  7. $dany_user = mysql_fetch_array(mysql_query("select * from uzytkownicy where id='$userr[id_dodajacego]'")) or mysql_error();
  8.  
  9. echo ''.$dany_user['login'].'</br>';
  10. }
  11.  
  12.  

kapslokk
  1. $dany_user = mysql_fetch_array(mysql_query("select * from uzytkownicy where id='$userr[id_dodajacego]'")) or mysql_error();
na
  1. $dany_user = mysql_fetch_array(mysql_query("select * from uzytkownicy where id=$userr['id_dodajacego']")) or mysql_error();


Left join to tak czy inaczej lepsze rozwiązanie - Twój sposób zamiast zrobić jedno zapytanie zrobi ich tyle ile będzie tych wpisów w bazie.
Lethys
Cytat(kapslokk @ 10.08.2015, 12:51:21 ) *
  1. $dany_user = mysql_fetch_array(mysql_query("select * from uzytkownicy where id='$userr[id_dodajacego]'")) or mysql_error();
na
  1. $dany_user = mysql_fetch_array(mysql_query("select * from uzytkownicy where id=$userr['id_dodajacego']")) or mysql_error();


Left join to tak czy inaczej lepsze rozwiązanie - Twój sposób zamiast zrobić jedno zapytanie zrobi ich tyle ile będzie tych wpisów w bazie.


zamiana id='$userr[id_dodajacego] na $userr['id_dodajacego'] sprawia, że skrypt teraz nic nie wyświetla nawet błędnych loginów..
kapslokk
Legendy głoszą, że jak dasz:
to wyświetli się np błąd z mysql'a.
Lethys
Cytat(kapslokk @ 10.08.2015, 12:58:29 ) *
Legendy głoszą, że jak dasz:
to wyświetli się np błąd z mysql'a.


Pojawia się:

  1. Warning: Illegal string offset 'id_dodajacego'


odnośnie tej linijki:

  1. $dany_user = mysql_fetch_array(mysql_query("select * from uzytkownicy where id='$userr[id_dodajacego]'")) or die(mysql_error());


Tylko, że jeżeli dam id=$user['id_dodajacego'] to nic mi skrypt nie wyrzuca, więc też nie działa ..
kapslokk
Warning Ci wywala, bo nie masz apostrofów. Znajdź sobie jakiś kurs php i tablice asocjacyjne. Popraw to zapytanie tak aby apostrofy były, potem sobie zrób

  1. echo("select * from uzytkownicy where id=$userr['id_dodajacego']");


i wrzuć zapytanie do bazy np przez phpMyAdmin'a. Może nie znajduje użytkowników którzy by pasowali do zapytania ?
Kishin
Cytat(kapslokk @ 10.08.2015, 14:15:45 ) *
Warning Ci wywala, bo nie masz apostrofów. Znajdź sobie jakiś kurs php i tablice asocjacyjne. Popraw to zapytanie tak aby apostrofy były, potem sobie zrób

  1. echo("select * from uzytkownicy where id=$userr['id_dodajacego']");


i wrzuć zapytanie do bazy np przez phpMyAdmin'a. Może nie znajduje użytkowników którzy by pasowali do zapytania ?

Coś chyba mylisz. Taki zapis jak tu masz jest nieprawidłowy

powinno być:

  1. echo("select * from uzytkownicy where id='$userr[id_dodajacego]'");



Lethys rozumiem ze id na pewno równa się id_dodajacego w Twoich tabelkach? wink.gif
kapslokk
Cytat(Kishin @ 10.08.2015, 14:27:47 ) *
Coś chyba mylisz. Taki zapis jak tu masz jest nieprawidłowy

powinno być:

  1. echo("select * from uzytkownicy where id='$userr[id_dodajacego]'");



Lethys rozumiem ze id na pewno równa się id_dodajacego w Twoich tabelkach? wink.gif


To Ty też sobie poczytaj o tablicach asocjacyjnych. Albo wyjaśnij skąd warning? Można wziąć dodatkowo
  1. $userr[id_dodajacego]
w apostrofy, ale jeżeli jest liczbą to nie ma takiej potrzeby.
Lethys
Cytat(Kishin @ 10.08.2015, 13:27:47 ) *
Coś chyba mylisz. Taki zapis jak tu masz jest nieprawidłowy

powinno być:

  1. echo("select * from uzytkownicy where id='$userr[id_dodajacego]'");



Lethys rozumiem ze id na pewno równa się id_dodajacego w Twoich tabelkach? wink.gif



Teraz odkryłem, że skrypt zawsze zwraca ID:1 (nie wpadłem na to bo testowałem swoim kontem z id 1)

  1. $podobienstwa_dostep = mysql_fetch_array(mysql_query("select * from artykuly where punkty<=-5 and id_dodajacego IS NOT NULL")) or die(mysql_error());
  2.  
  3.  
  4. foreach($podobienstwa_dostep as $userr)
  5. {
  6. $dany_user = mysql_fetch_array(mysql_query("select * from `uzytkownicy` where id='$userr[id_dodajacego]'")) or die(mysql_error());
  7.  
  8. //$userr['id_dodajacego'] WYNOSI ZAWSZE 1 MIMO, IŻ W BAZIE UŻYTKOWNIK, KTÓRY PISAŁ DANY ARTYKUŁ MA INNY ID
  9.  
  10. echo ''.$userr['id_dodajacego'].'</br>';
  11. echo ''.$dany_user['login'].'</br>';
  12. }
Kishin
Cytat(kapslokk @ 10.08.2015, 14:36:28 ) *
To Ty też sobie poczytaj o tablicach asocjacyjnych. Albo wyjaśnij skąd warning? Można wziąć dodatkowo
  1. $userr[id_dodajacego]
w apostrofy, ale jeżeli jest liczbą to nie ma takiej potrzeby.


Wiesz że warning jest przy zaproponowanym przez Ciebie zapytaniu?
Proponuje napisać takie zapytanie i przekonać się na własnej skórze.

Cytat(Lethys @ 10.08.2015, 14:36:56 ) *
Teraz odkryłem, że skrypt zawsze zwraca ID:1 (nie wpadłem na to bo testowałem swoim kontem z id 1)

  1. $podobienstwa_dostep = mysql_fetch_array(mysql_query("select * from artykuly where punkty<=-5 and id_dodajacego IS NOT NULL")) or die(mysql_error());
  2.  
  3.  
  4. foreach($podobienstwa_dostep as $userr)
  5. {
  6. $dany_user = mysql_fetch_array(mysql_query("select * from `uzytkownicy` where id='$userr[id_dodajacego]'")) or die(mysql_error());
  7.  
  8. //$userr['id_dodajacego'] WYNOSI ZAWSZE 1 MIMO, IŻ W BAZIE UŻYTKOWNIK, KTÓRY PISAŁ DANY ARTYKUŁ MA INNY ID
  9.  
  10. echo ''.$userr['id_dodajacego'].'</br>';
  11. echo ''.$dany_user['login'].'</br>';
  12. }



Możesz wrzucić jakieś screeny tych tabelek?
kapslokk
Ok, spoko. Ale dajmy w takim razie:
  1. echo("select * from uzytkownicy where id={$userr['id_dodajacego']}");


a nie
  1. echo("select * from uzytkownicy where id='$userr[id_dodajacego]'");


nadal niewiele to zmieni, bo pewnie problem jest w zapytaniu 1 lub w samej bazie.
Lethys
Cytat(Kishin @ 10.08.2015, 14:03:42 ) *
Wiesz że warning jest przy zaproponowanym przez Ciebie zapytaniu?
Proponuje napisać takie zapytanie i przekonać się na własnej skórze.

Możesz wrzucić jakieś screeny tych tabelek?



Jasne

Jak widać istnieje użytkownik z ID 8, który ma artykuły z minimum -5 punktami, a skrypt mi pokazuje usera z ID:1 zamiast 3 echo z userem o ID:8

Uzytkownicy:



Artykuły:

Kishin
wrzuc jeszcze przed foreachem takie coś i napisz co wypluło

  1.  
  2. echo '<pre>';
  3. print_r($podobienstwa_dostep );
  4. echo '</pre>';
  5.  
Lethys
Cytat(Kishin @ 10.08.2015, 14:40:53 ) *
wrzuc jeszcze przed foreachem takie coś i napisz co wypluło

  1.  
  2. echo '<pre>';
  3. print_r($podobienstwa_dostep );
  4. echo '</pre>';
  5.  



W sumie to poprawnie mi wywaliło:

  1.  
  2. (
  3. [0] => 144
  4. [id1] => 144
  5. [1] => 478
  6. [id2] => 478
  7. [2] => 0
  8. [klimat] => 0
  9. [3] => 0
  10. [akcja] => 0
  11. [4] => 0
  12. [tematyka] => 0
  13. [5] => 0
  14. [seria] => 0
  15. [6] => -5
  16. [punkty] => -5
  17. [7] => 2159
  18. [id_podobienstwa] => 2159
  19. [8] => 8
  20. [id_dodajacego] => 8
  21. )


id_dodajacego sie zgadza, punkty też (ale jeden rekord tylko wypluło)
kapslokk
Jeden rekord, bo mysql_fetch_array powinieneś używać w pętli while() żeby wypluło ich więcej.
http://php.net/manual/en/function.mysql-fetch-array.php
Example #2
Kishin
Zamiast

  1. $dany_user = mysql_fetch_array(mysql_query("select * from `uzytkownicy` where id='$userr[id_dodajacego]'")) or die(mysql_error());
  2.  




Spróbuj tak

  1.  
  2. while ($dany_user=mysql_fetch_array(mysql_query("select * from `uzytkownicy` where id='$userr[id_dodajacego]'"))){
  3. echo $dany_user['login'];
  4. }
  5.  
  6.  
  7.  
Lethys
Cytat(Kishin @ 11.08.2015, 06:50:32 ) *
Zamiast

  1. $dany_user = mysql_fetch_array(mysql_query("select * from `uzytkownicy` where id='$userr[id_dodajacego]'")) or die(mysql_error());
  2.  




Spróbuj tak

  1.  
  2. while ($dany_user=mysql_fetch_array(mysql_query("select * from `uzytkownicy` where id='$userr[id_dodajacego]'"))){
  3. echo $dany_user['login'];
  4. }
  5.  
  6.  
  7.  



W nieskończoność mi echuje mój nick czyli usera z ID:1
kapslokk
  1. $res = mysql_query("select * from `uzytkownicy` where id='$userr[id_dodajacego]'");
  2. while ($dany_user=mysql_fetch_array($res)){
  3. echo $dany_user['login'];
  4. }


Dałem Ci link do dokumentacji... Wystarczyło zerknąć.

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.