Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Mostrar resultado o mensaje

Estas en el tema de Mostrar resultado o mensaje en el foro de PHP en Foros del Web. Hola chicos. Tengo esta clase donde se ejecuta una búsqueda con LIKE. Si hay registros, creo el arreglo $salida[], si no hay registros asigno a ...
  #1 (permalink)  
Antiguo 06/06/2017, 16:40
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Mostrar resultado o mensaje

Hola chicos.
Tengo esta clase donde se ejecuta una búsqueda con LIKE.
Si hay registros, creo el arreglo $salida[], si no hay registros asigno a $salida el valor FALSE.
Código PHP:
$conecta = new Data();
$stm $conecta->prepare("SELECT codigo, nombre FROM tabla WHERE nombre LIKE ?");
$stm->bindValue(1"%$valor%"PDO::PARAM_STR);
$stm->execute();
if (
$stm->rowCount() > 0) { 
    while (
$fila $stm->fetch(PDO::FETCH_ASSOC))
    {
        
$salida[] = new ClienteVO($fila['codigo'], $fila['nombre']);
    }
} else { 
    
$salida FALSE;
}
return 
$salida
En el controlador pregunto si $listas (que recibe datos) es verdadero. Si lo es asigna la plantilla si es falso imprime mensaje "No hay Registros".

Código PHP:
$DAO = new ClienteDAO();

$listas $DAO->Buscar_like($_POST['dato']);
$tpl = new Plantilla();
if(
$listas)
{
    
$tpl->assign('lista'$listas);
    
$tpl->assign('NoRegistros'"");        
} else {
    
$tpl->assign('lista'"");
    
$tpl->assign('NoRegistros'"No hay Registros");
}
$tpl->display("mostrar.tpl.php"); 
Mi vista usando Smarty:
Código PHP:
<table id="miTabla">
    <
tr>
        <
th>Código</th>
        <
th>Nombre Stud</th>
    </
tr>
    {
section name=i loop=$lista}
    <
tr>
        <
td>{$lista[i]->codigo}</td>
        <
td>{$lista[i]->nombre}</td>
    </
tr>
    {/
section}

    {if 
$NoRegistros}
    <
h3>{$NoRegistros}</h3>
    {/if}
</
table
Todo esto funciona pero tengo dos dudas:
1) Está bien que utilice if($listas) para saber si es verdadero o falso? o debo utilizar isset() ?
2) El uso de smarty al tener o no registros que mostrar se puede simplificar?
Gracias por su ayuda.
Mi sistema ya está casi caminando.
__________________
Todos somos iguales. NO! a la violencia de género.
  #2 (permalink)  
Antiguo 08/06/2017, 10:52
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Mostrar resultado o mensaje

Bandoler sengun entiendo esta parte esta dentro de un método de tu clase
Código PHP:
Ver original
  1. if ($stm->rowCount() > 0) {  
  2.     while ($fila = $stm->fetch(PDO::FETCH_ASSOC))
  3.     {
  4.         $salida[] = new ClienteVO($fila['codigo'], $fila['nombre']);
  5.     }
  6. } else {  
  7.     $salida = FALSE;
  8. }
  9. return $salida;
De ser así, no necesitas el if else, y puedes regresar false o un arreglo vació
Código PHP:
Ver original
  1. if ($stm->rowCount() > 0) {
  2.     return false; // or return [];
  3. }
  4.  
  5. while ($fila = $stm->fetch(PDO::FETCH_ASSOC)) {
  6.     $salida[] = new ClienteVO($fila['codigo'], $fila['nombre']);
  7. }
  8.  
  9. return $salida;
En el if, debed de usar el not(!) ya que un arreglo vacío el if lo toma como false así que esto
Código PHP:
Ver original
  1. $tpl = new Plantilla();
  2. if($listas)
  3. {
  4.     $tpl->assign('lista', $listas);
  5.     $tpl->assign('NoRegistros', "");        
  6. } else {
  7.     $tpl->assign('lista', "");
  8.     $tpl->assign('NoRegistros', "No hay Registros");
  9. }
  10. $tpl->display("mostrar.tpl.php");
debe ser algo como
Código PHP:
Ver original
  1. $tpl = new Plantilla();
  2. if(!$listas)
  3. {
  4.     $tpl->assign('lista', $listas);
  5.     $tpl->assign('NoRegistros', "");        
  6. } else {
  7.     $tpl->assign('lista', "");
  8.     $tpl->assign('NoRegistros', "No hay Registros");
  9. }
  10. $tpl->display("mostrar.tpl.php");
Si no quieres usar la negación entonces usa empty pero no es necesario.
La parte que tienes en el if de listas lo puedes hacer un poco mas legible usando un helper y puedes hacer algo como esto.
Código PHP:
Ver original
  1. function view($template, Array $data) {
  2.    
  3.     $tpl = new Plantilla();
  4.    
  5.     foreach($data as $key => $value) {
  6.         $tpl->assign($key, $value);
  7.     }
  8.    
  9.     $tpl->display($template);
  10.    
  11. }
Y esto lo puedes incluir en código original
Código PHP:
Ver original
  1. if(!$listas)
  2. {
  3.     view('mostrar.tpl.php', ['listas' => $listas, 'NoRegistros' => '']);
  4. } else {
  5.     view('mostrar.tpl.php', ['listas' => '', 'NoRegistros' => 'No hay Registros']);
  6. }
si ves como se simplifica ?
Otras mejoras que puedes hacer es usar la opción PDO::FETCH_CLASS de fetch y dejar que PDO llene tus objetos y evitas hacer la asignación que tienes en el while.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 08/06/2017, 12:14
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Respuesta: Mostrar resultado o mensaje

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:
Código PHP:
if ($stm->rowCount() > 0) {
    return 
false// or return [];

Pero siguiendo tu lógica creo que debería ser:
Código PHP:
if ($stm->rowCount() = 0) {
    return 
false// or return [];

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.
__________________
Todos somos iguales. NO! a la violencia de género.

Última edición por bandolera; 08/06/2017 a las 13:25
  #4 (permalink)  
Antiguo 09/06/2017, 13:36
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Mostrar resultado o mensaje

Cita:
Iniciado por bandolera Ver Mensaje
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 original
  1. class User {
  2.  
  3.     private $name;
  4.  
  5.     private $email;
  6.  
  7.     public function name()
  8.     {
  9.         return $this->name;
  10.     }
  11.  
  12.     public function email()
  13.     {
  14.         return $this->email;
  15.     }
  16. }

El código que llena la clase puede ser algo como esto:
Código PHP:
Ver original
  1. try{
  2.     $dbh = new PDO($dsn, $user, $pass, $options);
  3.  
  4.     $sqlResult = $dbh->query('select * from users');
  5.     $rows = $sqlResult->fetchAll( PDO::FETCH_CLASS, User::class );
  6.  
  7.     foreach ($rows as $row) {
  8.         echo "<p>{$row->name()}</p>";
  9.         echo "<p>{$row->email()}</p>";
  10.     }
  11. }
  12.     // Catch any errors
  13. catch(PDOException $e){
  14.     $error = $e->getMessage();
  15. }
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 original
  1. while ($fila = $stm->fetch(PDO::FETCH_ASSOC)) {
  2.     $salida[] = new ClienteVO($fila['codigo'], $fila['nombre']);
  3. }
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: mensaje, resultado, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:06.