Aucun
?
ne signifie rien à la clause MySQL WHERE =
, pour plusieurs interfaces externes tels que les cadres de stdlib et web PHP comme Rails.
?
est juste une erreur de syntaxe à:
CREATE TABLE t (s CHAR(1));
SELECT * FROM t WHERE s = ?;
parce qu'elle est non cotée, et:
INSERT INTO t VALUES ('a');
INSERT INTO t VALUES ("?");
SELECT * FROM t WHERE s = '?';
il retourne:
s
?
donc apparemment sans signification particulière.
Rails exemple
Dans Rails par exemple, le point d'interrogation est remplacé par un argument donné par une variable de langage de programmation de la bibliothèque (Ruby), par exemple:
Table.where("column = ?", "value")
et automatiquement Citations arguments pour éviter les bogues et injection SQL, la génération d'une déclaration comme:
SELECT * FROM Table WHERE column = 'value';
Le citant wo ULD nous sauver en cas de quelque chose comme:
Table.where("column = ?", "; INJECTION")
MySQL 5.0 instructions préparées
MySQL 5.0 a ajouté le prepared statement feature qui a une sémantique similaire à la marque de question dans les cadres web.
Exemple des docs:
PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
SET @a = 3;
SET @b = 4;
EXECUTE stmt1 USING @a, @b;
Sortie:
hypotenuse
5
Ces échapper aussi des caractères spéciaux comme prévu:
PREPARE stmt1 FROM 'SELECT ? AS s';
SET @a = "'";
EXECUTE stmt1 USING @a;
Sortie:
s
'
Comment les utiliser? Je veux dire par là comment définir le point d'interrogation pour prendre un paramètre? – Levi
Il existe plusieurs façons de faire des instructions préparées, PDO et MySQLi les supportent. http://us3.php.net/mysqli http://us3.php.net/manual/fr/mysqli.prepare.php et une recherche rapide sur google m'a amené à http://www.petefreitag.com/item/ 356.cfm – Jayrox