Comment échapper aux guillemets simples dans MySQL

98

Comment insérer une valeur dans MySQL composée de guillemets simples ou doubles. c'est à dire

This is Ashok's Pen.

Le devis unique créera des problèmes. Il peut y avoir d'autres caractères d'échappement.

Comment insérez-vous correctement les données?

Ashok Gupta
la source
Cela peut être dupe martelé dans Comment puis-je empêcher l'injection SQL dans PHP? ...
Peter Mortensen

Réponses:

127

En termes simples:

SELECT 'This is Ashok''s Pen.';

Donc, à l'intérieur de la chaîne, remplacez chaque guillemet simple par deux d'entre eux.

Ou:

SELECT 'This is Ashok\'s Pen.'

Échappez-le =)

Rob
la source
9
Vous voudrez peut-être mettre à jour votre message pour inclure mysql_real_escape_string () ou addlashes () comme solutions possibles ... comme dans l'un des commentaires ci-dessous, l'OP indique qu'ils ne font que lire à partir d'un fichier et s'insérer.
James B
3
Les méthodes mysql_ * ne sont pas recommandées pour une utilisation future, car elles sont obsolètes .
hd1
C'est la bonne réponse, bien que de nos jours, la meilleure option soit d'utiliser l'un des
Ryan
cela fonctionne pour moi. merci beaucoup
Ariful Islam il y a
10

'est le caractère d'échappement. Donc, votre chaîne devrait être:

C'est le stylo d'Ashok

Si vous utilisez du code frontal, vous devez effectuer un remplacement de chaîne avant d'envoyer les données à la procédure stockée.

Par exemple, en C #, vous pouvez faire

value = value.Replace("'", "''");

puis transmettez la valeur à la procédure stockée.

Utilisateur SO
la source
Je n'insère pas de données manuellement, je les extrait du fichier, et il y aura des vaklues: le stylo d'Ashok. Comment l'insérer. créer une procédure pour faire cela .. comment le corriger.
Ashok Gupta
FWIW minor nit: la barre oblique inverse est "le caractère d'échappement"; ''(deux guillemets simples) est une alternative spéciale autorisée pour "échapper" un caractère guillemet simple.
ToolmakerSteve
9

Voir ma réponse à "Comment échapper des caractères dans MySQL"

Quelle que soit la bibliothèque que vous utilisez pour parler à MySQL, une fonction d'échappement sera intégrée, par exemple en PHP, vous pouvez utiliser mysqli_real_escape_string ou PDO :: quote

Paul Dixon
la source
1
Je n'insère pas de données manuellement, je les extrait du fichier, et il y aura des valeurs: le stylo d'Ashok. Comment l'insérer. créé une procédure pour ce faire .. comment le corriger.
Ashok Gupta
Juste une remarque, This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee
7

Si vous utilisez des instructions préparées, le pilote gérera tout échappement. Par exemple (Java):

Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
    prepped.setString(1, line);
    prepped.executeQuery();
}
conn.commit();
conn.close();
hd1
la source
7

Utilisez ce code:

<?php
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

Cela résoudra votre problème, car la base de données ne peut pas détecter les caractères spéciaux d'une chaîne.

user3818708
la source
1
Juste une remarque, This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee
6

Il existe une autre façon de procéder qui peut être plus sûre ou non, selon votre point de vue. Il nécessite MySQL 5.6 ou ultérieure en raison de l'utilisation d'une fonction de chaîne spécifique: FROM_BASE64.

Disons que vous avez ce message que vous souhaitez insérer:

"Ah," Nick presque sans tête agita une main élégante, "une question sans importance ... Ce n'est pas comme si je voulais vraiment rejoindre ... Je pensais que je postulerais, mais apparemment je ne remplis pas les conditions requises. '- "

Cette citation a un tas de guillemets simples et doubles et serait vraiment pénible à insérer dans MySQL. Si vous insérez cela à partir d'un programme, il est facile d'échapper aux guillemets, etc. ou sensible au retour à la ligne, etc.

Au lieu de cela, vous pouvez encoder le texte en Base64, donc vous avez une chaîne "propre":

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Quelques notes sur l'encodage Base64:

  1. Le codage en Base64 est un codage binaire , vous feriez donc mieux de vous assurer que votre jeu de caractères est correct lorsque vous effectuez le codage, car MySQL va décoder la chaîne codée en Base64 en octets, puis les interpréter. Etre surbase64 que MySQL est d'accord sur le codage des caractères (je recommande UTF-8).
  2. J'ai enveloppé la chaîne à 50 colonnes pour plus de lisibilité sur Stack Overflow. Vous pouvez l'envelopper dans le nombre de colonnes de votre choix (ou ne pas l'envelopper du tout) et cela fonctionnera toujours.

Maintenant, pour charger ceci dans MySQL:

INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

Cela s'insérera sans aucune plainte, et vous n'avez pas besoin d'échapper manuellement au texte à l'intérieur de la chaîne.

Christopher Schultz
la source
5

Vous devez échapper les caractères spéciaux à l'aide du \caractère.

This is Ashok's Pen.

Devient:

This is Ashok\'s Pen.
simon622
la source
3

Si vous souhaitez conserver (') l'apostrophe dans la base de données, utilisez le code ci-dessous

$new_value = str_replace("'","\'", $value); 

$ new_value peut stocker dans la base de données.

Dheeraj singh
la source
3

Vous pouvez utiliser ce code,

<?php
     $var = "This is Ashok's Pen.";
     addslashes($var);
?>

si mysqli_real_escape_string () ne fonctionne pas.

Diable
la source
3

En PHP, utilisez mysqli_real_escape_string .

Exemple du manuel PHP:

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

$city = "'s Hertogenbosch";

/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("Error: %s\n", mysqli_sqlstate($link));
}

$city = mysqli_real_escape_string($link, $city);

/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("%d Row inserted.\n", mysqli_affected_rows($link));
}

mysqli_close($link);
?>
Marcel Verwey
la source
1
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
Michael Temitayo Adeyanju
la source
0

Pour l'accès par programme, vous pouvez utiliser des espaces réservés pour échapper automatiquement les caractères non sécurisés à votre place.

En Perl DBI, par exemple, vous pouvez utiliser:

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 
Elle Fie
la source
0

Utilisez soit addlahes (), soit mysql_real_escape_string ().

Anthony
la source
Juste une remarque, This, mysql_real_escape_string() extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee
Ouais, besoin d'ajouter un i maintenant mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony
Il serait préférable de mettre à jour votre réponse (par exemple, les commentaires peuvent disparaître à tout moment).
Peter Mortensen
0

Comme je le fais, en utilisant Delphi:

TheString pour "échapper":

TheString=" bla bla bla 'em some more apo:S 'em and so on ";

Solution:

StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);

Résultat:

TheString=" bla bla bla \'em some more apo:S \'em and so on ";

Cette fonction remplacera tous les Char (39) par "\ '" vous permettant d'insérer ou de mettre à jour des champs de texte dans MySQL sans aucun problème.

Des fonctions similaires se trouvent dans tous les langages de programmation!

user7276516
la source
0

Vous pourriez peut-être jeter un œil à la fonction QUOTEdans le manuel MySQL.

julien
la source