2011-05-04 5 views
2

Je ne vois aucune différence à l'aide de guillemets simples ou de guillemets doubles. Quand ou pourquoi devrais-je utiliser le premier au lieu de ce dernier?PHP et mySQL guillemet simple ou double citation?

J'ai lu où où pour SQL je devrais utiliser des singles - pourquoi?

+0

Assurez-vous que la norme ANSI dans SQL est à guillemets simples. Vous recherchez une référence – Phil

+0

duplication possible de [Quelle est la différence entre guillemets simples et doubles dans SQL?] (Http://stackoverflow.com/questions/1992314/what-is-the-difference-between-single-and-double -quotes-in-sql) –

+0

@Phil Brown: ANSI-92 prend en charge les guillemets pour les noms d'objets - la plupart des bases de données prennent en charge les guillemets doubles afin de spécifier des caractères non standard. –

Répondre

6

Vous devez utiliser la combinaison de guillemets simples et mysql_real_escape_string ou passer à PDO. Le mysql_real_escape_string s'occupera de nettoyer toute variable sale que vous voulez stocker sur votre base de données et les guillemets simples empêcheront toute exécution à l'intérieur.

Voici un exemple:

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", 
      mysql_real_escape_string($user), 
      mysql_real_escape_string($password)); 

exemple de PDO:

$dbh = new PDO('mysql:dbname=your_database;host=your_host', $user, $password); 
$stmt = $dbh->prepare('SELECT * FROM users WHERE user = :username AND password = :password'); 
$stmt->execute(array('username' => $user, 'password' => $password)); 

Si vous n'êtes pas cleanning correctement les données que vous allez stocker, vous pouvez souffrir d'une injection SQL.

Par exemple, une requête normale

SELECT * FROM users WHERE user = 'test' 

injecté recherche:

SELECT * FROM users WHERE user = 'anything' OR 'x'='x' 

un autre exemple:

SELECT * FROM users WHERE user = ' '; DROP TABLE users 

More about SQL injection attack: SQL injection prevention, MySQL Injection

Why you should be using php's PDO for database access

+0

Oubliez toute la suite de fonctions mysql_ * et passez à PDO. – Phil

+0

@Phil oui PDO est un autre moyen sûr aussi. – Prix

+0

En outre, l'extension MySQL de PHP empêche l'exécution de plusieurs requêtes, de sorte que le cas d'utilisation de "Bobby Tables" ne s'applique généralement pas à – Phil

2

Utilisez ce qui est le plus facile ou le plus pratique. Si elles sont toutes les mêmes pour vous, alors la citation unique est plus portable, du moins la théorie.

Si la requête est générée à partir de PHP, par exemple, les guillemets simples sont plus pratiques pour écrire des requêtes SQL car les guillemets doubles permettent à une expression PHP de substituer des variables.

$query = "SELECT * FROM $sometable WHERE somefield = '1'"; 

Selon les règles PHP, des guillemets simples (ils ont été utilisés) empêcher l'expansion de $sometable. En ce qui concerne la portabilité théorique, j'ai utilisé Oracle, MySQL, le serveur MS SQL, SQL Lite, et quelques saveurs locales, et je n'ai jamais eu de problème avec les guillemets.

1

Les guillemets simples sont plus restrictifs en PHP. Par exemple, les guillemets simples ne permettent pas le remplacement des variables à l'intérieur de la chaîne.

$myval = "world"; 
echo "Hello $myval"; // produces "Hello world" 
echo 'Hello $myval'; // produces "Hello $myval" 

De plus, on pourrait penser que, puisque les guillemets simples sont trop plus strictes, ils seraient plus efficaces, mais ce n'est pas le cas. La performance de manipulation de chaînes PHP est une chose amusante (et documentée) as seen here.

1

Les chaînes entre guillemets sont les plus couramment utilisées dans les scripts PHP car elles offrent le plus de flexibilité. En effet, les variables et les séquences d'échappement seront analysées en conséquence.

L'inclusion d'une chaîne entre guillemets simples est utile lorsque la chaîne doit être interprétée exactement comme indiqué. Cela signifie que les variables et les séquences d'échappement ne seront pas interprétées lorsque la chaîne est analysée.

Les guillemets doubles utile lorsque vous avez des guillemets simples dans votre syntaxe mysql

$query = "SELECT * FROM tableName WHERE columnName = '{$value}'"; 
+0

Cela a été tiré d'un livre, pensé que cela pourrait aider – Brett

+2

Qu'est-ce que PHP a à voir avec SQL? –

+0

Bien que PHP soit dans le titre, j'ai supposé que vous écriviez vos requêtes en PHP. Je vais ajouter à ma réponse ... – Brett

2

Si votre serveur MySQL est en cours d'exécution avec le drapeau --ansi, puis " doubles " citations cessera de travailler. Les chaînes SQL doivent être entourées de guillemets simples '. Ou plus précisément, les guillemets doubles se comportent en fait comme des guillemets. Ils peuvent être utilisés pour les noms de colonnes:

SELECT "colum&name", `x&y` FROM "fictional-query" 
WHERE strcolumn = 'text' OR "column&name" = 'string' 

Le même serait toutefois échouer si mysqld ne fonctionne pas en mode compatible ansi. Ce n'est qu'alors que les guillemets doubles équivalent aux guillemets simples pour les chaînes. C'est pourquoi ils devraient être évités.

Questions connexes