ฉันจะแทรกค่าใน MySQL ที่ประกอบด้วยอัญประกาศเดี่ยวหรือคู่ได้อย่างไร กล่าวคือ
This is Ashok's Pen.
การอ้างเพียงครั้งเดียวจะสร้างปัญหา อาจมีอักขระ Escape อื่น ๆ
คุณใส่ข้อมูลอย่างถูกต้องได้อย่างไร?
ฉันจะแทรกค่าใน MySQL ที่ประกอบด้วยอัญประกาศเดี่ยวหรือคู่ได้อย่างไร กล่าวคือ
This is Ashok's Pen.
การอ้างเพียงครั้งเดียวจะสร้างปัญหา อาจมีอักขระ Escape อื่น ๆ
คุณใส่ข้อมูลอย่างถูกต้องได้อย่างไร?
คำตอบ:
ใส่ค่อนข้างง่าย:
SELECT 'This is Ashok''s Pen.';
ดังนั้นภายในสตริงให้แทนที่เครื่องหมายคำพูดเดี่ยวแต่ละรายการด้วยสองคำพูด
หรือ:
SELECT 'This is Ashok\'s Pen.'
หนีมัน =)
'คืออักขระหลบหนี ดังนั้นสตริงของคุณควรเป็น:
นี่คือปากกาของ Ashok
หากคุณกำลังใช้โค้ดส่วนหน้าคุณต้องทำการแทนที่สตริงก่อนที่จะส่งข้อมูลไปยังโพรซีเดอร์ที่เก็บไว้
ตัวอย่างเช่นใน C # คุณสามารถทำได้
value = value.Replace("'", "''");
จากนั้นส่งค่าไปยังกระบวนงานที่เก็บไว้
''
(เครื่องหมายคำพูดเดี่ยวสองคำ) เป็นทางเลือกพิเศษที่อนุญาตสำหรับ "การหลีกเลี่ยง" อักขระอัญประกาศเดี่ยว
ดูคำตอบของฉันสำหรับ"วิธีการหลีกเลี่ยงอักขระใน MySQL"
ไม่ว่าคุณจะใช้ไลบรารีใดเพื่อพูดคุยกับ MySQL จะมีฟังก์ชัน Escape ในตัวเช่นใน PHP คุณสามารถใช้mysqli_real_escape_stringหรือPDO :: quote
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.
.
หากคุณใช้งบที่เตรียมไว้คนขับจะจัดการกับการหลบหนีใด ๆ ตัวอย่างเช่น (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();
ใช้รหัสนี้:
<?php
$var = "This is Ashok's Pen.";
mysql_real_escape_string($var);
?>
วิธีนี้จะช่วยแก้ปัญหาของคุณเนื่องจากฐานข้อมูลไม่สามารถตรวจพบอักขระพิเศษของสตริงได้
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.
.
มีอีกวิธีหนึ่งในการดำเนินการนี้ซึ่งอาจปลอดภัยกว่าหรือไม่ก็ได้ขึ้นอยู่กับมุมมองของคุณ มันต้อง MySQL 5.6 FROM_BASE64
หรือในภายหลังเนื่องจากการใช้ฟังก์ชั่นสตริงที่เฉพาะเจาะจงไปนี้:
สมมติว่าคุณมีข้อความนี้ที่ต้องการแทรก:
"อ๊ะ" นิคเกือบหัวขาดโบกมืออย่างสง่างาม "ไม่สำคัญเลย ... ... มันไม่เหมือนกับว่าฉันอยากจะเข้าร่วมจริงๆ ... ... คิดว่าจะสมัคร แต่ดูเหมือนว่าฉันไม่ทำตามข้อกำหนด '- "
คำพูดนั้นมีเครื่องหมายคำพูดเดี่ยวและคู่และจะเป็นความเจ็บปวดอย่างแท้จริงที่จะแทรกลงใน MySQL หากคุณกำลังแทรกสิ่งนั้นจากโปรแกรมมันเป็นเรื่องง่ายที่จะหลีกเลี่ยงเครื่องหมายคำพูด ฯลฯ แต่ถ้าคุณต้องใส่ลงในสคริปต์ SQL คุณจะต้องแก้ไขข้อความ (เพื่อหลีกเลี่ยงเครื่องหมายคำพูด) ซึ่งอาจเกิดข้อผิดพลาดได้ง่าย หรือไวต่อการตัดคำ ฯลฯ
คุณสามารถเข้ารหัสข้อความ Base64 แทนได้ดังนั้นคุณจึงมีสตริง "สะอาด":
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
หมายเหตุบางประการเกี่ยวกับการเข้ารหัส Base64:
base64
และ MySQL ยอมรับว่าการเข้ารหัสอักขระคืออะไร (ฉันแนะนำ UTF-8)ตอนนี้เพื่อโหลดสิ่งนี้ลงใน MySQL:
INSERT INTO my_table (text) VALUES (FROM_BASE64('
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));
สิ่งนี้จะแทรกโดยไม่มีข้อร้องเรียนใด ๆ และคุณไม่จำเป็นต้องหลีกเลี่ยงข้อความใด ๆ ภายในสตริงด้วยตนเอง
คุณควรหลีกเลี่ยงอักขระพิเศษโดยใช้\
อักขระ
This is Ashok's Pen.
กลายเป็น:
This is Ashok\'s Pen.
คุณสามารถใช้รหัสนี้
<?php
$var = "This is Ashok's Pen.";
addslashes($var);
?>
หาก mysqli_real_escape_string () ไม่ทำงาน
ใน PHP ใช้mysqli_real_escape_string
ตัวอย่างจากคู่มือ 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);
?>
หากคุณต้องการเก็บ(')
เครื่องหมายวรรคตอนในฐานข้อมูลให้ใช้รหัสด้านล่างนี้:
$new_value = str_replace("'","\'", $value);
$new_value
สามารถจัดเก็บในฐานข้อมูล
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
หากคุณใช้ PHP เพียงใช้ฟังก์ชัน addlashes ()
สำหรับการเข้าถึงแบบเป็นโปรแกรมคุณสามารถใช้ตัวยึดตำแหน่งเพื่อหลีกเลี่ยงอักขระที่ไม่ปลอดภัยสำหรับคุณโดยอัตโนมัติ
ตัวอย่างเช่นใน Perl DBI คุณสามารถใช้:
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
ใช้ addlahes () หรือ mysql_real_escape_string ()
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.
.
วิธีที่ฉันทำโดยใช้ Delphi:
TheString สู่ "escape":
TheString=" bla bla bla 'em some more apo:S 'em and so on ";
วิธีการแก้:
StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);
ผลลัพธ์:
TheString=" bla bla bla \'em some more apo:S \'em and so on ";
ฟังก์ชันนี้จะแทนที่ Char (39) ทั้งหมดด้วย "\ '" เพื่อให้คุณสามารถแทรกหรืออัปเดตช่องข้อความใน MySQL ได้โดยไม่มีปัญหา
ฟังก์ชันที่คล้ายกันพบได้ในภาษาโปรแกรมทั้งหมด!
บางทีคุณอาจดูฟังก์ชันQUOTE
ในคู่มือ MySQL