Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]PDO po raz kolejny
Forum PHP.pl > Forum > Przedszkole
Marcinekk
Witam, w config.php mam funkcje, która pobiera dane użytkownika:

  1. function get_user_data($user_id = -1) {
  2.  
  3.  
  4. if($user_id == -1) {
  5. $user_id = $_SESSION['user_id'];
  6. }
  7. $result = $pdo->query("SELECT * FROM `panel_users` WHERE `user_id` = '{$user_id}' LIMIT 1");
  8. if(mysql_num_rows($result) == 0) {
  9. return false;
  10. }
  11. return mysql_fetch_assoc($result);
  12. }


Trochę tutaj pozamieniałem na PDO lecz wywala bląd:

Kod
Fatal error: Call to a member function query() on a non-object in /home/xxx/public_html/config.php on line 36


Kilka linijek wyżej jest połączenie wykorzystujące PDO, mimo to wywala ten błąd, proszę o pomoc.
Marcinekk
No tak, ale i tak wywala, że nie ma takiej funkcji jak query...
Fred1485
Co trzymasz w zmiennej $pdo bo na pewno nie jest to obiekt klasy PDO
Cytat
on a non-object
Kshyhoo
Nie, że nie ma funkcji query, tylko, że nie jest obiektem - a przecież PDO jest obiektowe. Wywal klamry i użyj kropki.
Marcinekk
  1. try {
  2. $pdo = new PDO('mysql:host='.$mysql_host.';dbname='.$database.';port='.$port, $username, $password );
  3. echo 'Połączenie nawiązane!';
  4. } catch(PDOException $e){
  5. echo 'Połączenie nie mogło zostać utworzone.<br />';
  6. }


Które klamry na kropki mam zamienić?
Fred1485
Połączenie masz nawiązane? Nie rzuca wyjątkiem?
Marcinekk
Jest nawiązane, wstawiłem kod jak to wygląda..
Fred1485
Podeślij cały kod jak możesz.
Marcinekk
  1. try {
  2. $pdo = new PDO('mysql:host='.$mysql_host.';dbname='.$database.';port='.$port, $username, $password );
  3. echo 'Połączenie nawiązane!';
  4. } catch(PDOException $e){
  5. echo 'Połączenie nie mogło zostać utworzone.<br />';
  6. }
  7.  
  8.  
  9. function get_user_data($user_id = -1) {
  10.  
  11.  
  12. if($user_id == -1) {
  13. $user_id = $_SESSION['user_id'];
  14. }
  15. $result = $pdo-> exec("SELECT * FROM `panel_users` WHERE `user_id` = '{$user_id}' LIMIT 1");
  16. if(mysql_num_rows($result) == 0) {
  17. return false;
  18. }
  19. return mysql_fetch_assoc($result);
  20. }
Fred1485
W funkcji wypadałoby odwołać się do $pdo poprzez

  1. global $pdo;
Marcinekk
Lol, wcześniej to tam umieszczałem i nie działało.

Następny błąd:

Kod
Warning: mysql_num_rows() expects parameter 1 to be resource, integer given in /home/u202840681/public_html/config.php on line 32

Linijka:

  1. if(mysql_num_rows($result) == 0) {


całość:

  1. if(mysql_num_rows($result) == 0) {
  2. return false;
  3. }
  4. return mysql_fetch_assoc($result);

Fred1485
  1. $mysql_host = '';
  2. $database = '';
  3. $username = '';
  4. $password = '';
  5. try {
  6. $pdo = new PDO('mysql:host='.$mysql_host.';dbname='.$database, $username, $password );
  7. echo 'Połączenie nawiązane!';
  8. }
  9. catch(PDOException $e){
  10. echo 'ERROR:'. $e->getMessage();
  11. }
  12.  
  13.  
  14. function get_user_data($user_id = -1) {
  15. global $pdo;
  16.  
  17. $id = 1;
  18.  
  19. $query = $pdo->prepare("SELECT * FROM `panel_users` WHERE `user_id` = :id LIMIT 1");
  20. $query->bindValue(':id', $id, PDO::PARAM_INT);
  21. $query->execute();
  22.  
  23. if($query->rowCount() == 0) {
  24. return false;
  25. }
  26. return $query->fetchALL();
  27. }
  28.  
  29. get_user_data();


dodaj i pozmieniaj co trzeba, szkielet masz na tacy wink.gif
Marcinekk
Tu się pojawia kolejny problem, nie mam zielonego pojęcia dlaczego nie pobiera tych danych. Ani Id ani loginu.
Fred1485
Ale skąd je chcesz pobrać?
Marcinekk
No z bazy danych, do tego służy ta funkcja get_user_data.

Mam przykładowo coś takiego:

  1. require 'templates/header.php';
  2.  
  3. include 'config.php';
  4.  
  5. $user_data = get_user_data();
  6.  
  7. echo '<p>Witaj <b>'.$user_data['user_name'].'</b>!</p>


Nie pokazuje tego logiu.
Fred1485
Do funkcji przekazujesz parametr(sam tak napisałeś) i na podstawie tego parametru wykonujesz zapytanie do bazy...
Marcinekk
Już nie rozumiem.

Wywołując '.$user_data['user_name'].' powinna się wykonać funkcja get_user_data i pokazać te dane, a tak nie jest.
Fred1485
1. tworzysz obiekt pdo,
2. wywołujesz funkcję get_user_data z parametrem, np get_user_data(2)
3. wykonujesz zapytanie select xxx where id = parametr
4. otrzymujesz odpowiedź
5. przetwarzasz dane

Ty chyba sam nie wiesz do czego dążysz
Marcinekk
W takim razie skoro muszę sam dodatkowe zapytanie robić to po cholere get_user_data jest?
Nie było tak jak było na samym mysql.

Robiłem zawsze u góry $user_data = get_user_data(); i gdzieś niżej
'.$user_data['user_name'].' i to normalnie pokazywało, nie musiałem sie bawić w dodatkowe zapytania.
Fred1485
Dlatego napisałem że kod który napisałem masz sobie dopasować pod siebie, zrób sobie w tej funkcji co chcesz
Marcinekk
No ale co ja mam tu zrobić? To w takim razie wcale nie rozwiązało mojego problemu.

Jest w tej funkcji przecież, że ma pobierać wszystko z tabeli panel_users a nie pobiera nic ...
Fred1485
Odpowiedz sobie na pytanie co chcesz osiągnąć a potem się za to zabierz. Nie wiem jak ci pomóc boi nie wiem co masz zamiar osiągnąć
Marcinekk
Funkcja ta służy tzn. ma służyć do pokazywania statystyk użytkownika, który to wywoła.
Coś w stylu "pokaż mój profil". Profil owszem pokazuje, ale nie pokazuje danych.
Fred1485
Więc z czym masz problem? Zapytanie ci pokazalem jak użyć z pdo.
Marcinekk
Nawet przy logowaniu:

  1. $find = $pdo->query("SELECT `user_id` FROM `panel_users` WHERE `user_name` = '{$_POST['name']}' AND `user_password` = '{$_POST['password']}' LIMIT 1");
  2. $find->execute();
  3. if ($find->fetchColumn() > 0){
  4.  
  5. $row = $find->fetchAll(PDO::FETCH_ASSOC);
  6. $_SESSION['logged'] = true;
  7. $_SESSION['user_id'] = $row['user_id'];
  8. echo '<p>'.$row['user_name'].' Zostałeś poprawnie zalogowany! Możesz teraz przejść na <a href="index.php">stronę główną</a>. '.$row['user_id'].'</p>';
  9. } else {
  10. echo '<p>Podany login i/lub hasło jest nieprawidłowe.</p>';
  11. }


Nie pokazuje tego co wywołałem przez row a nie get_user_data
Xelah
Cytat(Fred1485 @ 20.06.2015, 19:59:36 ) *
W funkcji wypadałoby odwołać się do $pdo poprzez

  1. global $pdo;


Wiem, że się czepiam, ale nawet przedszkolak wie, że NIGDY nie używa się global. NIGDY.

Jeśli już, to przekaż obiekt PDO jako parametr do funkcji. Ale nigdy, przenigdy nie używaj global...
Marcinekk
Sam mi podsyłasz z tym global i nazywasz mnie przedszkolakiem, aha.
Mógłbyś jaśniej? Nic kompletnie nie czaje z tego co ty piszesz.
Fred1485
To czy sie nie używa global to inna bajka. Tutaj dałem przyklad bardzo prosty zeby wiedzial jak zapytanie skonstruować.
nospor
Cytat
Sam mi podsyłasz z tym global i nazywasz mnie przedszkolakiem, aha.
Zamiast zakładać, ze w danym temacie piszesz tylko Ty i Fred1485, to spojrz od czasu do czasu na nick piszącego posta, a juz tym bardziej, gdy post wydaje ci sie ni z gruszki ni z pietruszki.... global podawal Fred1485, zaś post o tym, ze globala sie nie stosuje podawał zupelnie inny uzytkownik...
Xelah
Cytat(Marcinekk @ 20.06.2015, 20:47:00 ) *
Mógłbyś jaśniej? Nic kompletnie nie czaje z tego co ty piszesz.


Umiejętność czytania się kłania :)

Pozwole sobie zacytować samego siebie:

Cytat
przekaż obiekt PDO jako parametr do funkcji


Wybacz @Fred1485, ale za samo sugerowanie użycia global (bez względu na to czy cel jest szczytny czy nie) powinno się linczować. Autor pisze w dziale przedszkole i na wstępie dostaje poradę jak NIE WOLNO tego robić. I proszę, nie usprawiedliwiaj się, bo tylko pogarszasz sytuację.

Skoto ma funkcję, która wymaga obiektu DB to obiekt ten przekazuje się jej albo w parametrze, albo, jeśli to metoda klasy, w kontruktorze tejże klasy.
Mniej więcej coś takiego:

  1. function get_user_data(\PDO $pdo, $user_id = -1)
  2. {
  3. // ...
  4. }
  5.  
  6. get_user_data($pdo, 1);


Fred1485
@xelah niestety albo stety masz tu całkowitą rację i ja to rozumiem jednak nie zmieniajmy celu napisanego tematu. Sam tez się uczę smile.gif
Xelah
@Fred1485 Ależ ja nie zmieniłem tematu. Autor dostaje błąd tylko i wyłącznie dla tego, że jego funkcja nie ma dostępu do zmiennej $pdo, ponieważ ta ma inny scope. A żeby miała ten sam, to w jego przypadku należy ją przekazać jako parametr. Innego rozwiązania nie ma. I wtedy nie będzie miał błędu "Call to a member function query() on a non-object ".
Felan
Cytat(Marcinekk @ 20.06.2015, 19:50:09 ) *
  1. function get_user_data($user_id = -1) {
  2.  
  3.  
  4. if($user_id == -1) {
  5. $user_id = $_SESSION['user_id'];
  6. }
  7. $result = $pdo-> exec("SELECT * FROM `panel_users` WHERE `user_id` = '{$user_id}' LIMIT 1");
  8. if(mysql_num_rows($result) == 0) {
  9. return false;
  10. }
  11. return mysql_fetch_assoc($result);
  12. }

W PDO metoda exec() to nie to samo co query(), czy połączenie prepare() i execute() - polecam doczytać, bo tak napisane nie zadziała - exec() nie służy do odczytywania rekordów z bazy.
Polecam również zapomnieć o mysql_num_rows i innych tego typu starociach, poczytać konkretnie o PDO i tego się trzymać.

Żeby być pomocnym, a nie po prostu opowiadać pierdoły, dwa fragmenty:

  1. //tak wyglądał kiedyś kod zapytania MySQL:
  2.  
  3. mysql_connect('host', 'user', 'pass');
  4. $result = mysql_query("SELECT id, email FROM user WHERE username = '".$_GET['username']."'");
  5. $user = mysql_fetch_assoc($result);
  6.  
  7. echo $user['email']." (".$user['id'].")";
  8.  
  9.  
  10. //I to jest do kitu. Teraz robi się to tak (zapomnieć o wszystkim, co ma w nazwie "mysql_" !)
  11.  
  12. $pdo = new PDO('mysql:host=host;dbname=baza', 'user', 'pass');
  13.  
  14. $stmt = $pdo->prepare("SELECT id, email FROM user WHERE username = :username");
  15.  
  16. $stmt->execute(array(':username' => $_GET['username']));
  17.  
  18. $user = $stmt->fetch(PDO::FETCH_ASSOC);
  19.  
  20. echo $user['email']." (".$user['id'].")";


Cytat(Xelah)
Autor dostaje błąd tylko i wyłącznie dla tego, że jego funkcja nie ma dostępu do zmiennej $pdo, ponieważ ta ma inny scope. A żeby miała ten sam, to w jego przypadku należy ją przekazać jako parametr. Innego rozwiązania nie ma. I wtedy nie będzie miał błędu "Call to a member function query() on a non-object ".

Nie ma innego rozwiązania? Zawsze jest inne rozwiązanie! smile.gif Obiekt PDO można stworzyć wewnątrz funkcji, a jako parametry podać wartości z $_POST; będzie przejrzyściej - chyba że mamy w planach dużo innych zapytań, ale nie wygląda na to. Faktem jest, że trzeba coś tej funkcji dać (albo zrobić wszystko "na miejscu").

  1. SELECT `user_id` FROM `panel_users` WHERE `user_name` = '{$_POST['name']}' AND `user_password` = '{$_POST['password']}' LIMIT 1

Nie piszemy zapytań w ten sposób! Poczytaj o SQL injection, a następnie o prepared statements (czyli metodach PDO: prepare() i execute() ).

I jeszcze:

  1. $find = $pdo->query("SELECT `user_id` FROM `panel_users` WHERE `user_name` = '{$_POST['name']}' AND `user_password` = '{$_POST['password']}' LIMIT 1");
  2. $find->execute();

- nie zadziała. Jeszcze raz polecam lekturę w temacie PDO: query(), prepare(), execute(), exec() - szczególnie o tym, co zwracają te metody.
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.