سؤال

أنا محبط جدا.كنت تريد أن تكون قادرة على إدراج في قاعدة بيانات الأسماء مع علامات الاقتباس المفردة - على سبيل المثال ، أوكونور.

لذلك ، عند إدراج في ديسيبل ، أنا:

 $lname = mysql_real_escape_string($_POST['lname']);

ثم إدراج دولار lname في ديسيبل.

عندما يكون في ديسيبل ، ويبدو O\'كونور.

لذا ، إذا كنت يذكر أن آخر اسم في تطبيق ويب سوف تضطر إلى استخدام:

 $lname = stripslashes($r["lname"]);

كل هذا يبدو للعمل بشكل جيد.ولكن لدي وظيفة البحث الذي سيتم البحث عن الأسماء الأخيرة وعرض النتائج.عند البحث يجب أن البحث عن O\'كونور من أجل الحصول على أي نتائج.

ترى بعد البحث في مربع النص تلقائيا بتخزين قيمة ما كان فقط بحثت عن (باستخدام دورات).حتى قانون بلدي هو هذا:

 $search = mysql_real_escape_string($_GET['search']);
 $_SESSION['search'] = $search;

كما قلت من قبل عندما كنت ابحث علي أن استخدام "O\'كونور" ، ثم بعد البحث في القيمة في مربع النص يصبح "O\\\\'كونور"

إنه تم إحباط محاولة لمعرفة ذلك.لا أحد يعرف ما أقوم به خطأ ؟ وذلك بفضل!

تحرير:

هنا هو بلدي php5.ini فيما يتعلق ونقلت السحر:

 ; Magic quotes
 ;

 ; Magic quotes for incoming GET/POST/Cookie data.
 magic_quotes_gpc = On

 ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
 magic_quotes_runtime = Off

 ; Use Sybase-style magic quotes (escape ' with '' instead of \').
 magic_quotes_sybase = Off

ومع ذلك, موقعي مستضاف على GoDaddy أو, وأنا لم يكن لديك أذونات تحرير الملف :(

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

المحلول

وهذا يبدو وكأنه ماجيك ونقلت تمكين في التكوين الخاص بي.

لمعرفة ما اذا كان كان ممكنا في الواقع:

echo get_magic_quotes_gpc();

لتعطيل أو تعديل ملف php.ini الخاص بك:

; Magic quotes
;

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

وأو إضافة هذا الخط إلى هتكس الخاص بك:

php_flag magic_quotes_gpc Off

نصائح أخرى

يتم تمكين

ونقلت ماجيك. ما يعنيه هذا هو أن أي شيء يوضع في آخر أو الحصول أو هرب مواقع أخرى مماثلة تلقائيا بحيث المبرمجين بداية لا داعي للقلق حول هذا الموضوع قدر. تم إهمال في الإصدار الحالي من PHP، إذا كنت أتذكر بشكل صحيح.

وماذا تريد أن تفعل للتعامل مع هذا، ويكون السيناريو تشغيل نفسه من أي تكوين هو ما يلي:

function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    return mysql_real_escape_string($value);
}

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

وتحرير الصغير وظيفة fixinput لمعرفة ما اذا كان لديه تثبيت PHP في الواقع سلسلة الهروب الحقيقية (الإصدارات القديمة لا):

  function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    if (function_exists('mysql_real_escape_string')) {
      return mysql_real_escape_string($value);
    }
    else {
      return mysql_escape_string($value);
    }
  }

عندما يكون في ديسيبل ، ويبدو O\'كونور.

لذا ، إذا كنت يذكر أن آخر اسم في تطبيق ويب سوف تضطر إلى استخدام:

 $lname = stripslashes($r["lname"]);

الخطأ!عند الهروب من السلاسل مع mysql_real_escape_string, هم فقط هرب في الاستعلام.قاعدة البيانات يفسر الاستعلام ، وبالتالي فإن البيانات ينتهي في قاعدة البيانات دون أي الهروب الشخصيات.لك لا لديك لاستخدام stripslashes عند سحب البيانات من قاعدة البيانات.إذا كنت تعتقد أنك تفعل ، فإن ذلك يعني أن البيانات الموجودة في قاعدة البيانات الخاصة بك هو المهترئ.على الأرجح لأن لديك ونقلت السحر انقلب على.

يجب عليك:

  • إيقاف ونقلت السحر أو عكس تأثيرها عالميا.انظر دليل للحصول على التفاصيل.
  • إما استخدام لا بد المعلمات (أفضل حل) أو الهروب من كل المتغيرات مع mysql_real_escape_string.يتعين عليك أن تفعل هذا حيث كنت بناء الاستعلام.
  • لا تفعل أي شيء على الاشياء يمكنك سحب من قاعدة البيانات.

على وجه الخصوص, لا تجعل دالة على غرار fixinput و المتغيرات التي يتم سردها في بعض الإجابات هنا.أنها طريقة خاطئة إلى حل المشكلة, لأنه في حالة أي البيانات التي لا يأتي من http الطلب.

وأنا لا تحقق لget_magic_quotes_gpc على / قبالة.

وأنا مجرد القيام $lname = mysql_real_escape_string(stripslashes($_POST['lname'])); حتى إذا لم يكن هناك أي النص المقتبس أنه متعود قطاع مائلة .. إذا كان هناك ونقلت فإنه سيتم تجريد أجبرتها على الفرار.

وويعمل المعجزات بالنسبة لي!

وكل ما عليك فعله هو أن تأخذ استعلام البحث، mysql_real_escape_string عليه، وينبغي أن يكون على ما يرام تماما. أفضل طريقة للقيام بذلك على الرغم من هي أبدا تخزينه هرب، وبدلا من مجرد الخروج منه كل شيء يذهب إلى قاعدة البيانات.

وبدلا من ذلك، قيام بذلك:

 $_SESSION['search'] = $_GET['search'];
 $search = mysql_real_escape_string($_GET['search']);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top