Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]INNER, Problem z łączeniem tabeli
tomczyk20151
post 28.05.2017, 03:18:40
Post #1





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 10.11.2015
Skąd: Sierpc

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


Mam problem z łączeniem tabeli, mianowicie posiadam dwie tabele users i friend. Na liście wyświetlam osoby online (znajomych), moich znajomych pobieram z tabeli friend to o ile to dobrze działa, no prawie(niestety są cały czas online)
  1. mysqli_query($conn,"select * from users JOIN friend ON (users.id=friend.id_drugiego) AND (friend.potwierdzenie=1)");

to już to {z działającym online} wysypuje mi błąd
  1. mysqli_query($conn,"select * from users JOIN friend ON (users.id=friend.id_drugiego) AND (friend.potwierdzenie=1) and ('".$czas_czat."' < user.act_time) AND (`user.id` != '".$id_usera."' ");

Jak mogę sobie poradzić, używanie WHERE nic nie pomaga
próbowałem też tak
  1. mysqli_query($conn,"select * from users LEFT JOIN friend ON (users.id=friend.id_drugiego) AND (friend.potwierdzenie=1) WHERE ('".$czas_czat."' < user.act_time) AND (`user.id` != '".$id_usera."')");

Proszę o pomoc

Poradziłem sobie smile.gif temar do zamknięcia
  1. mysqli_query($conn,"select * from users LEFT JOIN friend ON ((users.id=friend.id_drugiego) AND (friend.potwierdzenie=1)) WHERE ('".$czas_czat."' < users.act_time) AND (users.id != '".$id_usera."' ) ");


Jednak nie do zamknięcia. O ile wyświetla wszystko dobrze to jest problem, że próbuję się pozbyć "siebie". Niestety mnie wyświetla jako osoba online w moich znajomych. Jak to mogę rozwiązać? Przyznaje, że mnie już ku....a bierze. Proszę o pomoc
Go to the top of the page
+Quote Post
bostaf
post 28.05.2017, 10:55:05
Post #2





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


No to chyba coś z $id_usera jest nie tak. Sprawdzałeś, czy $id_usera na pewno przechowuje to co w kolumnie "id" tabeli "users"?

Spróbuj też INNER JOIN zamiast LEFT JOIN, albo LEFT JOIN z dodatkowym WHERE friend.id_drugiego IS NULL.

A jak to nie wypali to może wrzuć na sql fiddle te tabele i kilka danych do potestowania.
Go to the top of the page
+Quote Post
mortus
post 28.05.2017, 11:14:34
Post #3





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Warunek, który ma wyeliminować aktualnego użytkownika z listy zalogowanych znajomych zapewne powinien dotyczyć tabeli friend, a nie users.

Ten post edytował mortus 28.05.2017, 11:41:19
Go to the top of the page
+Quote Post
tomczyk20151
post 30.05.2017, 19:12:32
Post #4





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 10.11.2015
Skąd: Sierpc

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


AAAAAAAAAAAAA poddaje się co_jest.gif co_jest.gif co_jest.gif withstupidsmiley.gif

Postaram się pokazać o co mi chodzi, mam 2 tabele tabela users, przedstawia się następująco



Z tej tabeli pobieram kolumnę id, name, surname, act_time


Zaś tabela friend jest taka


Z powyższej tabeli pobieram wszystko, czyli od, do, potwierdzenie. Używając kodów, zamieszczonych w wyższych wypowiedziach niestesty, nie dość, że widać mnie to i jeszcze widać osoby, których wcale nie mam w znajomych.
Dla testów napisałem mały kodzik, gdzie w tabeli friend mam 3 rekordy (od = 1 do = 3 potwierdzenie = 1, od = 4 do = 1 potwierdzenie = 1, od = 5 do = 3 potwierdzenie = 1) Moje id w tabeli users wynosi 1. Tak więc
  1. mysqli_query($conn,"SELECT * FROM friend JOIN users ON friend.potwierdzenie = '1' WHERE friend.do = '".$moje_id_bazy_danych."'");
zamiast wyświetlić mi usera o ID 4 wyświetla mi dodatkowo usera o od 1 - czyli mnie + user o id 5. Jak to mam rozwiązać, cholernie proszę o pomoc. Nie mam już zielonego pojęcia gdzie jest błąd. Po nocach spać nie mogę przez to.


  1. mysqli_query($conn,"SELECT friend.*, users.* FROM friend LEFT JOIN users ON users.id = friend.od WHERE '".$czas_czat."' < users.act_time AND friend.do = '".$moje_id_bazy_danych."' AND friend.potwierdzenie = '1'");

Ok, rozwiązałem problem smile.gif (patrz góra [dla potomków biggrin.gif])

Teraz jest następny, po załadowaniu strony dopóty, dopóki nie minie 25 sekund (fragment strony odświeża się bez przeładowania strony) to znajomi są widoczni ząś po przeładowaniu niestety wyskakuje mi napis: NIK NIE JEST ONLINE.

Oczywiście jeśli user jest aktywny to co 20 sekund jest updatowana kolumna act_time w tabeli users, więc w rzeczywistości jest online. Myślę, że
  1. '".$czas_czat."' < users.act_time
może za to odpowiadać, no ale jak to mogę rozgryźć?

Go to the top of the page
+Quote Post
bostaf
post 31.05.2017, 10:57:30
Post #5





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


Cytat(tomczyk20151 @ 30.05.2017, 20:12:32 ) *
Teraz jest następny, po załadowaniu strony dopóty, dopóki nie minie 25 sekund (fragment strony odświeża się bez przeładowania strony) to znajomi są widoczni ząś po przeładowaniu niestety wyskakuje mi napis: NIK NIE JEST ONLINE.

A może "NIK NIE" to nazwa jednego z użytkowników? Wtedy ten komunikat miałby sens wink.gif

A poważnie to skoro po asynchronicznym przeładowaniu lista jest pusta, to coś jest na rzeczy z kodem wywoływanym ajaxem.
Pytanie - aktualizacja pola act_time jest robiona tym samym ajaxem, którym sprawdzana jest aktywność?
Go to the top of the page
+Quote Post
tomczyk20151
post 31.05.2017, 17:38:25
Post #6





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 10.11.2015
Skąd: Sierpc

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


Udało mi się to ogarnąć smile.gif
pomogło smile.gif, mimo iż includowałem inny plik, który na samej górze ma session_start to i tak musiałem dodać do obecnego pliku, oj biada mi biada smile.gif

O ile to się udało to nasuwa się kolejne pytanie Oczywiście moje ID = 1.
TABELA FRIEND


I tu zaczyna się pytanie, jak widzicie drodzy koledzy na powyższym obrazku, są dwa rekordy, gdzie ktoś mi wysłał zaproszenie, oczywiście potwierdziłem je. I jest jeden rekord gdzie ja wysłałem komuś zaproszenie, ten ktoś je również potwierdził. Załóżmy, że wszyscy są online, warunki wszystkie są spełnione, jest wszystko cycuś glancuś. Używając kodu
  1. mysqli_query($conn,"SELECT friend.*, users.* FROM friend LEFT JOIN users ON users.id = friend.od WHERE friend.do = '".$moje_id_bazy_danych."' AND '".$czas_czat."' < users.act_time AND friend.potwierdzenie = '1'");


Wyświetlają mi się tylko osoby, które zaprosiły mnie. Co mam wstawić do powyższego kodu, aby oprócz osób online, które mnie zaprosiły były widoczne osoby, które ja zaprosiłem?

Próbowałem tak

  1. mysqli_query($conn,"SELECT friend.*, users.* FROM friend LEFT JOIN users ON users.id = friend.od WHERE friend.do = '".$moje_id_bazy_danych."' OR friend.od = '".$moje_id_bazy_danych."' AND '".$czas_czat."' < users.act_time AND friend.potwierdzenie = '1'");

Ale niestety zamiast osoby do której wysałem zaproszenie pokazuję się JA.

  1.  
  2. <?php
  3.  
  4.  
  5.  
  6.  
  7.  
  8. $nick_czata = mysqli_query($conn,"SELECT friend.*, users.* FROM friend LEFT JOIN users ON users.id = friend.od WHERE (friend.do = '".$moje_id_bazy_danych."' OR friend.od = '".$moje_id_bazy_danych."') AND '".$czas_czat."' < users.act_time AND friend.potwierdzenie = '1'");
  9.  
  10. if(mysqli_num_rows($nick_czata)>0) {
  11.  
  12. while($ra = mysqli_fetch_assoc($nick_czata)) {
  13.  
  14. $zdjecia2 = mysqli_fetch_assoc(mysqli_query($conn, "SELECT * FROM avatary where id_user='".$ra['od']."'"));
  15. /* jeżeli wynik jest pozytywny, to wyświetlamy dane */
  16.  
  17.  
  18.  
  19.  
  20.  
  21. echo '<div class="friend-online">
  22. <div class="friend-avatar">';
  23. echo "<img src='imgs/".$zdjecia2['avatar']."'>";
  24. echo ' </div>
  25. <div class="friend-name">
  26. <a href="profile.php?id='.$ra['id'].'">'.$ra["name"].' '.$ra['surname'].'</a>
  27.  
  28. </div>
  29. <a href="newmessage.php?id='.$ra['id'].'"><div class="friend-message"></div></a>
  30. </div>';
  31.  
  32. }
  33. }
  34. else {
  35. echo ' <div class="friend-online">
  36. Nikt nie jest aktywny.
  37. </div>';
  38.  
  39. }
  40. ?>
  41.  
  42.  

może coś w całym kodzie jest nie tak. To jest już właśnie ostatni problem i niestety lipa

Bardzo przepraszam za taką ilość SPAMU w tym temacie. Udało się, trochę to dziwnie zrobiłem, no ale działa. Oto kod, napiszcie co myślicie o takim rozwiązaniu:
  1.  
  2. <?php
  3.  
  4.  
  5.  
  6.  
  7.  
  8. $nick_czata = mysqli_query($conn,"SELECT friend.*, users.* FROM friend LEFT JOIN users ON users.id = friend.od WHERE friend.do = '".$moje_id_bazy_danych."' AND '".$czas_czat."' < users.act_time AND friend.potwierdzenie = '1'");
  9. $nick_czatb = mysqli_query($conn,"SELECT friend.*, users.* FROM friend LEFT JOIN users ON users.id = friend.do WHERE friend.od = '".$moje_id_bazy_danych."' AND '".$czas_czat."' < users.act_time AND friend.potwierdzenie = '1'");
  10.  
  11. if(mysqli_num_rows($nick_czata)>0 or mysqli_num_rows($nick_czatb)>0) {
  12.  
  13. while($ra = mysqli_fetch_assoc($nick_czata) or $ra = mysqli_fetch_assoc($nick_czatb)) {
  14. $zdjeciea = mysqli_query($conn, "SELECT * FROM avatary where id_user='".$ra['od']."'");
  15. $zdjecieb = mysqli_query($conn, "SELECT * FROM avatary where id_user='".$ra['do']."'");
  16. $zdjecia2 = mysqli_fetch_assoc($zdjeciea) or $zdjecia2 = mysqli_fetch_assoc($zdjecieb);
  17. /* jeżeli wynik jest pozytywny, to wyświetlamy dane */
  18.  
  19.  
  20.  
  21.  
  22.  
  23. echo '<div class="friend-online">
  24. <div class="friend-avatar">';
  25. echo "<img src='imgs/".$zdjecia2['avatar']."'>";
  26. echo ' </div>
  27. <div class="friend-name">
  28. <a href="profile.php?id='.$ra['id'].'">'.$ra["name"].' '.$ra['surname'].'</a>
  29.  
  30. </div>
  31. <a href="newmessage.php?id='.$ra['id'].'"><div class="friend-message"></div></a>
  32. </div>';
  33.  
  34. }
  35. }
  36. else {
  37. echo ' <div class="friend-online">
  38. Nikt nie jest aktywny.
  39. </div>';
  40.  
  41. }
  42. ?>


Oczywiście kod działa jak natura tzn ja chciałem tongue.gif

Z GÓRY BARDZO WAM DZIĘKUJĘ ZA KAŻDĄ PRÓBĘ POMOCY smile.gif


Ten post edytował tomczyk20151 31.05.2017, 17:14:17
Go to the top of the page
+Quote Post
bostaf
post 1.06.2017, 11:31:24
Post #7





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


Cytat(tomczyk20151 @ 31.05.2017, 18:38:25 ) *
Oto kod, napiszcie co myślicie o takim rozwiązaniu

Cool smile.gif
Ale ja bym to jednym zapytaniem zrobił, mniej mielenia i większa czytelność:
  1. $nick_czata = mysqli_query($conn,
  2. "select users.*, avatary.avatar
  3. from users
  4. left join avatary on avatary.id_user = users.id
  5. where id in (
  6. select
  7. concat(if(`od` = '".$moje_id_bazy_danych."', '', `od`), if(`do` = '".$moje_id_bazy_danych."', '', `do`))
  8. from friend
  9. where `potwierdzenie` = 1 and (`od` = '".$moje_id_bazy_danych."' or `do` = '".$moje_id_bazy_danych."')
  10. )
  11. and '".$czas_czat."' < act_time"
  12. );

To może na zamotane wyglądać, ale jak przejdziesz na zapytania parametryczne to będzie czytelniejsze. Albo gdybyś chciał z tego zrobić procedurę albo funkcję w bazie.

Aha, i data type dla act_time proponowałbym DATETIME.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.04.2024 - 03:13