2010-04-19 4 views
2

J'ai le tableau suivant:Comment stocker une chaîne contenant des guillemets dans une base de données MySQL?

$sql = "CREATE TABLE received_queries 
    (
    sender_screen_name varchar(50), 
    text varchar(150) 
    )"; 

J'utilise l'instruction SQL suivante pour stocker des valeurs dans le tableau

$sql = "INSERT INTO received_queries VALUES ('$sender_screen_name', '$text')"; 

Maintenant, je suis en train de stocker la chaîne suivante comme « texte ».

One more #haiku: Cotton wool in mind; feeling like a sleep won't cure; I need some coffee.

et je reçois le message d'erreur suivant:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't cure; I need some coffee.')' at line 1

Je pense que cela doit être un problème assez commun. Comment puis-je le résoudre?

Répondre

4

Je suggère d'utiliser des déclarations préparées (mysqli ou DOP) plutôt que d'échapper.

2

Vous évitez les guillemets simples \'. Voir le manual.

One more #haiku: Cotton wool in mind; feeling like a sleep won\'t cure; I need some coffee. 
+0

@Oded: Y a-t-il d'autres caractères qui peuvent créer un problème similaire? – Bruce

+1

@Jack - J'ai ajouté un lien vers le manuel. – Oded

+0

Apparemment, je ne peux plus voir les hyperliens :) – Bruce

3

Vous pouvez utiliser mysql_real_escape_string

+0

Édité votre commentaire pour le rendre à jour. –

+0

@Col. Shrapnel Merci! –

2

Vous ne devez jamais générer de code SQL en concaténant une chaîne avec une entrée utilisateur. Cela ouvre votre application aux attaques par injection SQL (Imaginez ce qui se passe lorsque quelqu'un entre '); delete from received_queries; comme $text).

Par conséquent, vous devez toujours utiliser un framework DB (comme DB pour PHP) qui vous permet de passer une chaîne avec des espaces réservés, puis un tableau avec les valeurs. Le cadre s'assurera alors que les valeurs ne peuvent pas nuire.

+0

@Aaron: Merci beaucoup! – Bruce

4

Veuillez noter qu'assembler une requête SQL comme celle-ci comporte des risques de sécurité potentiels.

Une meilleure façon de faire est d'utiliser instructions préparées. Qu'est-ce que cela signifie essentiellement est de mettre certains espaces réservés dans votre SQL où les valeurs réelles (telles que votre $sender_screen_name et $text) iraient.

J'ai cherché sur le net et est venu avec l'extrait de code suivant, montrant comment les instructions préparées peuvent être faites en PHP (désolé si ce n'est pas le meilleur PHP, je ne programme habituellement rien dans cette langue - mais je suppose que cela peut servir de point de départ raisonnable):

$dbSelect = $objDb->prepare("INSERT INTO received_queries VALUES (:ssn, :text"); 

$dbSelect->bindParam('ssn', $sender_screen_name); 
$dbSelect->bindParam('text', $text); 

en exécutant votre requête comme une déclaration préparée, vous n'avez pas à vous soucier de sortir vos cordes vous-même. PHP et le SGBDR géreront cela pour vous automatiquement.

+1

PHP et le SGBDR ne gèrera pas l'échappement automatique, car aucune échappée n'est utilisée dans ce cas. –

Questions connexes