Consultar datos desde una Base de datos y mostrarlos en HTML es una de las tareas mas recurrentes en el desarrollo web, es sencillo pero es necesario tener cuidado para evitar problemas de seguridad y por ello usaremos PDO.
Conexión con PDO
En el artículo Conectar PHP con Base de Datos utilizando PDO hemos descrito como implementar una conexión de manera sencilla.
La conexión se implementa y configura en el archivo pdo.php y para utilizarlo se lo importa de la siguiente forma:
<?php
// include connection
require 'pdo.php';
Métodos para consultas de PDO
PDO ofrece los siguientes métodos para enviar una consulta a base de datos:
prepare
prepara una sentencia para su ejecución y devuelve un objeto sentencia.bindValue
vincula una variable con un parámetro de la consulta.execute
ejecuta una sentencia preparada previamente.
PDO ofrece los siguientes métodos para recorrer los datos obtenidos por la consulta:
fetch
obtiene el siguiente registro de los resultados.fetchAll
obtiene un array con todos los registros de los resultados.
Con estos métodos es posible consultar datos e imprimirlos en HTML, para entender cómo hacerlo usaremos un ejemplo práctico.
Ejemplo práctico
Para el ejemplo usaremos una base de datos en MySQL que contiene una tabla llamada country con la información de todos los países.
Listado de países
Consultamos la lista de países utilizando los métodos prepare
y execute
.
<?php
// include connection
require 'pdo.php';
// prepare query
$statement = $pdo->prepare("SELECT * FROM country");
$statement->execute();
Recorremos los resultados utilizando el método fetch
y generamos un listado con enlaces al detalle del país.
<?php while (($result = $statement->fetch()) !== false): ?>
<a href="country.php?code=<?php echo $result->code; ?>"><?php echo $result->name; ?></a>
<?php endwhile; ?>
Detalle del país
Para obtener los datos del país seleccionado vamos a seguir los siguientes pasos:
- Obtenemos el código de país con
filter_input
que permite obtener un parámetro y filtrarlo como string utilizando la opciónFILTER_SANITIZE_STRING
. - Preparamos la consulta que contiene un parámetro, utilizamos
bindValue
para asignar el valor del parámetro y lo convertimos a string con la opciónPDO::PARAM_STR
. - Obtenemos el resultado con el método
fetch
y si no hay resultados hacemos una redirección al listado de países
<?php
// include connection
require 'pdo.php';
// get and filter parameter
$code = filter_input(INPUT_GET, 'code', FILTER_SANITIZE_STRING);
// prepare query
$statement = $pdo->prepare("SELECT * FROM country WHERE Code = :code");
$statement->bindValue(':code', $code, PDO::PARAM_STR);
$statement->execute();
// get the result
$result = $statement->fetch();
// is not result back to list
if ($result === false) {
header('location: countries.php');
exit();
}
Luego sólo queda imprimir todos los datos del país e incluir un enlace de regreso al listado:
<h1>Country</h1>
<p>
Name: <?php echo $result->name; ?><br>
Continent: <?php echo $result->continent; ?><br>
Region: <?php echo $result->region; ?><br>
Population: <?php echo number_format($result->population); ?><br>
Area: <?php echo number_format($result->area); ?><br>
Head of State: <?php echo $result->headofstate; ?>
</p>
<p><a href="countries.php">Back to countries</a></p>
Cómo se observa obtener los datos en sencillo y en pocos pasos pero hemos agregado algunas validaciones para evitar problemas de seguridad.
Recomendaciones
Cuando se utilizan datos que vienen de los usuarios es indispensable limpiarlos y validarlos antes de usarlos en las consultas para evitar problemas de seguridad.
Es necesario contemplar los casos que puedan generar error, por ejemplo: si un código de país no existe hay que redireccionar al listado principal.
Al utilizar bindValue
para asignar valores a los parámetros se recomienda seleccionar el tipo de dato correcto para evitar ataques de inyección SQL.
Envíar Comentario
En este sitio los comentarios se publican previa aprobación del equipo de Kodetop. Evita los comentarios ofensivos, obscenos o publicitarios. Si deseas publicar código fuente puedes hacerlo entre las etiquedas
<pre></pre>