MySQL'de tek tırnaktan nasıl kaçılır


Yanıtlar:


129

Basitçe söylemek gerekirse:

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

Yani dizenin içinde, her bir alıntıyı ikisiyle değiştirin.

Veya:

SELECT 'This is Ashok\'s Pen.'

Escape it =)


9
Gönderinizi, olası çözümler olarak mysql_real_escape_string () veya addslashes () içerecek şekilde güncellemek isteyebilirsiniz ... Aşağıdaki yorumlardan birinde olduğu gibi, OP sadece dosyadan okuduklarını ve eklemeyi yaptıklarını belirtir.
James B

3
Mysql_ * yöntemleri, kullanımdan kaldırıldığı için ileride kullanım için önerilmez .
hd1

Bu doğru cevap, ancak bugünlerde en iyi seçenek aşağıdakilerden birini kullanmak
Ryan

bu benim için çalıştı. çok teşekkürler
Ariful Islam

10

'kaçış karakteridir. Yani dizeniz şöyle olmalıdır:

Bu Ashok'un Kalemi

Bazı ön uç kodları kullanıyorsanız, verileri saklı yordama göndermeden önce bir dize değiştirme yapmanız gerekir.

Örneğin, C # ile şunları yapabilirsiniz:

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

ve sonra değeri saklı yordama iletir.


Verileri manuel olarak eklemiyorum, Dosyadan çıkarıyorum ve vaklues olacak: Ashok'un kalemi. Nasıl eklenir. bunu yapmak için bir prosedür oluşturdum .. nasıl düzeltileceğini.
Ashok Gupta

FWIW küçük nit: ters eğik çizgi "kaçış karakteridir"; ''(iki tek tırnak), bir tek tırnak karakterinden "kaçmak" için izin verilen özel bir alternatiftir.
ToolmakerSteve

9

"MySQL'de karakterlerden nasıl kaçılırım" sorusuna cevabıma bakın

MySQL ile konuşmak için hangi kütüphaneyi kullanıyor olursanız olun, yerleşik bir kaçış işlevine sahip olacaktır, örneğin PHP'de mysqli_real_escape_string veya PDO :: quote kullanabilirsiniz.


1
Verileri manuel olarak eklemiyorum, Dosyadan çıkarıyorum ve değerler olacak: Ashok'un kalemi. Nasıl eklenir. bunu yapmak için bir prosedür oluşturdu .. nasıl düzeltileceğini.
Ashok Gupta

Sadece bir not 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

Hazırlanmış ifadeleri kullanırsanız, sürücü herhangi bir kaçışla ilgilenecektir. Örneğin (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();

7

Bu kodu kullanın:

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

    mysql_real_escape_string($var);
?>

Bu, sorununuzu çözecektir, çünkü veritabanı bir dizenin özel karakterlerini algılayamaz.


1
Sadece bir not 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

Bakış açınıza bağlı olarak, bunu yapmanın daha güvenli olabilecek ya da olmayabilecek başka bir yolu vardır. Bu MySQL 5.6 veya sonrası çünkü belirli bir dize fonksiyonunun kullanımı gerektirir: FROM_BASE64.

Diyelim ki eklemek istediğiniz bu mesaj elinizde:

"Ah," Neredeyse Kafasız Nick zarif bir el salladı, "önemsiz bir mesele ... Sanki gerçekten katılmak istemiyordum ... ... Başvurabilirim sandım, ama görünüşe göre 'gereksinimleri karşılamıyorum '- "

Bu alıntıda bir sürü tek ve çift tırnak vardır ve MySQL'e eklemek gerçek bir acı olacaktır. Bunu bir programdan ekliyorsanız, tırnak işaretlerinden kaçmak kolaydır, vb. Ancak, bunu bir SQL betiğine koymanız gerekiyorsa, metni düzenlemeniz gerekir (tırnak işaretlerinden kaçmak için), bu da hataya açık olabilir. veya kelime kaydırmaya vb. duyarlı

Bunun yerine, metni Base64 olarak kodlayabilirsiniz, böylece "temiz" bir dizeye sahip olursunuz:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Base64 kodlamasıyla ilgili bazı notlar:

  1. Base64 kodlaması ikili bir kodlamadır , bu nedenle kodlamayı yaptığınızda karakter kümenizi doğru yaptığınızdan emin olmalısınız çünkü MySQL Base64 kodlu dizeyi baytlara çözecek ve sonra bunları yorumlayacaktır. base64MySQL'in karakter kodlamasının ne olduğu konusunda hemfikir olduğundan emin olun (UTF-8'i öneririm).
  2. Stack Overflow'da okunabilirlik için dizeyi 50 sütuna sardım. İstediğiniz sayıda sütuna sarabilirsiniz (veya hiç sarmayın) ve yine de çalışacaktır.

Şimdi, bunu MySQL'e yüklemek için:

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

Bu, herhangi bir şikayet olmadan eklenecektir ve dize içindeki herhangi bir metinden manuel olarak çıkmanız gerekmedi.


5

Karakteri kullanarak özel karakterlerden \kaçınmalısınız.

This is Ashok's Pen.

Olur:

This is Ashok\'s Pen.

3

Bu kodu kullanabilirsiniz,

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

mysqli_real_escape_string () çalışmazsa.


3

PHP'de mysqli_real_escape_string kullanın .

PHP Kılavuzundan Örnek:

<?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);
?>

3

(')Veritabanında kesme işaretini tutmak istiyorsanız, aşağıdaki kodu kullanın:

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

$new_value veritabanında saklayabilir.




0

Programlı erişim için, güvenli olmayan karakterlerden sizin için otomatik olarak çıkış yapmak üzere yer tutucular kullanabilirsiniz .

Örneğin Perl DBI'da şunları kullanabilirsiniz:

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

0

Addslahes () veya mysql_real_escape_string () kullanın.


Sadece bir not 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


Cevabınızı güncellemeniz daha iyi olur (örneğin, yorumlar her an kaybolabilir).
Peter Mortensen

0

Delphi'yi kullanarak yaptığım yol:

TheString to "escape":

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

Çözüm:

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

Sonuç:

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

Bu işlev tüm Char (39) 'ı "\'" ile değiştirerek MySQL'de herhangi bir sorun olmadan metin alanları eklemenize veya güncellemenize izin verir.

Tüm programlama dillerinde benzer işlevler bulunur!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.