
Napisałem sobie aplikacje odpowiedzialną za bazę danych, jednak coś w niej niedziała.
Mianowicie, gdy wywołuję pierwsze zapytanie (procedura, która zwraca więcej niż 1 rekord) jest ok, ale gdy próbuje wykonać drugi raz inne zapytanie, które zwraca więcej niż 1 rekord, nie otrzymuje niczego.
Kod wygląda tak:
<?php class MyPDO extends PDO { /* Link z bazą danych */ /* Ilosc wykonanych zapytan */ /** * Inicjalizacja połączenia z bazą danych przez PDO */ public function __construct() { self :: $pdo = new parent('mysql:host=localhost;dbname=db', 'root', ''); } /** * Pobranie instancji obiektu bazy danych * * @return object */ { { new MyPDO(); } return self :: $pdo; } } class Statement extends PDOStatement { /* Przygotowane zapytanie do bazy */ private $preparedQuery; /** * Inicjalizacja obiektu * * @param string $prepared * @param array $values */ public function __construct($prepared, $values) { $this -> preparedQuery = $prepared; $this -> getResult($values); } /** * Inicjalizacja zapytania do bazy * * @param array $values */ private function getResult($values) { $this -> preparedQuery -> execute($values); } /** * Pobranie danych z zapytania * * @return array */ public function getData() { $data = $this -> preparedQuery -> fetchAll(); return $data; } } class DB extends MyPDO { /** * Sprawdza, czy w podanej tablicy nie wystepuje sql injection * * @param arrray $query * @return bool */ { { } { { return true; } } return false; } /** * Wykonuje podane zapytanie * * @param string $query * @param array $values * @return object */ { if (!self :: _injection($values)) { { parent :: $queries++; $connection = parent :: getInstance(); $sth = $connection -> prepare($query); return new Statement($sth, $values); } else { throw new MyException('$values is not an array.', 0, __FILE__, __LINE__); } } else { throw new MyException('SQL injection detected!', 0, __FILE__, __LINE__); } } /** * Zwraca wszystkie wyniki z podanego obiektu zapytania * * @param object $statement * @return 2-d array */ { { return $statement -> getData(); } else { throw new MyException('$statement is not an object', 0, __FILE__, __LINE__); } } } ?>
I potem odpowiednio:
<?php $data = DB :: fetch($stmt); ?>
No, i oczywiście print_r($this -> errorInfo()); wyrzuca pustego arraya, czyli nie ma błędu

W ogóle czy takie rozwiązanie jest dobre? Tzn podzielić całość na 3 klasy, jedna od połączenia, druga od statement a trzecia do obsługi?