Consulta de banco de dados
Existem 3 variantes para percorrer os resultados do db:
Sem mapeador:
Execute uma consulta SQL e busque o conjunto de resultados como um array de arrays associativos:
$users = $db->exec('SELECT * FROM users');
foreach($users as $user)
echo $user['name'];//associative array
Com mapeador->carregar:
Busque as linhas do mapeador uma a uma (seu método):
$user=new \DB\SQL\Mapper($db,'users');
$user->load('');
while(!$user->dry()) {
echo $user->name;//db mapper
$user->next();
}
Com mapeador->localizar:
Busque o conjunto de resultados como uma matriz de mapeadores:
$mapper=new \DB\SQL\Mapper($db,'users');
$users=$mapper->find('');
foreach($users as $user)
echo $user->name;//db mapper
Tratamento de erros de banco de dados
\DB\SQL é uma subclasse de PDO, portanto, pode lançar exceções de PDO capturáveis. Como eles estão desabilitados por padrão, você precisa habilitá-los primeiro. Isso pode ser feito de 2 maneiras diferentes:
-
no momento da instanciação, para todas as transações:
$db = new \DB\SQL($dsn, $user, $pwd, array( \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION ));
-
posteriormente no código, por transação:
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
Uma vez que as exceções de PDO estejam habilitadas, apenas capture-as como outras exceções:
try {
$db->exec('INSERT INTO mytable(id) VALUES(?)','duplicate_id');
} catch(\PDOException $e) {
$err=$e->errorInfo;
//$err[0] contains the error code (23000)
//$err[2] contains the driver specific error message (PRIMARY KEY must be unique)
}
Isso também funciona com mapeadores de banco de dados, pois eles dependem da mesma classe DB\SQL:
$db=new \DB\SQL($dsn,$user,$pwd,array(\PDO::ATTR_ERRMODE=>\PDO::ERRMODE_EXCEPTION));
$mytable=new \DB\SQL\Mapper($db,'mytable');
try {
$mytable->id='duplicate_id';
$mytable->save();//this will throw an exception
} catch(\PDOException $e) {
$err=$e->errorInfo;
echo $err[2];//PRIMARY KEY must be unique
}