2011-01-08 4 views
7

Je trouve cela dans quelques exemples de code en googler:Qu'est-ce que cela signifie?

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

c'est nouveau pour moi, mais je suppose que une méthode de substitution et équivalent à

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

ou

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

cela serait-il correct? Est-ce une syntaxe PHP réelle, ou essayait-il simplement de simplifier son exemple?


Merci pour les commentaires, les gens

Répondre

12

C'est assez courant dans prepared statements. Le ? sert simplement comme un espace réservé, comme on le voit ci-dessous à partir de la documentation 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

De même, la liste fiddly '-> bindParam' est rarement nécessaire. On peut simplement pousser tous les paramètres avec l'appel '-> execute (array ($ name, $ value))'. – mario

2

ce n'est pas la même chose. les points d'interrogation sont utilisés pour les requêtes d'instructions préparées. ceux-ci vous permettent essentiellement d'exécuter la même requête plusieurs fois alors que seul le système analyse la requête une fois.

4

Les points d'interrogation sont des espaces réservés pour les valeurs dans les instructions SQL préparées - et constituent une protection importante contre SQL Injection Attacks. Votre première alternative ne fonctionnerait pas correctement à moins que chaque utilisateur renferme son nom entre guillemets * et vous joindre le hash de mot de passe entre guillemets. Votre deuxième alternative est vulnérable aux attaques par injection SQL. Avec les espaces réservés, vous transmettez les valeurs pour les espaces réservés lorsque vous exécutez le SQL.

* Et Tim O'Reilly sait qu'il doit vraiment taper "'Tim O''Reilly'".