سؤال

كيف يمكنني إدراج قيمة في MySQL التي تتكون من علامات اقتباس واحدة أو مزدوجة. بمعنى آخر

This is Ashok's Pen.

اقتباس واحد سيخلق مشاكل. قد يكون هناك شخصيات هروب أخرى.

كيف تقوم بإدراج البيانات بشكل صحيح؟

هل كانت مفيدة؟

المحلول

ضعها ببساطة:

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

حتى داخل السلسلة، استبدل كل اقتباس واحد مع اثنين منهم.

أو:

SELECT 'This is Ashok\'s Pen.'

الهروب منه =)

نصائح أخرى

انظر جوابي "كيفية الهروب من الأحرف في mysql"

مهما كانت المكتبة التي تستخدمها للتحدث مع MySQL ستتاح لها وظيفة هربية مدمجة، على سبيل المثال في PHP، يمكنك استخدامها mysqli_real_escape_string. أو PDO :: Quote.

هي شخصية الهروب. لذلك يجب أن تكون السلسلة الخاصة بك:

هذا هو قلم أشوك

إذا كنت تستخدم بعض التعليمات البرمجية الأمامية، فأنت بحاجة إلى إجراء استبدال سلسلة قبل إرسال البيانات إلى الإجراء المخزن.

على سبيل المثال، في C # يمكنك القيام به

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

ثم تمرير القيمة إلى الإجراء المخزن.

إذا كنت تستخدم البيانات المعدة، فسيقوم السائق مع أي هروب. على سبيل المثال (جافا):

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

سيحاول ذلك مشكلتك، لأن قاعدة البيانات لا تستطيع اكتشاف الأحرف الخاصة من السلسلة.

هناك طريقة أخرى للقيام بذلك والتي قد تكون أو لا تكون أكثر أمانا، اعتمادا على وجهة نظرك. يتطلب MySQL 5.6 أو الأحدث بسبب استخدام وظيفة سلسلة محددة: FROM_BASE64.

دعنا نقول أن لديك هذه الرسالة التي ترغب في إدراجها:

ولوح نيك "آه" تقريبا نيك بيد أنيقة، "مسألة لا أهمية.... .. ليس كما لو أنني أردت حقا الانضمام....... "-"

يحتوي هذا الاقتباس على مجموعة من اقتباسات واحدة ومضاعفة ستكون ألم حقيقي لإدخاله في MySQL. إذا كنت تقوم بإدراج ذلك من برنامج، فمن السهل الهروب من علامات الاقتباس، وما إلى ذلك، ولكن، إذا كان عليك وضع ذلك في برنامج نصي SQL، فسيتعين عليك تحرير النص (للهروب من علامات الاقتباس) التي قد تكون عرضة للخطأ أو حساسة لفافة الكلمات، إلخ.

بدلا من ذلك، يمكنك أن تقوم بتشفير النص، لذلك لديك سلسلة "نظيفة":

JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K

بعض الملاحظات حول Pase64-Encoding:

  1. Base64-Encoding هو الترميز الثنائي, ، لذلك من الأفضل أن تتأكد من أن تحصل على شخصيتك الصحيحة عند قيامك بالترميز، لأن MySQL ستقوم بفك تشفير السلسلة المشفرة من Base64 إلى بايت ثم قم بتفسير تلك. تأكد base64 وتوافق MySQL على ما هو ترميز الشخصية (أوصي UTF-8).
  2. لقد لفت السلسلة إلى 50 أعمدة للقراءة على تجاوز سعة المكدس. يمكنك التفاف ذلك إلى أي عدد من الأعمدة التي تريدها (أو عدم التفاف على الإطلاق) وسوف تظل تعمل.

الآن، لتحميل هذا في MySQL:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));

سيتضمن ذلك دون أي شكاوى، ولم يكن لديك ما عليك سوى الهروب يدويا بأي نص داخل السلسلة.

يجب عليك الهروب من الأحرف الخاصة باستخدام \ حرف.

This is Ashok's Pen.

يصبح:

This is Ashok\'s Pen.

إذا كنت ترغب في الحفاظ على (') apostrophe في قاعدة البيانات استخدام هذا الرمز أدناه

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

يمكن أن تخزن $ New_Value في قاعدة البيانات.

يمكنك استخدام هذا الرمز،

<?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);
?>
$var = mysqli_real_escape_string($conn, $_POST['varfield']);

إذا كنت تستخدم PHP، فما عليك سوى استخدام وظيفة AddSlashes ().

دليل PHP Addslashes.

للوصول البرنامجي، يمكنك استخدام الناظمين للهروب من الأحرف غير الآمنة تلقائيا لك.

في بيرل DBI، على سبيل المثال، يمكنك استخدام:

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

استخدم إما AddSlahes () أو mysql_real_escape_string ().

الطريقة التي أفعل بها، باستخدام دلفي:

التضاءل إلى "الهروب":

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top