Foros del Web » Programando para Internet » PHP »

Paginación Mysqli a PDO

Estas en el tema de Paginación Mysqli a PDO en el foro de PHP en Foros del Web. Esta es la original que quiero pasar a PDO, basicamente es donde ocurre la magia Código: function query($query) { function mysqli_result($res,$row=0,$col=0){ $numrows = mysqli_num_rows($res); if ...
  #1 (permalink)  
Antiguo 27/02/2020, 03:34
 
Fecha de Ingreso: abril-2009
Ubicación: Santa Cruz de Tenerife
Mensajes: 48
Antigüedad: 11 años
Puntos: 0
Paginación Mysqli a PDO

Esta es la original que quiero pasar a PDO, basicamente es donde ocurre la magia

Código:
function query($query)

	{

  

  function mysqli_result($res,$row=0,$col=0){ 

    $numrows = mysqli_num_rows($res); 

    if ($numrows && $row <= ($numrows-1) && $row >=0){

        mysqli_data_seek($res,$row);

        $resrow = (is_numeric($col)) ? mysqli_fetch_row($res) : mysqli_fetch_assoc($res);

        if (isset($resrow[$col])){

            return $resrow[$col];

        }

    }

    return false;

}   

		// Primero modificamos el query para averiguar la cantidad total

		// de registros que devuelve el query.

		$query_count = preg_replace("/SELECT(.+?)FROM/s", "SELECT COUNT(*) FROM", $query);   

		if(!$this->rs( mysqli_query($this->conn(), $query_count) ))

		{

			$this->error("Ocurrió un error al ejecutar el query <i><b>\"$query_count\"</b></i>. La base dijo : <b>".mysql_error()."</b>.");

			return false;

		}// Fin If  

		$this->total( mysqli_result($this->rs(), 0) );

		$this->totalPaginas(ceil($this->total() / $this->porPagina()));  



		// Comprobamos que no se intenta acceder a una página que no existe.

		if( $this->pagina() > $this->totalPaginas() )

		{

			$this->error("No exite la página ".$this->pagina()." de resutados. Hay solo un total de ".$this->totalPaginas());

			return false;

		}// Fin If



		// Ahora modificamos el Query del usuario, para poder agregarle

		// los límites para realizar la paginación

		$query .= " LIMIT ".($this->desde()-1).",".$this->porPagina();     

		if(!$this->rs( mysqli_query($this->conn(), $query) ))

		{

			$this->error("Ocurrió un error al ejecutar el query \"$query\". La base dijo : ".mysql_error());

			return false;

		}// Fin If   

		$this->registros( mysqli_num_rows( $this->rs() ));

		return true;

	} // function


  function obtenerArray()

	{

		return mysqli_fetch_array( $this->rs() );

	} // function
Y esta es la modificación que hice hasta ahora y es la que me da error.

Código:
	function query($query)

	{

  

		// Primero modificamos el query para averiguar la cantidad total

		// de registros que devuelve el query.

		$query_count = preg_replace("/SELECT(.+?)FROM/s", "SELECT COUNT(*) FROM", $query);  
        
        $conexion = $this->conn();                 
        
         $sql = $conexion->prepare($query_count);
         $sql->execute();
         $resultado = $sql->fetchAll();                

		if(!$this->rs( $resultado ))

		{

			$this->error("Ocurrió un error al ejecutar el query <i><b>\"$query_count\"</b></i>. La base dijo : <b>".mysql_error()."</b>.");

			return false;

		}// Fin If  
        
        $contando = $this->rs() ;                

		$this->total( $contando[0][0] );

		$this->totalPaginas(ceil($this->total() / $this->porPagina()));  
                



		// Comprobamos que no se intenta acceder a una página que no existe.

		if( $this->pagina() > $this->totalPaginas() )

		{

			$this->error("No exite la página ".$this->pagina()." de resutados. Hay solo un total de ".$this->totalPaginas());

			return false;

		}// Fin If



		// Ahora modificamos el Query del usuario, para poder agregarle

		// los límites para realizar la paginación

		$query .= " LIMIT ".($this->desde()-1).",".$this->porPagina();     
        
        $base = $conexion->prepare($query);
        $base->execute();
        $resultados = $base->fetchAll();    
         
                                       

		if(!$this->rs( $resultados ))

		{

			$this->error("Ocurrió un error al ejecutar el query \"$query\". La base dijo : ".mysql_error());

			return false;

		}// Fin If   
        
        $contando2 = $this->rs() ;
                
        //echo $contando2[0][0];
		$this->registros( $contando2[0][0]);

		return true;

	} // function

	

	function obtenerArray()

	{

		return $this->rs();

	} // function

y la verdad no funciona, porque no devuelve el array, y no se que hacer.

Gracias de antemano.
  #2 (permalink)  
Antiguo 27/02/2020, 10:19
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.032
Antigüedad: 11 años, 7 meses
Puntos: 2206
Respuesta: Paginación Mysqli a PDO

fetch_all() te devuelve un array con las filas obtenidas, entonces:

Código PHP:
Ver original
  1. $conexion = $this->conn();
  2.        
  3.          $sql = $conexion->prepare($query_count);
  4.          $sql->execute();
  5.          $resultado = $sql->fetchAll();
  6.  
  7.         var_dump($resultado); // Esto es solo para ver
  8.         // Como estás contando solo tendrás una fila y suponiendo que hay 20 registros
  9.         // La salida sería algo como array(0 => 20);
  10.  
  11.        $registros = $resultado[0]; // Este contiene la cantidad de registros leídos
  12.  
  13.        if($registros > 0) {
  14.              // Sí hay contenido para mostrar, continúa con tu  script
  15.        } else {
  16.             echo 'No se encontraron registros para mostrar.';
  17.        }
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 27/02/2020, 14:21
 
Fecha de Ingreso: abril-2009
Ubicación: Santa Cruz de Tenerife
Mensajes: 48
Antigüedad: 11 años
Puntos: 0
Respuesta: Paginación Mysqli a PDO

Si eso lo entiendo perfectamente, pero el problema lo tengo con el siguiente codigo, que no muestra los resultados, ya que tarda un monton en mostrarlos.

Código:
function obtenerArray()

	{

		return $this->rs();

	}
y esta es la parte que hace la consulta

Código:
	// Ahora modificamos el Query del usuario, para poder agregarle

		// los límites para realizar la paginación

		$query .= " LIMIT ".($this->desde()-1).",".$this->porPagina();     
        
        $base = $conexion->prepare($query);
        $base->execute();
        $resultados = $base->fetchAll();
  #4 (permalink)  
Antiguo 28/02/2020, 14:40
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.032
Antigüedad: 11 años, 7 meses
Puntos: 2206
Respuesta: Paginación Mysqli a PDO

Habría que ver tu clase completa, porque tienes métodos donde a veces envías parámetros y luego los dejas vacíos, como:

Código PHP:
Ver original
  1. $this->totalPaginas(ceil($this->total() / $this->porPagina()));  
  2.  
  3.         // Comprobamos que no se intenta acceder a una página que no existe.
  4.  
  5.         if( $this->pagina() > $this->totalPaginas() )

De hecho, me parece que estás usando métodos donde deberías usar variables, pero no puedo estar seguro sin ver el código.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 28/02/2020, 20:38
 
Fecha de Ingreso: abril-2006
Mensajes: 379
Antigüedad: 14 años
Puntos: 80
Respuesta: Paginación Mysqli a PDO

te aconsejaria que dividas tu codigo en 2 tipos, en el paginador y en la Consulta,

el paginador, solo necesita 2 datos cruciales para trabajar, PAGINA ACTUAL y TOTAL DE REGISTROS

aunque a veces es mejor trabajar por el OFFSET en lugar de paginas, pero bueno eso es tema para el departamento de CEO.

con esos 2 cosas, te sugiero crearte una funcion que te retorne los enlaces para paginar y tambien los elementos

como
$total_de_registros= $variable_count_pdo->fetchColumn(0);
$paginador = new PaginadorV2( $total_registros,$_GET['pagina_actual']);


query("SELECT loquesea FROM xyz",$paginador->limit_offset);
etc
etc

echo $paginador->html()
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9



La zona horaria es GMT -6. Ahora son las 10:51.