Las sentencias preparadas son mejores cuando:
- Se quiere evitar la inyección SQL (porque primero se envia la sentencia en el prepare
y luego los parámetros, por referencia)
-
Se quiere usar la sentencia varias veces con distintos parámetros.
Es importante que esté cargado el módulo
ND_MYSQLI
(descargar mysqli porque son incompatibles)
Una vez hecha la conexion, () la sentencia se prepara con los "placeholders" ? y luego:
- $sentencia = $conn->prepare($sqltxt); 1 prepara la sentencia
- $sentencia->bind_param("ttt...", $var1,$var2,$var3...); 2 enlaza las variables
- $sentencia->execute(); 3 ejecuta la sentencia
Si se trata de
INSERT, DELETE, DROP etc... solo resta cerrar la conexión con
$conn->close();
Si es un
SELECT, entonces:
- $resultado = $sentencia->get_result(); 4 pasa el resultado a un array en cache
- $n = $resultado->num_rows; 5 contamos los registros devueltos
- if($n==0){.codigo no hay registros.}else{...} 6 si no hay registros
- while($registro = $resultado->fetch_array()){ 7 recupero registro uno a uno}
- $conn->close(); 8 cierro aquí la conexión
Los tipos aceptados para el envío de parámetros con
bind_param() son:
- i la variable correspondiente es de tipo entero
- d la variable correspondiente es de tipo double
- s la variable correspondiente es de tipo string
- b la variable correspondiente es un blob y se envía en paquetes
Para más información sobre sentencias preparadas:
Manual php
Detalles de agregar parámetros:
Manual php
<div>
<table>
<tr>
<td width="40" style=" text-align:center">ID</td>
<td width="200" style=" text-align:center">NOMBRE</td>
<td width="200" style=" text-align:center">APELLIDO</td>
</tr>
<?php
if(conectar()){
Try{
$nombre="Carlos";
$id=5;
$sqltxt = "SELECT * FROM nombres WHERE nombre=? OR id=?";
$sentencia = $conn->prepare($sqltxt); //1 prepara la sentencia
$sentencia->bind_param("si", $nombre,$id); //2 enlaza las variables
$sentencia->execute(); //3 ejecuta la consulta
$resultado = $sentencia->get_result(); //4 pasa el resultado a un array en cache
$n = $resultado->num_rows; //5 No de registros devueltos
if($n==0){ //6 si no hay registros.....
echo("</table>");
echo(" NO SE ENCONTRARON REGISTROS");
}else{
while($registro = $resultado->fetch_array()){ //7 recupero registro uno a uno
echo("<tr>");
echo("<td>" . $registro["id"] . "</td>" );
echo("<td>".$registro["nombre"] . "</td>" );
echo("<td>".$registro["apellido"] . "</td>" );
echo("</tr>");
}
echo("</table>");
}
$sentencia->close();
$conn->close; // cierro conexion
}catch(Exception $e){
echo("no se pudo encontrar los registros por error: " . $e);
}
}else{
echo(mysqli_error($conn)); //no se puede conectar con la DB
}
?>
</div>