PHP - Como migrar de Mysql a PDO

 
Vista:
sin imagen de perfil

Como migrar de Mysql a PDO

Publicado por Master (7 intervenciones) el 15/04/2017 18:05:35
Hey que tal amigos tengo una duda sobre algunas funciones de Mysqli que quiero migrar a PDO e intentado migar este código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
    $con=@mysqli_connect('localhost', '', '', 'prueba');
    if(!$con){
        die("imposible conectarse: ".mysqli_error($con));
    }
    if (@mysqli_connect_errno()) {
        die("Connect failed: ".mysqli_connect_errno()." : ". mysqli_connect_error());
    }
	$action = (isset($_REQUEST['action'])&& $_REQUEST['action'] !=NULL)?$_REQUEST['action']:'';
	if($action == 'ajax'){
		include 'pagination.php'; //incluir el archivo de paginación
		//las variables de paginación
		$page = (isset($_REQUEST['page']) && !empty($_REQUEST['page']))?$_REQUEST['page']:1;
		$per_page = 10; //la cantidad de registros que desea mostrar
		$adjacents  = 4; //brecha entre páginas después de varios adyacentes
		$offset = ($page - 1) * $per_page;
		//Cuenta el número total de filas de la tabla*/
		$count_query   = mysqli_query($con,"SELECT count(*) AS numrows FROM usuario ");
		if ($row= mysqli_fetch_array($count_query)){$numrows = $row['numrows'];}
		$total_pages = ceil($numrows/$per_page);
		$reload = 'index.php';
		//consulta principal para recuperar los datos
		$query = mysqli_query($con,"SELECT * FROM usuario  order by id LIMIT $offset,$per_page");
 
		if ($numrows>0){
			?>
		<table class="table table-bordered">
			  <thead>
				<tr>
				  <th>Id</th>
				  <th>Nombre</th>
				  <th>Apellido</th>
				  <th>Cédula</th>
				</tr>
			</thead>
			<tbody>
			<?php
			while($row = mysqli_fetch_array($query)){
				?>
				<tr>
					<td><?php echo $row['id'];?></td>
					<td><?php echo $row['nombre'];?></td>
					<td><?php echo $row['apellido'];?></td>
					<td><?php echo $row['cedula'];?></td>
				</tr>
				<?php
			}
			?>
			</tbody>
		</table>
		<div class="table-pagination pull-right">
			<?php echo paginate($reload, $page, $total_pages, $adjacents);?>
		</div>
 
			<?php
 
		} else {
			?>
			<div class="alert alert-warning alert-dismissable">
              <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
              <h4>Aviso!!!</h4> No hay datos para mostrar
            </div>
			<?php
		}
	}
?>
------------------------------------------------------------------------------------------------

Y el resultado de mi conversión es la siguiente:


------------------------------------------------------------------------------------------------



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
try{
    $conn = new PDO('pgsql:host=localhost;port=5432;dbname=prueba', "prueba","1234" );
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e){
    echo "ERROR: " . $e->getMessage();
}
 
 
	$action = (isset($_REQUEST['action'])&& $_REQUEST['action'] !=NULL)?$_REQUEST['action']:'';
	if($action == 'ajax'){
		include 'pagination.php'; //incluir el archivo de paginación
		//las variables de paginación
		$page = (isset($_REQUEST['page']) && !empty($_REQUEST['page']))?$_REQUEST['page']:1;
		$per_page = 10; //la cantidad de registros que desea mostrar
		$adjacents  = 4; //brecha entre páginas después de varios adyacentes
		$offset = ($page - 1) * $per_page;
		//Cuenta el número total de filas de la tabla
		$sql   = $conn->prepare("SELECT count(*) AS numrows FROM usuario");
		if ($row= $sql->fetchAll()){$numrows = $row['numrows'];}
		$total_pages = ceil($numrows/$per_page);
		$reload = 'index.php';
		//consulta principal para recuperar los datos
		$query = $conn->prepare("SELECT * FROM usuario  order by id LIMIT $offset,$per_page");
 
		if ($numrows>0){
			?>
		<table class="table table-bordered">
			  <thead>
				<tr>
				  <th>Id</th>
				  <th>Nombre</th>
				  <th>Apellido</th>
				  <th>Cédula</th>
				</tr>
			</thead>
			<tbody>
			<?php
			while($row = $query->fetchAll()){
				?>
				<tr>
					<td><?php echo $row['id'];?></td>
					<td><?php echo $row['nombre'];?></td>
					<td><?php echo $row['apellido'];?></td>
					<td><?php echo $row['cedula'];?></td>
				</tr>
				<?php
			}
			?>
			</tbody>
		</table>
		<div class="table-pagination pull-right">
			<?php echo paginate($reload, $page, $total_pages, $adjacents);?>
		</div>
 
			<?php
 
		} else {
			?>
			<div class="alert alert-warning alert-dismissable">
              <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
              <h4>Aviso!!!</h4> No hay datos para mostrar
            </div>
			<?php
		}
	}
?>

Pero no me muestra la información de la tabla usuario y cuando estaba en Mysql si lo cual me hace pensar que es un problema con las funciones espero puedan ayudarme!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 2.325
Plata
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Como migrar de Mysql a PDO

Publicado por kip (877 intervenciones) el 15/04/2017 19:23:05
Hola, veamos las funciones que usas para realizar la consulta y obtener el conjunto de resultados de esta:

1
2
$sql   = $conn->prepare("SELECT count(*) AS numrows FROM usuario");
if ($row= $sql->fetchAll()){$numrows = $row['numrows'];}

Aqui preparas la consulta y luego sin ejecutarla quieres acceder al conjunto de resultados, fijémonos en la documentacion:

Prepara una sentencia SQL para ser ejecutada por el método PDOStatement::execute().
http://php.net/manual/es/pdo.prepare.php

Entonces intentmoslo:

1
2
$sql   = $conn->prepare("SELECT count(*) AS numrows FROM usuario");
$sql->execute();

Ahora veamos que dice la documentacion de fetchAll():

PDOStatement::fetchAll() devuelve un array que contiene todas las filas restantes del conjunto de resultados.
http://php.net/manual/es/pdostatement.fetchall.php

Segun se entiende esta funcion o metodo retorna todos los resultados luego de ejecutar la consulta, entonces no es necesario usar el while ya que fetchAll() no mueve el puntero interno hacia la siguiente fila de resultados.

Puedes usar fetch() en ese caso:

Obtiene la siguiente fila de un conjunto de resultados
http://php.net/manual/es/pdostatement.fetch.php

Por cierto en lugar de incluir las variables directamente en la query como lo haces, deberias aprovechar PDO para enviar los parametros quizas en forma de sustitucion algo asi:


1
2
3
4
5
$query = $conn->prepare("SELECT * FROM usuario  ORDER BY id LIMIT ?, ?");
$query->execute(array($offset, $per_page));
while($row= $query->fetch(PDO::FETCH_ASSOC)) {
.....
...

O tal vez enviar los parametros con nombre:

1
2
3
4
5
$query = $conn->prepare("SELECT * FROM usuario  ORDER BY id LIMIT :offset, :per_page");
$query->execute(array(':offset' => $offset, ':per_page' => $per_page));
while($row= $query->fetch(PDO::FETCH_ASSOC)) {
.....
...

http://php.net/manual/es/pdostatement.execute.php

Se usa esta forma para evitar cualquier tipo de ataque de SQLInjection.

Prueba y nos cuentas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Como migrar de Mysql a PDO

Publicado por Master (7 intervenciones) el 15/04/2017 19:45:27
ok voy a probar! Gracias!!!

ya probé y me quedó así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
try{
    $conn = new PDO('pgsql:host=localhost;port=5432;dbname=pautana', "yordy","1234" );
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e){
    echo "ERROR: " . $e->getMessage();
}
 
 
	$action = (isset($_REQUEST['action'])&& $_REQUEST['action'] !=NULL)?$_REQUEST['action']:'';
	if($action == 'ajax'){
		include 'pagination.php'; //incluir el archivo de paginación
		//las variables de paginación
		$page = (isset($_REQUEST['page']) && !empty($_REQUEST['page']))?$_REQUEST['page']:1;
		$per_page = 10; //la cantidad de registros que desea mostrar
		$adjacents  = 4; //brecha entre páginas después de varios adyacentes
		$offset = ($page - 1) * $per_page;
		//Cuenta el número total de filas de la tabla
		//$sql   = $conn->prepare("SELECT count(*) AS numrows FROM usuario");
		$sql   = $conn->prepare("SELECT * FROM usuario");
		$numrows=$sql->rowCount();
		$ejecucion= $sql->execute();
		$resultado= $sql->fetchAll();
		//if ($row= $resultado){$numrows = $row['numrows'];}
		$total_pages = ceil($numrows/$per_page);
		$reload = 'index.php';
		//consulta principal para recuperar los datos
		$query = $conn->prepare("SELECT * FROM usuario  ORDER BY id LIMIT :offset, :per_page");
		$query->execute(array(':offset' => $offset, ':per_page' => $per_page));
		$result= $query->fetchAll();
 
		if ($numrows>0){
			?>
		<table class="table table-bordered">
			  <thead>
				<tr>
				  <th>Id</th>
				  <th>Nombre</th>
				  <th>Apellido</th>
				  <th>Cédula</th>
				</tr>
			</thead>
			<tbody>
			<?php
			while($row= $query->fetch(PDO::FETCH_ASSOC)) {
				?>
				<tr>
					<td><?php echo $row['id'];?></td>
					<td><?php echo $row['nombre'];?></td>
					<td><?php echo $row['apellido'];?></td>
					<td><?php echo $row['cedula'];?></td>
				</tr>
				<?php
			}
			?>
			</tbody>
		</table>
		<div class="table-pagination pull-right">
			<?php echo paginate($reload, $page, $total_pages, $adjacents);?>
		</div>
 
			<?php
 
		} else {
			?>
			<div class="alert alert-warning alert-dismissable">
              <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
              <h4>Aviso!!!</h4> No hay datos para mostrar
            </div>
			<?php
		}
	}
?>
pero sigue sin mostrarme los registros y me dice que la sintasys limit no está soportada!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Como migrar de Mysql a PDO

Publicado por Master (7 intervenciones) el 15/04/2017 20:22:20
dejo adjunto el ejemplo a ver si me puedes hechar una mano, el de postgre es paginación y mysql paginaciónmysql! el de mysql funciona perfecto pero el de postgre me a dado muchos problemas Gracias por tu tiempo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Como migrar de Mysql a PDO

Publicado por Master (7 intervenciones) el 16/04/2017 01:00:35
Kip dime que observsates en el código? la cuestión es que me manda un error en la sentencia donde se coloca el by limit y no me muestra los resultados estoy llegando a pensar que asì no se hace en postgre necesito que me eches una mano viejo el error está entre la linea 29 y 30
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 2.325
Plata
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Como migrar de Mysql a PDO

Publicado por kip (877 intervenciones) el 16/04/2017 01:08:11
Creo que el problemA esta en que en PostgreSQL no existe lo que en MySQL, el atajo de LIMIT en lugar de usar LIMIT numlimite OFFSET offset simplemente puede usarse como tienes ahora LIMIT offset, numlimite esto en el caso de MySQL, en PostgreSQL no existe esta sintaxis.

Prueba asi:

1
$query = $conn->prepare("SELECT * FROM usuario  ORDER BY id LIMIT :per_page OFFSET :offset");
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Como migrar de Mysql a PDO

Publicado por Master (7 intervenciones) el 16/04/2017 03:07:24
Ok, Gracias por tu ayuda creo que eso era lo que faltaba probaré y te aviso, sigue así
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Como migrar de Mysql a PDO

Publicado por Master (7 intervenciones) el 16/04/2017 03:23:11
Ya no me sale el problema pero me dice que no se encontraron datos para mostrar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 2.325
Plata
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Como migrar de Mysql a PDO

Publicado por kip (877 intervenciones) el 16/04/2017 03:36:04
El problema que olvide colocar mas arriba es que ejecutas rowCount() antes de ejecutar el metodo execute() deberia ser despues, pero si nos remitimos a la documentacion hay algo importante:

Si la última sentencia SQL ejecutada por el objeto PDOStatement asociado fue una sentencia SELECT, algunas bases de datos podrían devolver el número de filas devuelto por dicha sentencia. Sin embargo, este comportamiento no está garantizado para todas las bases de datos y no debería confiarse en él para aplicaciones portables.
http://php.net/manual/es/pdostatement.rowcount.php

Y alli mismo dan un ejemplo de como obtener el numero de resultados, es parecido a como hacias antes con COUNT() pero en lugar de usar prepare() usan query() y luego fetchColumn() para obtener directamente la primera columna de la fila de resultados.

Ahora modifique tu codigo, pruebalo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
try {
    $conn = new PDO('pgsql:host=localhost;port=5432;dbname=pautana', "yordy","1234" );
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo "ERROR: " . $e->getMessage();
}
 
	$action = (isset($_REQUEST['action'])&& $_REQUEST['action'] !=NULL)?$_REQUEST['action']:'';
	if($action == 'ajax'){
		include 'pagination.php'; //incluir el archivo de paginación
		//las variables de paginación
		$page = (isset($_REQUEST['page']) && !empty($_REQUEST['page']))?$_REQUEST['page']:1;
		$per_page = 10; //la cantidad de registros que desea mostrar
		$adjacents  = 4; //brecha entre páginas después de varios adyacentes
		$offset = ($page - 1) * $per_page;
		//Cuenta el número total de filas de la tabla
		$sql   = $conn->query("SELECT COUNT(*) FROM usuario");
		$numrows = $sql->fetchColumn();
		$total_pages = ceil($numrows/$per_page);
		$reload = 'index.php';
		//consulta principal para recuperar los datos
		$query = $conn->prepare("SELECT * FROM usuario ORDER BY id LIMIT :per_page OFFSET :offset");
		$query->execute(array(':offset' => $offset, ':per_page' => $per_page));
		if ($numrows > 0){
			?>
		<table class="table table-bordered">
			  <thead>
				<tr>
				  <th>Id</th>
				  <th>Nombre</th>
				  <th>Apellido</th>
				  <th>Cédula</th>
				</tr>
			</thead>
			<tbody>
			<?php
			while($row = $query->fetch(PDO::FETCH_ASSOC)) {
				?>
				<tr>
					<td><?php echo $row['id'];?></td>
					<td><?php echo $row['nombre'];?></td>
					<td><?php echo $row['apellido'];?></td>
					<td><?php echo $row['cedula'];?></td>
				</tr>
				<?php
			}
			?>
			</tbody>
		</table>
		<div class="table-pagination pull-right">
			<?php echo paginate($reload, $page, $total_pages, $adjacents);?>
		</div>
 
			<?php
 
		} else {
			?>
			<div class="alert alert-warning alert-dismissable">
              <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
              <h4>Aviso!!!</h4> No hay datos para mostrar
            </div>
			<?php
		}
	}
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Como migrar de Mysql a PDO

Publicado por Master (7 intervenciones) el 16/04/2017 04:16:55
No te lo creo, por Dios has dado con el problema eres grande!!! ahora si que muestra los resultados, oye eres un docente o algo así? de verdad Gracias por tu ayuda!!! Lo probé con el rowCount(); y funcionó pero voy a seguir tu indicación de que es mas fiable usar el contador dentro de la consulta!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar