Consulta de base de datos
Hay 3 variantes para recorrer los resultados de la base de datos:
Sin asignador:
Ejecute una consulta SQL y obtenga el conjunto de resultados como una matriz de matrices asociativas:
$users = $db->exec('SELECT * FROM users');
foreach($users as $user)
echo $user['name'];//associative array
Con mapeador->cargar:
Obtén las filas del mapeador una por una (tu método):
$user=new \DB\SQL\Mapper($db,'users');
$user->load('');
while(!$user->dry()) {
echo $user->name;//db mapper
$user->next();
}
Con mapeador->buscar:
Obtener el conjunto de resultados como una matriz de mapeadores:
$mapper=new \DB\SQL\Mapper($db,'users');
$users=$mapper->find('');
foreach($users as $user)
echo $user->name;//db mapper
Manejo de errores de base de datos
\DB\SQL es una subclase de PDO, por lo que puede generar excepciones de PDO detectables. Dado que estos están deshabilitados de forma predeterminada, primero debe habilitarlos. Esto se puede hacer de 2 maneras diferentes:
-
en el momento de la instanciación, para todas las transacciones:
$db = new \DB\SQL($dsn, $user, $pwd, array( \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION ));
-
más adelante en el código, por transacción:
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
Una vez que las excepciones de PDO están habilitadas, simplemente tómelas como otras excepciones:
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)
}
Esto también funciona con los mapeadores de base de datos, ya que se basan en la misma clase 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
}