Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][PDO] Znajomi
DonJeday
post
Post #1





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

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


Witam,

Pisze sobie na swoją stronę moduł znajomych. Lecz mam problem. Wszystko opiera się na loginach, baza zbudowana jest następująco:

id, from, to, accept

Dodam że piszę to z kolegą lecz on napisał to na idach i za cholerę nie mogę przerobić tego na loginy działa tylko dla 1 osoby, a jak w bazie dodam 2 to już błąd u obydwóch.

Kod mój na loginy:

  1. <?php
  2.  
  3. //Znajomi
  4.      $uzytkownik[] = $_GET['load'];
  5.       
  6.      $query = $pdo -> prepare('SELECT * FROM friends WHERE from = :view AND accept = "1"');
  7.      $query -> bindValue(':view', $uzytkownik[0], PDO::PARAM_STR);
  8.      $query -> execute();
  9.      while ($row = $query -> fetch(PDO::FETCH_ASSOC)) {
  10.          $all[] = $row['to'];                     
  11.      }
  12.      $query -> closeCursor();
  13.               
  14.               
  15.      $query2 = $pdo -> prepare('SELECT * FROM friends WHERE to = :view AND accept = "1"'); 
  16.      $query2 -> bindValue(':view', $uzytkownik[0], PDO::PARAM_STR);
  17.      $query2 -> execute();
  18.      while ($row = $query2 -> fetch(PDO::FETCH_ASSOC)) {
  19.          $all[] = $row['from'];
  20.      }             
  21.      $query -> closeCursor();
  22.          if ($all != '') { 
  23.              $inf = user_info();
  24.              $sql = sprintf('SELECT login, miasto, imie, nazwisko, zdjecie FROM users WHERE login IN (%s);', implode(', ', $all));
  25.              $query3 = $pdo -> query($sql);
  26.              while ($row = $query3 -> fetch(PDO::FETCH_ASSOC)) { 
  27.                  $znajomi[] = $row;
  28.                  $i++;
  29.              }
  30.              $query -> closeCursor();
  31.  
  32.      $smarty->assign('ile_znajomych', $i);
  33.      $smarty->assign('znajomi', $znajomi);
  34.          }    else {
  35.      $smarty->assign('ile_znajomych', '0');
  36.      }
  37.   
  38.      //Koniec znajomych
  39.  
  40.  
  41. ?>




Kod jego na idach:

  1. <?php
  2.  
  3. //Znajomi
  4.      $queryx = $pdo -> prepare('SELECT id FROM users WHERE login = :login'); 
  5.      $queryx -> bindValue(':login', $_GET['load'], PDO::PARAM_STR);
  6.      $queryx -> execute();
  7.      while ($row = $queryx -> fetch(PDO::FETCH_ASSOC)) {
  8.          $uzytkownik[] = $row['id'];
  9.      }                 
  10.      $queryx -> closeCursor();
  11.       
  12.  
  13.      $query = $pdo -> prepare('SELECT * FROM friends WHERE from = :view AND accept = "1"');
  14.      $query -> bindValue(':view', $uzytkownik[0], PDO::PARAM_INT);
  15.      $query -> execute();
  16.      while ($row = $query -> fetch(PDO::FETCH_ASSOC)) {
  17.          $all[] = $row['to'];                     
  18.      }
  19.      $query -> closeCursor();
  20.               
  21.               
  22.      $query2 = $pdo -> prepare('SELECT * FROM friends WHERE to = :view AND accept = "1"'); 
  23.      $query2 -> bindValue(':view', $uzytkownik[0], PDO::PARAM_INT);
  24.      $query2 -> execute();
  25.      while ($row = $query2 -> fetch(PDO::FETCH_ASSOC)) {
  26.          $all[] = $row['from'];
  27.      }             
  28.      $query -> closeCursor();
  29.          if ($all != '') { 
  30.              $inf = user_info();
  31.              $sql = sprintf('SELECT login, miasto, imie, nazwisko, zdjecie FROM users WHERE id IN (%s);', implode(', ', $all));
  32.              $query3 = $pdo -> query($sql);
  33.              while ($row = $query3 -> fetch(PDO::FETCH_ASSOC)) { 
  34.                  $znajomi[] = $row;
  35.                  $i++;
  36.              }
  37.              $query -> closeCursor();
  38.  
  39.      $smarty->assign('ile_znajomych', $i);
  40.      $smarty->assign('znajomi', $znajomi);
  41.          }    else {
  42.      $smarty->assign('ile_znajomych', '0');
  43.      }
  44.   
  45.      //Koniec znajomych
  46. ?>php
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Jeżeli dobrze rozumiem: kolega w miejsce "from" oraz "to" podstawiał id użytkownika, natomiast ty dajesz od razu login? Jeśli tak to zmień swoje podejście - kolega lepiej to zrobił. Listę znajomych danego użytkownika (bo domyślam się, że to chcesz osiągnąć) możesz uzyskać jednym zapytaniem. Jak? Stosując 2 razy złączenie (JOIN) do tabeli użytkowników lub wręcz z jednym JOINem jeżeli skorzystasz dodatkowo z instrukcji warunkowej (w celu poprawnia id znajomego, a nie siebie samego).
Go to the top of the page
+Quote Post
DonJeday
post
Post #3





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

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


Ale czy JOIN działa w PDO? Bo kiedyś chciałem uźyć JOIN i PDO zwracało mi error.
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




(IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif) a czemu miałby nie działać? Przecież do metody prepare() przekazujesz normalny ciąg znaków będący zwykłym zapytaniem SQL.
Go to the top of the page
+Quote Post
lord_borsuk
post
Post #5





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 3.08.2008

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


Odkopie ten temat żeby nie tworzyć nowego.

Jak powinno wyglądać to zapytanie ?
Ponieważ mam teraz przed sobą podobny problem i nie mogę sobie z nim poradzić :(

friends: ID_1, ID_2 - identyfikatory
accounts: ID, name, sur_name

sam wymyśliłem coś takiego, ale nie działa więc coś jest źle ale nie znam się na SQL'u na tyle żeby wiedzieć co :(
  1. SELECT a.name, a.sur_name
  2. FROM friends f JOIN accounts a ON a.ID=(IF (a.ID=ID_1, ID_2, ID_1))
  3. WHERE a.ID=4
Go to the top of the page
+Quote Post
erix
post
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




nie działa, to znaczy? Skąd Ci się bierze ID_1, a skąd ID_2?
Go to the top of the page
+Quote Post
lord_borsuk
post
Post #7





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 3.08.2008

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


ID_1 i ID_2 to identyfikatory osób z tabeli accounts
Go to the top of the page
+Quote Post
erix
post
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Ech, widzę że trzeba jednak za rączkę:
  • jaka jest struktura tabeli?
  • co zwraca zapytanie?
  • jakie były Twoje próby rozwiązania problemu?
Go to the top of the page
+Quote Post
lord_borsuk
post
Post #9





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 3.08.2008

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


Cytat(erix @ 17.07.2010, 17:01:05 ) *
jaka jest struktura tabeli?


  1. CREATE TABLE IF NOT EXISTS `friends` (
  2. `fr_ID` int(11) NOT NULL AUTO_INCREMENT,
  3. `ID_1` int(11) NOT NULL,
  4. `ID_2` int(11) NOT NULL,
  5. `time` int(11) NOT NULL,
  6. `akc` enum('t','n') COLLATE utf8_polish_ci NOT NULL DEFAULT 'n',
  7. PRIMARY KEY (`fr_ID`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;


  1. CREATE TABLE IF NOT EXISTS `main_accounts` (
  2. `ID` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(30) COLLATE utf8_polish_ci NOT NULL,
  4. `sur_name` varchar(40) COLLATE utf8_polish_ci NOT NULL,
  5. --inne pola teraz mało wazne
  6. PRIMARY KEY (`ID`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;



Cytat(erix @ 17.07.2010, 17:01:05 ) *
co zwraca zapytanie?

Zapytanie ma zwrócić pola name i sur_name z tabeli main_accounts.

Cytat(erix @ 17.07.2010, 17:01:05 ) *
jakie były Twoje próby rozwiązania problemu?

  1. FROM friends f JOIN accounts a ON a.ID=(IF (a.ID=ID_1, ID_2, ID_1))
  2. WHERE (ID_1 = 4 OR ID_2 = 4) AND akc="t"


Chodzi mi tu o zapytanie które zwróci mi nazwiska znajomych żądanej osoby, aktualnie to wygląda tak jak powyżej.
Chyba że ktoś zna lepszy sposób na rozwiązanie tego problemu to chętnie się z nim zapoznam (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
erix
post
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Ale tu przecież powinieneś użyć relacji N-N (wiele-do-wielu) (użytkownik-pomocnicza-użytkownik, tylko pamiętaj o prawidłowym ustawieniu aliasów tabel).
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: 22.08.2025 - 12:38