PHP en CableNaranja

Sentencias preparadas en PHP y MySQL con ejemplos, Parte 4

¡Comparte nuestro contenido!

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)

Finalmente, después de aprender a seleccionar, insertar y eliminar datos usando sentencias preparadas, el último paso es la edición o actualización de datos. Así que, sin más preámbulos ¡Manos a la obra!

Cargar los datos del elemento seleccionado

En la parte 3 de esta serie, cargamos la lista completa de personas y colocamos dos enlaces para las acciones de Eliminar y Editar, concretamente esta línea de código.

<td><a href="index.php?perid=<?= $pid; ?>">Eliminar</a> | <a href="editar.php?perid=<?= $pid; ?>">Editar</a></td>

Es hora de crear ese archivo llamado editar.php Lo primero es crear la conexión a nuestra base de datos:

<?php
require_once("conectar.php");
$enlace = conectar();
?>

Ahora, sanearemos la variable perid para evitar inyecciones de código. En la parte 1, explicamos este proceso.

$perid = $enlace->real_escape_string(filter_var($_GET["perid"], FILTER_VALIDATE_INT));

Ahora haremos la consulta preparada usando el ID que acabamos de obtener

$sqlCon = "select nombre, edad, estatura from personas where id = ?";
$stmCon = $enlace->prepare($sqlCon);
$stmCon->bind_param("i", $perid);
$stmCon->execute();
$stmCon->bind_result($nombre, $edad, $estatura);

Ahora, revisamos que nuestra consulta tenga datos, para ello usamos store_result y num_rows, teniendo esta última la cantidad de registros obtenidos. Cerremos la consulta al terminar.

$stmCon->store_result();
$hay = $stmCon->num_rows;
$stmCon->fetch();
$stmCon->close();

Si obtenemos 0, entonces la persona no existe, de lo contrario…

if($hay==0){
   echo "<p>La persona que intenta editar no existe. <a href='index.php'>Regresar</a></p>";
}else{
}

Cargaremos el mismo formulario que usamos para dar de alta una persona, pero agregaremos o modificaermos (según sea el caso) el atributo value para cargar las variables que hemos obtenido con la información de la base de datos. Usaremos la forma corta de imprimir un valor en PHP. Revisemos el código.

<form method="post">
<fieldset>
<legend>Editar Persona &raquo; <a href='index.php'>Regresar</a></legend>
<p><label>Nombre</label> <input type="text" name="txtNombre" value="<?= $nombre; ?>" /></p>
<p><label>Edad</label> <input type="number" name="txtEdad" min="0" max="99" value="<?= $edad; ?>" /></p>
<p><label>Estatura</label> <input type="number" name="txtEstatura" min="0" max="2" step=".01" value="<?= $estatura; ?>" /></p>
<p><input type="submit" name="ok" value="Actualizar datos" /></p>
</fieldset>
</form>

El resultado hasta el momento va quedando así.

Procedamos a la edición final

Revisemos la variable del botón submit, esto lo haremos justo después de la etiqueta <body> ya que necesitamos que se actualice el contacto y se vuelvan a mostrar los datos.

if(isset($_POST["ok"])){
}

Dentro de ese código, sanearemos las variables del formulario

$txtNombre = htmlspecialchars(strip_tags(trim($_POST["txtNombre"])), ENT_QUOTES);
$txtEdad = filter_var($_POST["txtEdad"], FILTER_VALIDATE_INT);
$txtEstatura = filter_var($_POST["txtEstatura"], FILTER_VALIDATE_FLOAT);

Necesitamos capturar los mensajes de error, y una bandera para cuando ocurran.

$bandera = true;
$mensaje = "";

Haremos obligatorios los 3 valores. Ergo, hay que revisarlos todos.

if(strlen($txtNombre)==0){
   $mensaje = "<li>Escriba el nombre de la persona</li>";
   $bandera = false;
}
if($txtEdad==0 || strlen($txtEdad)==0){
   $mensaje .= "<li>¿Qué edad tiene?</li>";
   $bandera = false;
}
if($txtEstatura==0.0 strlen($txtEstatura)==0){
   $mensaje .= "<li>¿Cuánto mide?</li>";
   $bandera = false;
 }

Y si la bandera se puso en false

if(!$bandera){ ?>
   <ol><?= $mensaje ?></ol>
<?php }

De lo contrario, hacemos el SQL para la actualización, y le pasamos los valores que vienen de los input y el ID que obtuvimos de la variable tipo GET. La expresión “sidi” de bind_param refleja el siguiente patron: string, integer, decimal, integer.

else{
   $sqlActua = "update personas set nombre = ?, edad = ?, estatura = ? where id = ?";
   $stmActua = $enlace->prepare($sqlActua);
   $stmActua->bind_param("sidi", $txtNombre, $txtEdad, $txtEstatura, $perid);
   $stmActua->execute();
   $stmActua->close();
   echo "<p>¡Registro actualizado!</p>";
}

Un último ajuste antes de terminar. El atributo value de los objetos input no se actualiza si pulsamos el botón submit, hemos de corregir eso. Modificaremos la siguiente parte para el nombre:

value="<?= $nombre; ?>"

Por la siguiente

value="<?php if(isset($_POST["ok"])) echo $_POST["txtNombre"]; else echo  $nombre; ?>"

Como podemos ver, quitamos la forma simple de PHP ya que necesitamos revisar si el botón ha sido utilizado, en cuyo caso el valor mostrado en el atributo value debe ser el mismo que viene del formulario a través de POST, de lo contrario debemos mostrar lo que viene de la base de datos. Hagamos la modificación a todos los input. Quedaría así

<p><label>Nombre</label> <input type="text" name="txtNombre" value="<?php if(isset($_POST["ok"])) echo $_POST["txtNombre"]; else echo  $nombre; ?>" /></p>
<p><label>Edad</label> <input type="number" name="txtEdad" min="0" max="99" value="<?php if(isset($_POST["ok"])) echo $_POST["txtEdad"]; else echo $edad; ?>" /></p>
<p><label>Estatura</label> <input type="number" name="txtEstatura" min="0" max="2" step=".01" value="<?php if(isset($_POST["ok"])) echo $_POST["txtEstatura"]; else echo $estatura; ?>" /></p>

¡Probemos el resultado final!

¡Y eso es todo por ahora! Ha sido un largo camino, pero hemos terminado nuestra serie sobre Sentencias preparadas. Puedes descargar el código fuente para probarlo o modificarlo. Espero que te haya sido de utilidad.

¡Comparte nuestro contenido!

Entradas relacionadas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *