Cara keluar dari tanda kutip tunggal di MySQL

98

Bagaimana cara memasukkan nilai di MySQL yang terdiri dari tanda kutip tunggal atau ganda. yaitu

This is Ashok's Pen.

Kutipan tunggal akan menimbulkan masalah. Mungkin ada karakter pelarian lainnya.

Bagaimana Anda memasukkan data dengan benar?

Ashok Gupta
sumber
Ini mungkin ditipu menjadi Bagaimana saya bisa mencegah injeksi SQL di PHP? ...
Peter Mortensen

Jawaban:

126

Sederhananya:

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

Jadi di dalam string, ganti setiap kutipan dengan dua di antaranya.

Atau:

SELECT 'This is Ashok\'s Pen.'

Escape itu =)

rampok
sumber
9
Anda mungkin ingin memperbarui posting Anda untuk menyertakan mysql_real_escape_string () atau addlashes () sebagai solusi yang mungkin ... seperti di salah satu komentar di bawah ini, OP menyatakan bahwa mereka hanya membaca dari file dan menyisipkan.
James B
3
Metode mysql_ * tidak direkomendasikan untuk penggunaan di masa mendatang, karena sudah usang .
hd1
Itu adalah jawaban yang benar, meskipun akhir-akhir ini pilihan terbaik adalah menggunakan salah satu
Ryan
10

'adalah karakter pelarian. Jadi string Anda harus:

Ini Pena Ashok

Jika Anda menggunakan beberapa kode front-end, Anda perlu melakukan penggantian string sebelum mengirim data ke prosedur tersimpan.

Misalnya, di C # Anda bisa melakukannya

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

dan kemudian meneruskan nilai ke prosedur tersimpan.

Pengguna SO
sumber
Saya tidak memasukkan data secara manual, saya mengekstraknya dari File, dan akan ada vaklues: Pena Ashok. Bagaimana cara memasukkannya. membuat prosedur untuk melakukan ini .. bagaimana membuatnya benar.
Ashok Gupta
FWIW minor nit: backslash adalah "karakter melarikan diri"; ''(dua tanda kutip tunggal) adalah alternatif khusus yang diperbolehkan untuk "menyela" karakter tanda kutip tunggal.
ToolmakerSteve
9

Lihat jawaban saya untuk "Cara keluar dari karakter di MySQL"

Perpustakaan apa pun yang Anda gunakan untuk berbicara dengan MySQL akan memiliki fungsi pelolosan bawaan, misalnya dalam PHP Anda dapat menggunakan mysqli_real_escape_string atau PDO :: quote

Paul Dixon
sumber
1
Saya tidak memasukkan data secara manual, saya mengekstraknya dari File, dan akan ada nilai: pena Ashok. Bagaimana cara memasukkannya. membuat prosedur untuk melakukan ini .. bagaimana membuatnya benar.
Ashok Gupta
Sekadar catatan 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

Jika Anda menggunakan pernyataan yang sudah disiapkan, driver akan menangani pelarian apa pun. Misalnya (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
sumber
7

Gunakan kode ini:

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

    mysql_real_escape_string($var);
?>

Ini akan menyelesaikan masalah Anda, karena database tidak dapat mendeteksi karakter khusus dari sebuah string.

pengguna3818708
sumber
1
Sekadar catatan 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

Ada cara lain untuk melakukan ini yang mungkin lebih aman atau tidak, tergantung pada perspektif Anda. Hal ini membutuhkan MySQL 5.6 atau kemudian karena penggunaan fungsi string tertentu: FROM_BASE64.

Katakanlah Anda memiliki pesan ini yang ingin Anda masukkan:

"Ah," Nick si Kepala-Nyaris-Putus melambai dengan anggun, "hal yang tidak penting ... Bukannya aku benar-benar ingin bergabung ... Kupikir aku akan melamar, tapi ternyata aku 'tidak memenuhi persyaratan '- "

Kutipan itu memiliki banyak tanda kutip tunggal dan ganda dan akan sangat merepotkan untuk dimasukkan ke dalam MySQL. Jika Anda memasukkannya dari program, mudah untuk melepaskan tanda kutip, dll. Tetapi, jika Anda harus memasukkannya ke dalam skrip SQL, Anda harus mengedit teks (untuk menghindari tanda kutip) yang mungkin rawan kesalahan atau sensitif terhadap pembungkusan kata, dll.

Sebaliknya, Anda dapat menyandikan teks Base64, sehingga Anda memiliki string "bersih":

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Beberapa catatan tentang pengkodean Base64:

  1. Pengkodean Base64 adalah pengkodean biner , jadi Anda sebaiknya memastikan bahwa Anda mengatur karakter dengan benar ketika Anda melakukan pengkodean, karena MySQL akan mendekode string yang dikodekan Base64 menjadi byte dan kemudian menafsirkannya. Pastikan base64dan MySQL setuju tentang apa itu pengkodean karakter (saya merekomendasikan UTF-8).
  2. Saya telah membungkus string menjadi 50 kolom agar terbaca di Stack Overflow. Anda dapat membungkusnya ke sejumlah kolom yang Anda inginkan (atau tidak membungkusnya sama sekali) dan itu akan tetap berfungsi.

Sekarang, untuk memuat ini ke MySQL:

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

Ini akan dimasukkan tanpa keluhan apa pun, dan Anda tidak perlu keluar dari teks secara manual di dalam string.

Christopher Schultz
sumber
5

Anda harus keluar dari karakter khusus menggunakan \karakter tersebut.

This is Ashok's Pen.

Menjadi:

This is Ashok\'s Pen.
simon622
sumber
3

Jika Anda ingin menyimpan (') apostrof dalam database gunakan kode di bawah ini

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

$ new_value dapat disimpan dalam database.

Dheeraj singh
sumber
3

Anda dapat menggunakan kode ini,

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

jika mysqli_real_escape_string () tidak berfungsi.

setan
sumber
3

Di PHP, gunakan mysqli_real_escape_string .

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

Jika Anda menggunakan PHP, cukup gunakan fungsi addlashes ().

Addlashes PHP Manual

Sonu
sumber
0

Untuk akses terprogram, Anda dapat menggunakan placeholder untuk secara otomatis keluar dari karakter yang tidak aman untuk Anda.

Di Perl DBI, misalnya, Anda dapat menggunakan:

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

Gunakan addlahes () atau mysql_real_escape_string ().

Anthony
sumber
Sekadar catatan 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
Yup, perlu menambahkan i sekarang mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony
Akan lebih baik untuk memperbarui jawaban Anda (mis. Komentar dapat hilang kapan saja).
Peter Mortensen
0

Cara saya melakukannya, dengan menggunakan Delphi:

TheString untuk "melarikan diri":

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

Larutan:

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

Hasil:

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

Fungsi ini akan menggantikan semua Char (39) dengan "\ '" yang memungkinkan Anda untuk memasukkan atau memperbarui kolom teks di MySQL tanpa masalah.

Fungsi serupa ditemukan di semua bahasa pemrograman!

pengguna7276516
sumber
0

Mungkin Anda bisa melihat fungsi QUOTEdi manual MySQL.

Julian
sumber