Siemka

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
*/
static public function getInstance
() {
{
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
*/
static private function _injection
(&$values) {
$badWords = array('SELECT', 'INSERT', 'UPDATE', 'TRUNCATE', 'DELETE', 'UNION', '--');
for ($i = 0; $i < count($values); $i++) {
}
for ($i = 0; $i < count($values); $i++) {
for ($j = 0; $j < count($badWords); $j++) {
if (strpos($values[$i], $badWords[$j])) return true;
}
}
return false;
}
/**
* Wykonuje podane zapytanie
*
* @param string $query
* @param array $values
* @return object
*/
static public function execute
($query, $values) {
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
*/
static public function fetch
($statement) {
{
return $statement -> getData();
}
else
{
throw new MyException('$statement is not an object', 0, __FILE__, __LINE__);
}
}
}
?>
I potem odpowiednio:
<?php
$stmt = DB
:: execute
('CALL blablabla(?)', array(1
)); $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?