mysql_real_escape_string () فقط يصنع سلسلة فارغة؟
-
25-09-2019 - |
سؤال
أنا أستخدم طلب jQuery Ajax إلى صفحة تسمى like.php
يتصل بقاعدة البيانات الخاصة بي ويدرج صفًا. هذا ال like.php
الشفرة:
<?php
// Some config stuff
define(DB_HOST, 'localhost');
define(DB_USER, 'root');
define(DB_PASS, '');
define(DB_NAME, 'quicklike');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die('ERROR: ' . mysql_error());
$sel = mysql_select_db(DB_NAME, $link) or die('ERROR: ' . mysql_error());
$likeMsg = mysql_real_escape_string(trim($_POST['likeMsg']));
$timeStamp = time();
if(empty($likeMsg))
die('ERROR: Message is empty');
$sql = "INSERT INTO `likes` (like_message, timestamp)
VALUES ('$likeMsg', $timeStamp)";
$result = mysql_query($sql, $link) or die('ERROR: ' . mysql_error());
echo mysql_insert_id();
mysql_close($link);
?>
الخط الإشكالي هو $likeMsg = mysql_real_escape_string(trim($_POST['likeMsg']));
. يبدو أنه يعيد فقط سلسلة فارغة ، وفي قاعدة البيانات الخاصة بي تحت like_message
العمود كل ما أراه هو إدخالات فارغة. إذا أزلت mysql_real_escape_string()
رغم ذلك ، فهو يعمل بشكل جيد.
إليك رمز jQuery الخاص بي إذا كان يساعد.
$('#like').bind('keydown', function(e) {
if(e.keyCode == 13) {
var likeMessage = $('#changer p').html();
if(likeMessage) {
$.ajax({
cache: false,
url: 'like.php',
type: 'POST',
data: { likeMsg: likeMessage },
success: function(data) {
$('#like').unbind();
writeLikeButton(data);
}
});
} else {
$('#button_container').html('');
}
}
});
كل رمز jQuery يعمل بشكل جيد ، لقد اختبرته بنفسي بشكل مستقل.
أي مساعدة يحظى بتقدير كبير، وذلك بفضل.
المحلول
هل أنت متأكد من 1000 ٪ $_POST["likeMsg"]
في الواقع يحتوي على شيء؟
أما بالنسبة لل mysql_real_escape_string()
إرجاع قيمة فارغة ، كتيب يقول أن هناك موقفًا واحدًا فقط يمكن أن يحدث فيه:
ملاحظة: مطلوب اتصال MySQL قبل استخدام mysql_real_escape_string () وإلا يتم إنشاء خطأ في المستوى e_warning ، ويتم إرجاع خطأ. إذا لم يتم تعريف Link_identifier ، فسيتم استخدام اتصال MySQL الأخير.
لا يبدو أن هذا هو الحال هنا ، حيث لديك اتصال مفتوح. غريب.
نصائح أخرى
نظرًا لأن الإجابات الأخرى لا توضح ما يجب القيام به بالضبط ، إليك:
عندما تفعل
$db_connection = new mysqli($SERVER, $USERNAME, $PASSWORD, $DATABASE);
تحتاج إلى الهروب مثل هذا:
$newEscapedString = $db_connection->real_escape_string($unescapedString);
ملاحظة: لأن الناس يقومون بتخفيض هذا (WTF !؟) ، إليك الصفحة الرسمية لدليل PHP الرسمي الذي يقول بالضبط ما نشرته: دليل real_escape_string @ php.
بالنسبة للأشخاص الذين قد يجدون هذا مرة أخرى الآن ، واجهت هذه المشكلة وأنا أرتاح من PHP5 إلى PHP7. أنا أتغير من
string mysql_real_escape_string(string $unescaped, [resource $link = NULL])
ل:
string mysqli_real_escape_string(mysqli $link, string $escapestr)
لذلك ، بمعنى آخر ، لم يعد ارتباط قاعدة البيانات $ اختياريًا وينتقل إلى موضع الوسيطة الأول. إذا تم تركها ، فإنها تُرجع سلسلة فارغة ، دون خطأ ، على ما يبدو.
قم بعمل var_dump من $ _post ['likemsg'] ، و far_dump من $ likemsg. هذا يمنحك معلومات حول ما يحدث.
سيعود mysql_real_escape_string () استجابة فارغة إذا لم تكن قد قمت بالاتصال بقاعدة البيانات ...