Cita:
Iniciado por bandolera Hola. Gracias por tu respuesta tan descriptiva. Pero tengo algunas dudas:
1) En el caso del if(), en qué caso podría haber un arreglo vacío? No se supone que con el rowcount() ya se validó eso?
1.b) Pusiste:
Eso lo decides tu, es válido regresar false o un arreglo vacío.
Cita: 2) Lo último que dices que no es necesario la asignación y que deje que PDO llene los objetos. No es necesario usar el VO? A qué te refieres exactamente y cómo varía el proceso? No entendí.
Gracias.
Los métodos
fetch y
fetchAll pueden regresar un objeto usando le opción
PDO::FETCH_CLASS esto hace que estos métodos regresen un objeto de una clase que tu indiques. El llenado del objeto se realiza usando los nombres de propiedades que sean igual a las que regresa el resultado de la consulta.
Como ejemplo voy a usar una clase sencilla que solo tiene nombre y correo el nombre de estas propiedades corresponde con los mismo nombres que se tiene en la base de datos.
Código PHP:
Ver originalclass User {
private $name;
private $email;
public function name()
{
return $this->name;
}
public function email()
{
return $this->email;
}
}
El código que llena la clase puede ser algo como esto:
Código PHP:
Ver originaltry{
$dbh = new PDO($dsn, $user, $pass, $options);
$sqlResult = $dbh->query('select * from users');
$rows = $sqlResult->fetchAll( PDO::FETCH_CLASS, User::class );
foreach ($rows as $row) {
echo "<p>{$row->name()}</p>";
echo "<p>{$row->email()}</p>";
}
}
// Catch any errors
catch(PDOException $e){
$error = $e->getMessage();
}
Si te das cuenta, obtuvimos un arreglo de objetos de la clase User y no tuve que asignar, llamar a métodos o crear el objeto para asignar los valores.
Te dejo como lo haces tu para que observes las diferencias:
Código PHP:
Ver originalwhile ($fila = $stm->fetch(PDO::FETCH_ASSOC)) {
$salida[] = new ClienteVO($fila['codigo'], $fila['nombre']);
}