La seguridad en las consultas enviadas a la base de datos la daremos con el método bind_param.
Éste método agrega variables a una sentencia preparada como parámetros.
bind_param buscará en la sentencia preparada todos los signos de pregunta ? y los reemplazará por las variables que le asignemos.
Es obligatorio indicar de que tipo es el valor que estamos inyectando, la sintaxis es la siguiente
SELECT * from paises WHERE nombre = ?
bind_param('s', 'Argentina');
SELECT * from paises WHERE nombre = 'Argentina'
Como puede observarse en la primera línea tenemos “nombre = ?”, no escapamos los caracteres ni tampoco agregamos las comillas que encierran la cadena de texto.
El primer parámetro ‘s’ indica que la variable que vamos a reemplazar es de tipo string, aquí la tabla con los tipos permitidos
- i variable de tipo entero
- d variable de tipo doble
- s variable de tipo texto
- b variable de tipo blob y se envía en paquetes
Un ejemplo concreto
<?php $mysqli = new mysqli("localhost", "usuario", "password", "base"); if (mysqli_connect_errno()) { printf("Imposible conectarse: %s\n", mysqli_connect_error()); exit(); } $cliente = 'coto'; $query = "SELECT client, partner FROM business WHERE client=?"; /* Ejecuto el método prepare y este me va a devolver el objeto */ if ($stmt = $mysqli->prepare($query)) { $stmt->bind_param('s', $cliente); /* ejecuto el query */ $stmt->execute(); $stmt->bind_result($client, $partner); $stmt->fetch(); /* cierro stmt */ $stmt->close(); } echo $client . "<br />"; echo $partner . "<br />"; $mysqli->close(); ?>
Muchas veces necesitamos inyectar más de una variable en una misma consulta preparada, de esta manera podemos ingresar ilimitadas variables
<?php $mysqli = new mysqli("localhost", "usuario", "password", "base"); if (mysqli_connect_errno()) { printf("Imposible conectarse: %s\n", mysqli_connect_error()); exit(); } $cliente = 'coto'; $product_id = 1; $query = "SELECT client, partner FROM business WHERE client=? AND product_id=?"; /* Ejecuto el método prepare y este me va a devolver el objeto */ if ($stmt = $mysqli->prepare($query)) { /* El primero parámetro es tipo string y el segundo es entero */ $stmt->bind_param('si', $cliente, $product_id); /* ejecuto el query */ $stmt->execute(); $stmt->bind_result($client, $partner); $stmt->fetch(); /* cierro stmt */ $stmt->close(); } echo $client . "<br />"; echo $partner . "<br />"; $mysqli->close(); ?>