Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Cuda z PDO
Forum PHP.pl > Forum > Bazy danych > MySQL
Riot
Cześć, dziś mam dziwne problemy z obsługą PDO.

1. Przykładowo, w pliku gdzie mam rejestrację PDO działa sprawnie, dzisiaj zająłem się tworzeniem nowego pliku i wyskakiwał błąd

Kod
Call to a member function prepare() on a non-object in ...


Jakby nie było stworzonego obiektu, ale jest stworzony w pliku mysql.php który includuje (dlaczego w jednym pliku to działa, w drugim nie? tongue.gif)

2. Taki kodzik

  1. $select = $db->prepare('SELECT * FROM accounts WHERE id=:id');
  2. $select->bindValue(':id', $id, PDO::PARAM_STR);
  3. $select->execute();
  4. if ($select->rowCount() == 1) {
  5. $result = $select->fetch();
  6. echo count($result);
  7. }


Zwraca dwa razy te same wyniki, przykładowo mam kolumny w bazie danych id, email i login to jeśli wrzucę tą tablicę do pętli foreach będzie efekt:

Kod
id, id, email, email, login, login


Wiecie jak to ogarnąć? Dzięki za pomoc, to jako takie moje początki z PHP nie mówiac o PDO czy obiektówce...
Damonsson
Pokaż cały kod
Riot
mysql.php

  1. <?php
  2. try {
  3. $db = new PDO('mysql:host=localhost;dbname=baza', 'Riot', '');
  4. }
  5. catch (PDOException $e)
  6. {
  7. print "Coś nie tak z bazą danych!: " . $e->getMessage() . "<br/>";
  8. die();
  9. }
  10. ?>



plik z zapytaniem

  1. <?php
  2. include("core/mysql.php");
  3.  
  4. $id = "5";
  5. $select = $db->prepare('SELECT * FROM accounts WHERE id=:id');
  6. $select->bindValue(':id', $id, PDO::PARAM_STR);
  7. $select->execute();
  8. if ($select->rowCount() == 1) {
  9. $result = $select->fetch();
  10. echo count($result);
  11. return $result;
  12. }
  13. ?>
Pyton_000
1. PDO domyślnie zwraca tablicę mieszaną czyli numerowaną i asocjacyjną. Musisz jako parametr do fetch zdaje się dodać co chcesz otrzymać.
2. Pokaż plik który wykonuje zapytanie i plik który nie wykonuje zapytania
Riot
Cytat(Pyton_000 @ 15.11.2014, 20:33:44 ) *
1. PDO domyślnie zwraca tablicę mieszaną czyli numerowaną i asocjacyjną. Musisz jako parametr do fetch zdaje się dodać co chcesz otrzymać.


Dzięki, nie spotkałem się z tym lub przeoczyłem - raczej to drugie.

2. Właściwie to już zdiagnozowałem problem - pojawia się gdy wrzucam to

  1. $id = "5";
  2. $select = $db->prepare('SELECT * FROM accounts WHERE id=:id');
  3. $select->bindValue(':id', $id, PDO::PARAM_STR);
  4. $select->execute();
  5. if ($select->rowCount() == 1) {
  6. $result = $select->fetch();
  7. echo count($result);
  8. return $result;
  9. }


Do funkcji / metody w klasie. Jeśli kod nie jest w funkcji to działa.
Turson
Poczytaj o zasięgu zmiennych. Klasa nie ma dostępu do zmiennej spoza klasy jak w Twoim przypadku gdy includujesz $db
Riot
Ok, dzięki za wskazówkę. Jak pisałem - dopiero raczkuje w PHP.

Jak to rozwiązać? Użyć global, klasy statycznej czy jak? Byłbym wdziędczny za wskazanie najlepszego rozwiązania
Turson
Napisać klasę z połączeniem do db, metoda statyczna ma zwracać połączenie. Przykład
  1. class Db{
  2. protected static $_dbh;
  3. public static function getConnection(){
  4. if(!self::_$dbh)
  5. self::$_dbh = $db = new PDO('mysql:host=localhost;dbname=baza', 'Riot', '');
  6. return self::$_dbh;
  7. }
  8. }

w innej klasie, metodzie $db = Db::getConnection() i gotowe.
Riot
Było kilka błędów w Twoim kodzie, bo coś nie działało. Ale to normalne w sobotę wieczorem Lkingsmiley.png

Dzięki za pomoc, moderator o ile chce może zamknac temat.
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.