Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]PDO po raz kolejny
Marcinekk
post
Post #1





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 27.09.2013

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Marcinekk
post
Post #2





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 27.09.2013

Ostrzeżenie: (10%)
X----


  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. }
Go to the top of the page
+Quote Post
Felan
post
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 6
Dołączył: 30.11.2006

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


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! (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post

Posty w temacie
- Marcinekk   [MySQL][PHP]PDO po raz kolejny   20.06.2015, 17:59:31
- - Kshyhoo   Przepisywanie przestarzałych funkcji MySQL na PDO   20.06.2015, 18:04:32
- - Marcinekk   No tak, ale i tak wywala, że nie ma takiej funkcji...   20.06.2015, 18:05:43
- - Fred1485   Co trzymasz w zmiennej $pdo bo na pewno nie j...   20.06.2015, 18:13:25
- - Kshyhoo   Nie, że nie ma funkcji query, tylko, że nie jest o...   20.06.2015, 18:14:29
- - Marcinekk   [PHP] pobierz, plaintext try { $pdo = new PD...   20.06.2015, 18:14:36
- - Fred1485   Połączenie masz nawiązane? Nie rzuca wyjątkiem?   20.06.2015, 18:39:11
- - Marcinekk   Jest nawiązane, wstawiłem kod jak to wygląda..   20.06.2015, 18:40:03
- - Fred1485   Podeślij cały kod jak możesz.   20.06.2015, 18:49:29
- - Marcinekk   [PHP] pobierz, plaintext try { $pdo = new PD...   20.06.2015, 18:50:09
|- - Felan   Cytat(Marcinekk @ 20.06.2015, 19:50:0...   22.06.2015, 20:13:12
- - Fred1485   W funkcji wypadałoby odwołać się do $pdo popr...   20.06.2015, 18:59:36
|- - Xelah   Cytat(Fred1485 @ 20.06.2015, 19:59:36...   20.06.2015, 19:44:42
- - Marcinekk   Lol, wcześniej to tam umieszczałem i nie działało....   20.06.2015, 19:01:46
- - Fred1485   [PHP] pobierz, plaintext $mysql_host = '';$databas...   20.06.2015, 19:02:16
- - Marcinekk   Tu się pojawia kolejny problem, nie mam zielonego ...   20.06.2015, 19:13:16
- - Fred1485   Ale skąd je chcesz pobrać?   20.06.2015, 19:15:12
- - Marcinekk   No z bazy danych, do tego służy ta funkcja get_use...   20.06.2015, 19:16:30
- - Fred1485   Do funkcji przekazujesz parametr(sam tak napisałeś...   20.06.2015, 19:20:06
- - Marcinekk   Już nie rozumiem. Wywołując '.$user_data...   20.06.2015, 19:21:38
- - Fred1485   1. tworzysz obiekt pdo, 2. wywołujesz funkcję get_...   20.06.2015, 19:24:22
- - Marcinekk   W takim razie skoro muszę sam dodatkowe zapytanie ...   20.06.2015, 19:26:09
- - Fred1485   Dlatego napisałem że kod który napisałem masz sobi...   20.06.2015, 19:27:42
- - Marcinekk   No ale co ja mam tu zrobić? To w takim razie wcale...   20.06.2015, 19:28:45
- - Fred1485   Odpowiedz sobie na pytanie co chcesz osiągnąć a po...   20.06.2015, 19:31:09
- - Marcinekk   Funkcja ta służy tzn. ma służyć do pokazywania sta...   20.06.2015, 19:33:07
- - Fred1485   Więc z czym masz problem? Zapytanie ci pokazalem j...   20.06.2015, 19:39:56
- - Marcinekk   Nawet przy logowaniu: [PHP] pobierz, plaintext ...   20.06.2015, 19:41:22
- - Marcinekk   Sam mi podsyłasz z tym global i nazywasz mnie prze...   20.06.2015, 19:47:00
|- - Xelah   Cytat(Marcinekk @ 20.06.2015, 20:47:0...   21.06.2015, 19:31:29
- - Fred1485   To czy sie nie używa global to inna bajka. Tutaj d...   20.06.2015, 20:03:14
- - nospor   CytatSam mi podsyłasz z tym global i nazywasz mnie...   21.06.2015, 11:10:55
- - Fred1485   @xelah niestety albo stety masz tu całkowitą rację...   21.06.2015, 20:16:01
- - Xelah   @Fred1485 Ależ ja nie zmieniłem tematu. Autor dost...   22.06.2015, 07:25:24


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: 17.10.2025 - 08:14