Como escapar de aspas simples no MySQL

98

Como faço para inserir um valor no MySQL que consiste em aspas simples ou duplas. ie

This is Ashok's Pen.

A aspa simples criará problemas. Pode haver outros caracteres de escape.

Como você insere os dados corretamente?

Ashok Gupta
fonte
Isso pode ser mal interpretado como posso evitar a injeção de SQL no PHP? ...
Peter Mortensen

Respostas:

126

Simplificando:

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

Portanto, dentro da string, substitua cada aspa simples por duas delas.

Ou:

SELECT 'This is Ashok\'s Pen.'

Escape it =)

Roubar
fonte
9
Você pode querer atualizar sua postagem para incluir mysql_real_escape_string () ou addslashes () como soluções possíveis ... como em um dos comentários abaixo, o OP afirma que eles estão apenas lendo o arquivo e inserindo.
James B de
3
Os métodos mysql_ * não são recomendados para uso futuro, pois estão obsoletos .
hd1
Essa é a resposta certa, embora atualmente a melhor opção seja usar um dos
Ryan
10

'é o caractere de escape. Portanto, sua string deve ser:

Esta é a caneta de Ashok

Se você estiver usando algum código de front-end, precisará fazer uma substituição de string antes de enviar os dados para o procedimento armazenado.

Por exemplo, em C # você pode fazer

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

e, em seguida, passe o valor para o procedimento armazenado.

Usuário SO
fonte
Não estou inserindo dados manualmente, eu extraio de Arquivo, e haverá vaklues: a caneta de Ashok. Como inserir. criou um procedimento para fazer isso .. como torná-lo correto.
Ashok Gupta
FWIW menor nit: barra invertida é "o caractere de escape"; ''(duas aspas simples) é uma alternativa especial permitida para "escapar" de um caractere de aspas simples.
ToolmakerSteve
9

Veja minha resposta para "Como escapar caracteres no MySQL"

Qualquer biblioteca que você estiver usando para conversar com o MySQL terá uma função de escape embutida, por exemplo, no PHP você pode usar mysqli_real_escape_string ou PDO :: quote

Paul Dixon
fonte
1
Não estou inserindo dados manualmente, eu extraio de Arquivo, e haverá valores: caneta de Ashok. Como inserir. criou um procedimento para fazer isso .. como corrigi-lo.
Ashok Gupta
Apenas uma 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

Se você usar instruções preparadas, o driver tratará de qualquer escape. Por exemplo (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
fonte
7

Use este código:

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

    mysql_real_escape_string($var);
?>

Isso resolverá seu problema, porque o banco de dados não consegue detectar os caracteres especiais de uma string.

user3818708
fonte
1
Apenas uma 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

Existe outra maneira de fazer isso que pode ou não ser mais segura, dependendo da sua perspectiva. Requer MySQL 5.6 ou posterior devido ao uso de uma função de string específica:FROM_BASE64 .

Digamos que você tenha esta mensagem que gostaria de inserir:

"Ah", Nick Quase Sem Cabeça acenou com a mão elegante, "uma questão sem importância ... Não é como se eu realmente quisesse entrar ... Pensei em me inscrever, mas aparentemente não cumpro os requisitos. '- "

Essa citação tem um monte de aspas simples e duplas e seria muito chato inserir no MySQL. Se você estiver inserindo isso de um programa, é fácil escapar das aspas, etc. Mas, se você tiver que colocar isso em um script SQL, você terá que editar o texto (para escapar das aspas) que pode estar sujeito a erros ou sensível a quebra de linha, etc.

Em vez disso, você pode codificar o texto em Base64 para ter uma string "limpa":

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Algumas notas sobre a codificação Base64:

  1. A codificação Base64 é uma codificação binária , então é melhor você ter certeza de obter seu conjunto de caracteres correto ao fazer a codificação, porque o MySQL irá decodificar a string codificada em Base64 em bytes e então interpretá-los. Tenha certezabase64 MySQL concorda com a codificação de caracteres (eu recomendo UTF-8).
  2. Eu envolvi a string em 50 colunas para facilitar a leitura no Stack Overflow. Você pode agrupá-lo em qualquer número de colunas que desejar (ou não agrupá-lo) e ainda funcionará.

Agora, para carregar isso no MySQL:

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

Isso será inserido sem qualquer reclamação e você não precisará escapar manualmente nenhum texto dentro da string.

Christopher Schultz
fonte
5

Você deve escapar dos caracteres especiais usando o \caractere.

This is Ashok's Pen.

Torna-se:

This is Ashok\'s Pen.
simon622
fonte
3

Se você quiser manter o apóstrofo (') no banco de dados, use o código abaixo

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

$ new_value pode armazenar no banco de dados.

Dheeraj Singh
fonte
3

Você pode usar este código,

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

se mysqli_real_escape_string () não funcionar.

Diabo
fonte
3

Em PHP, use mysqli_real_escape_string .

Exemplo do Manual do 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
fonte
1
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
Michael Temitayo Adeyanju
fonte
1

Se você estiver usando PHP, apenas use a função addslashes ().

Addlashes do manual do PHP

Sonu
fonte
0

Para acesso programático, você pode usar marcadores de para escapar automaticamente de caracteres não seguros para você.

Em Perl DBI, por exemplo, você pode usar:

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

Use addlahes () ou mysql_real_escape_string ().

Anthony
fonte
Apenas uma 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
Sim, preciso adicionar um i now mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony
Seria melhor atualizar sua resposta (por exemplo, os comentários podem desaparecer a qualquer momento).
Peter Mortensen de
0

Do jeito que eu faço, usando Delphi:

TheString para "escapar":

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

Solução:

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

Resultado:

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

Esta função irá substituir todos os Char (39) por "\ '" permitindo a você inserir ou atualizar campos de texto no MySQL sem nenhum problema.

Funções semelhantes são encontradas em todas as linguagens de programação!

user7276516
fonte
0

Talvez você possa dar uma olhada em função QUOTEno manual do MySQL.

Julian
fonte