Cómo escapar de las comillas simples en MySQL

98

¿Cómo inserto un valor en MySQL que consta de comillas simples o dobles? es decir

This is Ashok's Pen.

La comilla simple creará problemas. Puede haber otros personajes de escape.

¿Cómo se insertan los datos correctamente?

Ashok Gupta
fuente
Esto puede ser engañado. ¿Cómo puedo evitar la inyección de SQL en PHP? ...
Peter Mortensen

Respuestas:

126

En pocas palabras:

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

Entonces, dentro de la cadena, reemplace cada comilla simple con dos de ellas.

O:

SELECT 'This is Ashok\'s Pen.'

Escapa de eso =)

Robar
fuente
9
Es posible que desee actualizar su publicación para incluir mysql_real_escape_string () o addedlashes () como posibles soluciones ... como en uno de los comentarios a continuación, el OP indica que solo están leyendo un archivo e insertando.
James B
3
Los métodos mysql_ * no se recomiendan para uso futuro, ya que están obsoletos .
hd1
Esa es la respuesta correcta, aunque en estos días la mejor opción es usar uno de los
Ryan
10

'es el carácter de escape. Entonces tu cadena debería ser:

Esta es la pluma de Ashok

Si está utilizando algún código de front-end, debe reemplazar la cadena antes de enviar los datos al procedimiento almacenado.

Por ejemplo, en C # puede hacer

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

y luego pasar el valor al procedimiento almacenado.

SO Usuario
fuente
No estoy insertando datos manualmente, los extraigo del archivo y habrá vaklues: el bolígrafo de Ashok. Cómo insertarlo. creaetd un procedimiento para hacer esto .. cómo corregirlo.
Ashok Gupta
FWIW minor nit: la barra invertida es "el carácter de escape"; ''(dos comillas simples) es una alternativa especial permitida para "escapar" de un carácter de comillas simples.
ToolmakerSteve
9

Ver mi respuesta a "Cómo escapar caracteres en MySQL"

Cualquier biblioteca que esté usando para hablar con MySQL tendrá una función de escape incorporada, por ejemplo, en PHP podría usar mysqli_real_escape_string o PDO :: quote

Paul Dixon
fuente
1
No estoy insertando datos manualmente, los extraigo de Archivo y habrá valores: lápiz de Ashok. Cómo insertarlo. creó un procedimiento para hacer esto ... cómo corregirlo.
Ashok Gupta
Solo una nota 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 utiliza declaraciones preparadas, el conductor manejará cualquier escape. Por ejemplo (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
fuente
7

Utilice este código:

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

    mysql_real_escape_string($var);
?>

Esto resolverá su problema, porque la base de datos no puede detectar los caracteres especiales de una cadena.

user3818708
fuente
1
Solo una nota 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

Hay otra forma de hacer esto que puede ser más segura o no, dependiendo de su perspectiva. Requiere MySQL 5.6 o posterior, debido a la utilización de una función de cadena específica: FROM_BASE64.

Digamos que tiene este mensaje que le gustaría insertar:

"Ah", Nick Casi Decapitado agitó una mano elegante, "un asunto sin importancia ... No es como si realmente quisiera unirme ... Pensé en postularme, pero aparentemente no cumplo con los requisitos '- "

Esa cita tiene un montón de comillas simples y dobles y sería una verdadera molestia insertarla en MySQL. Si está insertando eso desde un programa, es fácil escapar de las comillas, etc. Pero, si tiene que poner eso en un script SQL, tendrá que editar el texto (para escapar de las comillas) que podría ser propenso a errores. o sensible al ajuste de palabras, etc.

En su lugar, puede codificar el texto en Base64, por lo que tiene una cadena "limpia":

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Algunas notas sobre la codificación Base64:

  1. La codificación Base64 es una codificación binaria , por lo que será mejor que se asegure de obtener el juego de caracteres correcto cuando realice la codificación, porque MySQL decodificará la cadena codificada en Base64 en bytes y luego los interpretará. Asegúrese de que base64MySQL esté de acuerdo sobre cuál es la codificación de caracteres (recomiendo UTF-8).
  2. Envolví la cadena en 50 columnas para facilitar la lectura en Stack Overflow. Puede ajustarlo a cualquier número de columnas que desee (o no ajustarlo en absoluto) y seguirá funcionando.

Ahora, para cargar esto en MySQL:

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

Esto se insertará sin quejas, y no tuvo que escapar manualmente ningún texto dentro de la cadena.

Christopher Schultz
fuente
5

Debes escapar de los caracteres especiales usando el \carácter.

This is Ashok's Pen.

Se convierte en:

This is Ashok\'s Pen.
simon622
fuente
3

Si desea mantener (') apóstrofo en la base de datos, use este código a continuación

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

$ new_value se puede almacenar en la base de datos.

Dheeraj singh
fuente
3

Puedes usar este código,

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

si mysqli_real_escape_string () no funciona.

Diablo
fuente
3

En PHP, use mysqli_real_escape_string .

Ejemplo del manual de 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
fuente
1
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
Michael Temitayo Adeyanju
fuente
0

Para el acceso mediante programación, puede utilizar marcadores de posición para escapar automáticamente de los caracteres no seguros.

En Perl DBI, por ejemplo, puede usar:

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

Utilice addedlahes () o mysql_real_escape_string ().

Antonio
fuente
Solo una nota 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
Sí, necesito agregar un i ahora mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony
Sería mejor actualizar su respuesta (por ejemplo, los comentarios pueden desaparecer en cualquier momento).
Peter Mortensen
0

De la forma en que lo hago, usando Delphi:

TheString para "escapar":

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

Solución:

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

Resultado:

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

Esta función reemplazará todos los Char (39) con "\ '" permitiéndole insertar o actualizar campos de texto en MySQL sin ningún problema.

¡Se encuentran funciones similares en todos los lenguajes de programación!

usuario7276516
fuente
0

Quizás podrías echar un vistazo a la función QUOTEen el manual de MySQL.

Julian
fuente