Revisamos de forma cada uno de los escritos en nuestro espacio con el objetivo de enseñarte en todo momento la información más veraz y actual.
Solución:
Las declaraciones preparadas usan el ‘?’ en MySQL para permitir el enlace de parámetros a la declaración. Altamente considerado como más seguro contra las inyecciones de SQL si se usa correctamente. Esto también permite consultas SQL más rápidas, ya que la solicitud solo debe compilarse una vez y puede reutilizarse.
El signo de interrogación representa un parámetro que luego será reemplazado. Usar consultas parametrizadas es más seguro que incrustar los parámetros directamente en la consulta.
SQL Server lo llama consultas de parametrización y Oracle lo llama variables de vinculación.
El uso varía según el idioma desde el que está ejecutando la consulta.
Aquí hay un ejemplo de cómo se usa desde PHP.
asumiendo que $mysqli
es una conexión de base de datos y people
es una tabla con 4 columnas.
$stmt = $mysqli->prepare("INSERT INTO People VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $firstName, $lastName, $email, $age);
Él 'sssd'
es una bandera que identifica el resto de los parámetros, donde s
representa string y d
representa dígitos.
?
no tiene un significado especial en MySQL WHERE =
declaraciones, sólo en declaraciones preparadas
El caso más común donde lo vemos se debe al significado especial que se le da a ?
por varios frameworks web como PHP y Rails.
?
es solo un error de sintaxis en:
CREATE TABLE t (s CHAR(1));
SELECT * FROM t WHERE s = ?;
porque no está citado, y en:
INSERT INTO t VALUES ('a');
INSERT INTO t VALUES ("?");
SELECT * FROM t WHERE s = '?';
vuelve:
s
?
por lo tanto, aparentemente sin un significado especial.
Declaraciones preparadas de MySQL 5.0
MySQL 5.0 agregó la función de declaración preparada que tiene una semántica similar al signo de interrogación en los marcos web.
Ejemplo de los documentos:
PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
SET @a = 3;
SET @b = 4;
EXECUTE stmt1 USING @a, @b;
Producción:
hypotenuse
5
Estos también escapan de los caracteres especiales como se esperaba:
PREPARE stmt1 FROM 'SELECT ? AS s';
SET @a = "'";
EXECUTE stmt1 USING @a;
Producción:
s
'
Ejemplo de rieles
En Rails, por ejemplo, el signo de interrogación se reemplaza por un argumento dado por una variable del lenguaje de programación de la biblioteca (Ruby), por ejemplo:
Table.where("column = ?", "value")
y automáticamente cita argumentos para evitar errores e inyección SQL, generando una declaración como:
SELECT * FROM Table WHERE column = 'value';
La cotización nos salvaría en caso de algo como:
Table.where("column = ?", "; INJECTION")
Te mostramos reseñas y valoraciones
Si para ti ha sido de ayuda este artículo, sería de mucha ayuda si lo compartieras con el resto juniors de esta manera nos ayudas a difundir nuestra información.