statements sintaxis query prepared functions create checker mysql syntax

sintaxis - mysql syntax checker



¿Cuál es el significado del signo de interrogación en MySQL en "WHERE column=?"? (4)

El signo de interrogación representa un parámetro que luego será reemplazado. Usar consultas parametrizadas es más seguro que insertar los parámetros directamente en la consulta.

SQL Server llama a esto para parametrizar consultas y Oracle lo llama variables de vinculación.

El uso varía según el idioma desde el que ejecuta la consulta.

Aquí hay un ejemplo de cómo se usa desde PHP.

suponiendo 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);

El ''sssd'' es una bandera que identifica el resto de los parámetros, donde s representa la cadena d representa los dígitos.

Estoy diseccionando un código y me encontré con esto,

$sql = ''SELECT page.*, author.name AS author, updator.name AS updator '' . ''FROM ''.TABLE_PREFIX.''page AS page '' . ''LEFT JOIN ''.TABLE_PREFIX.''user AS author ON author.id = page.created_by_id '' . ''LEFT JOIN ''.TABLE_PREFIX.''user AS updator ON updator.id = page.updated_by_id '' . ''WHERE slug = ? AND parent_id = ? AND (status_id=''.Page::STATUS_REVIEWED.'' OR status_id=''.Page::STATUS_PUBLISHED.'' OR status_id=''.Page::STATUS_HIDDEN.'')'';

Me pregunto qué es el "?" lo hace en la declaración WHERE. ¿Es algún tipo de titular del parámetro?


Estas son declaraciones preparadas, las declaraciones preparadas ofrecen dos beneficios principales:

La consulta solo necesita analizarse (o prepararse) una vez, pero puede ejecutarse varias veces con el mismo parámetro o con parámetros diferentes. Cuando se prepara la consulta, la base de datos analizará, compilará y optimizará su plan para ejecutar la consulta. Para consultas complejas, este proceso puede tomar el tiempo suficiente como para ralentizar notablemente una aplicación si es necesario repetir la misma consulta muchas veces con diferentes parámetros. Al usar una declaración preparada, la aplicación evita repetir el ciclo analizar / compilar / optimizar. Esto significa que las declaraciones preparadas usan menos recursos y, por lo tanto, se ejecutan más rápido.

Los parámetros para las declaraciones preparadas no necesitan ser citados; el controlador maneja esto automáticamente Si una aplicación utiliza exclusivamente sentencias preparadas, el desarrollador puede estar seguro de que no se producirá ninguna inyección de SQL (sin embargo, si otras partes de la consulta se están creando con entradas no guardadas, la inyección de SQL aún es posible).

http://php.net/manual/en/pdo.prepared-statements.php


Las declaraciones preparadas usan el ''?'' en MySQL para permitir params vinculantes 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.


Ninguna

? significa nada para la cláusula MySQL WHERE = , solo para varias interfaces externas como PHP stdlib y frameworks web como 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.

Ejemplo de carriles

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 de SQL, generando una declaración como:

SELECT * FROM Table WHERE column = ''value'';

Las citas nos ahorrarían en caso de algo como:

Table.where("column = ?", "; INJECTION")

Declaraciones preparadas de MySQL 5.0

MySQL 5.0 agregó la característica 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;

Salida:

hypotenuse 5

Estos también escapan caracteres especiales como se esperaba:

PREPARE stmt1 FROM ''SELECT ? AS s''; SET @a = "''"; EXECUTE stmt1 USING @a;

Salida:

s ''