2011-01-08 15 views
7

He encontrado esto en algunos ejemplos de código, mientras que buscando en Google:¿Qué significa esto?

$sql = 'INSERT INTO users (username,passwordHash) VALUES (?,?)'; 

que es nuevo para mí, pero me imagino que es un método de sustitución y equivalente a

$sql = "INSERT INTO users (username,passwordHash) VALUES ($username,$passwordHash)";` 

o

$sql = 'INSERT INTO users (username,passwordHash) VALUES (' . $username . ',' . $passwordHash . ')';` 

¿sería eso correcto? ¿Es una sintaxis de PHP real, o simplemente intentaba simplificar su ejemplo?


gracias por los comentarios, amigos

Respuesta

12

Esto es bastante común en prepared statements. El ? sirve simplemente como un marcador de posición, como se ve a continuación a partir de la documentación de PHP:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); 
$stmt->bindParam(1, $name); 
$stmt->bindParam(2, $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
+6

También rara vez existe la necesidad de la lista '-> bindParam'. Uno puede simplemente presionar todos los parámetros con la llamada '-> execute (array ($ name, $ value))'. – mario

2

no es la misma. los signos de interrogación se usan para las consultas de declaraciones preparadas. Básicamente, estos le permiten ejecutar la misma consulta varias veces mientras solo el sistema analiza la consulta una vez.

4

Los signos de interrogación son marcadores de posición para valores en sentencias SQL preparadas, y son una protección importante contra SQL Injection Attacks. Su primera alternativa no funcionaría correctamente a menos que cada usuario incluya su nombre entre comillas * y encierre el hash de la contraseña entre comillas. Su segunda alternativa es vulnerable a los ataques de inyección SQL.

Con marcadores de posición, pase los valores para los marcadores de posición cuando ejecuta el SQL.

* Y Tim O'Reilly sabe que realmente tiene que escribir "'Tim O''Reilly'".

Cuestiones relacionadas