Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][PDO] Znajomi
Forum PHP.pl > Forum > PHP
DonJeday
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
phpion
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).
DonJeday
Ale czy JOIN działa w PDO? Bo kiedyś chciałem uźyć JOIN i PDO zwracało mi error.
phpion
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.
lord_borsuk
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
erix
nie działa, to znaczy? Skąd Ci się bierze ID_1, a skąd ID_2?
lord_borsuk
ID_1 i ID_2 to identyfikatory osób z tabeli accounts
erix
Ech, widzę że trzeba jednak za rączkę:
  • jaka jest struktura tabeli?
  • co zwraca zapytanie?
  • jakie były Twoje próby rozwiązania problemu?
lord_borsuk
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 smile.gif
erix
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).
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.