SENTENCIAS PREPARADAS (EVITA INYECCIÓN SQL)
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>
	
					
© IQSystems 2023