¿Por qué MySQLi usa signos de interrogación (?) en lugar del formato sprintf?

3

Como indica el título, ¿por qué MySQLi usa signos de interrogación en lugar del formato sprintf() ? Por ejemplo, ¿por qué?

$stmt = $mysqli->prepare("SELECT * FROM table WHERE column1 = ?");
$stmt->bind_param('s', $var);

en lugar de

$stmt = $mysqli->prepare("SELECT * FROM table WHERE column1 = %s", $var);

¿Hubo algunas complicaciones con el uso del formato de sprintf, o hubo riesgos de seguridad asociados con él? Además, si necesita tener un signo de interrogación en su declaración SQL, ¿hay alguna forma de evitarlo (en sprintf() , solo haría %% en lugar de % )?

    
pregunta ub3rst4r 20.11.2013 - 00:44
fuente

1 respuesta

6

No hay un estándar en particular para el aspecto de las consultas parametrizadas, por lo que podría ser cualquier sintaxis. No estoy seguro de qué capa de base de datos usaba anteriormente ese %s preferido (pero si es Python MySQLdb, entonces la razón es que usa su propia función de parametrización no nativa que en realidad usa el operador de formato de cadena para eliminar el parámetros en la consulta).

mysqli_prepare de PHP se implementa utilizando la función C de parametrización nativa de libmysql mysql_stmt_prepare y esa función decidió utilizar signos de interrogación.

  

si necesitas tener un signo de interrogación en tu declaración SQL, ¿hay alguna forma de evitarlo?

No necesita escapar de él: aparte de representar un parámetro, el único lugar donde puede usar un signo de interrogación en SQL es en una cadena literal. ? no tiene poderes especiales en una cadena literal, por lo que:

SELECT '?' FROM x WHERE x.id=?

selecciona un signo de interrogación literal donde el id coincide con el parámetro.

    
respondido por el bobince 20.11.2013 - 14:37
fuente

Lea otras preguntas en las etiquetas