Conexión a base de datos MySQL con PDO desde PHP

Fecha Publicación:       24 de Julio de 2019
Fecha Modificación:       05 de Octubre de 2019

Conexión a la base de datos MySQL con PDO

<?php
define('DATABASE',   'apar');
define('BD_USUARIO', 'root');
define('BD_CLAVE',   '');
define('SERVER_MYSQL', 'mysql:host=localhost;dbname='.DATABASE.';charset=utf8');
try
{
	$conexion = new PDO(SERVER_MYSQL, BD_USUARIO, BD_CLAVE);	
}
catch(Exception $e)
{
        die('Error : '.$e->getMessage());
}


Consulta a la base de datos MySQL con PDO

Una vez hecho la conexión con la base de datos  utilizando PDO veremos como realizar las consultas a dicha base de datos. 

Para consultar a la base de datos lo podemos hacer de 2 maneras:

1 Forma - PDO::query  : Para consultas que devuelven valores: por ejemplo Consultas Select.

2 Forma - PDO::prepare :  Es la mas segura evitamos ataques de inyección SQL.
Utilizada para realizar consultas sin resultado: Insert, update, delete, drop, truncate y create. Consultas que no devuelven ningún valor.

Metodo Prepare = consultas preparadas

El método para efectuar consultas es primero preparar la consulta con

PDO->prepare($consulta) y después ejecutarla con 
PDO->execute([parámetros]), que devuelve el resultado de la consulta.

// Consulta preparada
$sqlconsulta = "SELECT * FROM mitabla";
$rs_resultado= $conexion->prepare($sqlconsulta);
$rs_resultado->execute();

//Para acceder a los valores devueltos por la consulta select utilizamos el método fetch
while($row_registro= $rs_resultado->fetch()) {
    echo "NOMBRE:".$row_registro['nombre'].
         ",DNI:" . $row_registro['DNI'] . "<br>";
}


Acceder los valores devueltos por una consulta

fetch =  Abre como un puntero listo para recorrer los datos uno por uno (generalmente mediante un ciclo while). Es el método recomendado cuando se esperan muchos datos, porque de ese modo no tendrás problemas de memoria.

Ejemplo de código:

$rs_resultado= $conexion->prepare($sql);
$rs_resultado->execute();
while ($row_registro= $rs_resultado->fetch(PDO::FETCH_ASSOC)) {
  $datos []= $row_registro;
}

Aquí $datos será un array asociativo que se irá llenando con una fila cada vez que el puntero avanza dentro del while.

También, se puede imprimir el dato in situ si no se necesita para transportarlo a otro lugar:

while ($row_registro= $rs_resultado->fetch(PDO::FETCH_ASSOC)) {
  echo $row_registro["nombre"]." ".$row_registro["apellido"].PHP_EOL;
}

 

fetchAll = Te trae todos los datos de golpe, sin abrir ningún puntero, almacenándolos en un array. Se recomienda cuando no se esperan demasiados resultados que podrían provocar problemas de memoria al querer guardar de golpe en un array miles o millones de filas ¡! provenientes de un SELECT.

Ejemplo de código:

$row_registro = $rs_resultado->fetchAll(PDO::FETCH_ASSOC);
print_r($row_registro);

En este caso $row_registro es un array asociativo con todos los datos de la consulta. Si se quieren leer las filas que hay en él, se puede implementar un bucle que recorra el array:

foreach ($row_registro as $row){
    echo $row["nombre"]." ".$row["apellido"].PHP_EOL;
}

Es casi lo mismo que en fetch, sólo que aquí no estamos actuando sobre un recorrido de los datos a través de un puntero, sino sobre los datos ya almacenados en una variable. Si por ejemplo antes de esto nosotros cerramos el statemente, ya tenemos los datos en $row_registro y podremos leerlos. En fetch si cerramos el statement no podremos leer los datos.

Referencia:

https://es.stackoverflow.com/questions/184341/diferencia-entre-fetch-y-fetchall-en-php


Mostrar datos de consulta PDO en formato JSON
:

$rs_resultado= $conexion->prepare($sql);
$rs_resultado->execute();
$row_registro= $rs_resultado->fetchAll(PDO::FETCH_ASSOC)
echo json_encode($row_registro)

JSON es un formato de texto que es completamente independiente del lenguaje pero utiliza convenciones que son ampliamente conocidos por los programadores de la familia de lenguajes C, incluyendo C, C++, C#, Java, JavaScript, Perl, Python, y muchos otros. Estas propiedades hacen que JSON sea un lenguaje ideal para el intercambio de datos.

Dentro del lenguaje PHP podemos tener como respuesta de una consulta a una BD un array asociactivo del tipo:

$datos = array(
	array("nombre" => "juan", "edad" => 34),
	array("nombre" => "pepe", "edad" => 36)
);

Ahora para mandarlo en formato JSON y que el frontend lo pueda parsear y pintar en una vista hacemos lo siguiente

echo json_encode($datos);

Lo que nos dará como resultado:

[{
	"nombre": "juan",
	"edad": 34
}, {
	"nombre": "pepe",
	"edad": 36
}]


Insertar Registros a la base de datos MySQL con PDO

 extract($_POST); 	
	$sql_insertar_cotiza = $bdd->prepare("INSERT INTO mitabla(campo1,campo2,campo3) 
	values(
	:campo1,
	:campo2,
	:campo3
       )");
    $sql_insertar_cotiza->bindParam(':campo1', $_POST['campo1']);
    $sql_insertar_cotiza->bindParam(':campo2', $_POST['campo2']);
    $sql_insertar_cotiza->bindParam(':campo3', $_POST['campo3']);
    $estado_isertar_coti = $sql_insertar_cotiza->execute();	
    if ($estado_isertar_coti == false) {
	 print_r($sql_insertar_cotiza->errorInfo());
	 die ('Erreur execute');
    }

¿Cuál es la diferencia entre bindParam() y bindValue() en PDO?

AMBOS protegen por igual contra inyección SQL.

Es decir, en PDOStatement::bindParam() se pasa una referencia de la variable (un "puntero") de manera que si cambias su valor antes de un execute(), éste hará la sustitución con el valor que tengan dichas variables en el instante de llamar al execute(), teniendo en cuenta esas últimas modificaciones.

En PDOStatement::bindValue() se asigna el valor que tenga en ese momento la variable y aunque ésta cambie a lo largo de varias ejecuciones de execute() la sustitución permanece invariable.

Ejemplo ilustrativo con PDOStatement::bindValue():

$consulta = $db->prepare('SELECT * FROM `tabla` WHERE ejemplo = :ejemplo');
$ejemplo = 'un_ejemplo';
/* Aquí es donde se tiene en cuenta el valor de $ejemplo: un_ejemplo */
$consulta->bindValue(':ejemplo', $ejemplo);
$ejemplo = 'otro_ejemplo';
$consulta->execute();

La consulta ejecuta SELECT * FROM tabla WHERE ejemplo = 'un_ejemplo' porque se fija el valor de :ejemplo con el contenido de la variable $ejemplo, que es "un_ejemplo" en el momento de ejecutarse bindValue().

Ejemplo ilustrativo con PDOStatement::bindParam():

$consulta = $db->prepare('SELECT * FROM `tabla` WHERE ejemplo = :ejemplo');
$ejemplo = 'un_ejemplo';
$consulta->bindParam(':ejemplo', $ejemplo);
$ejemplo = 'otro_ejemplo';
/* Aquí es donde se tiene en cuenta el valor de $ejemplo: otro_ejemplo */
$consulta->execute();

La consulta ejecuta SELECT * FROM tabla WHERE ejemplo = 'otro_ejemplo' porque NO se fija el valor de :ejemplo como el en ejemplo anterior, si no que obtiene el valor de la variable $ejemplocuando se ejecuta execute(), y en ese momento el valor es "otro_ejemplo".

Ejemplo ilustrativo con PDOStatement::bindValue() (2):

$consulta = $db->prepare('INSERT INTO tabla (valor) VALUES (:valor)');
$ejemplo = [ 'a', 'b', 'c', 'd' ];
foreach ($ejemplo as $valor) {
  $consulta->bindValue(':valor', $valor);
  $consulta->execute();
}

Por cada iteración tenemos que hacer un bindValue() y un execute().

Ejemplo ilustrativo con PDOStatement::bindParam() (2):

$consulta = $db->prepare('INSERT INTO tabla (valor) VALUES (:valor)');
$ejemplo = [ 'a', 'b', 'c', 'd' ];
$valor = ''; /* No es necesario, pero es ilustrativo */
$consulta->bindParam(':valor', $valor);
foreach ($ejemplo as $valor) {
  $consulta->execute();
}

Como tenemos guardada la referencia a la variable $valor no es necesario volver a llamar a bindParam() antes de cada execute().

Referencia:

stackoverflow ¿Cuál es la diferencia entre bindParam() y bindValue() en PDO?
https://diego.com.es/tutorial-de-pdo
http://www.mustbebuilt.co.uk/php/insert-update-and-delete-with-pdo/

Articulo : 2048 - Veces Leidas
Compartir Articulo: