البرمجة

تحسين أمان وأداء استعلامات قواعد البيانات في PHP.

في الكود الذي قدمته، يظهر تحذيرٌ متعلق بدالة mysql_fetch_assoc() في السطر 2. هذا التحذير يُشير إلى أن المتغير الذي تم تمريره كمعامل لهذه الدالة ليس من النوع المتوقع، حيث يتوقع أن يكون نوع المعامل الأول مصدر نتائج الاستعلام (resource)، لكن يتم تمرير نوع البيانات “boolean” بدلاً من ذلك.

تحديداً، السطر الذي يحتوي على المشكلة هو:

php
$row = mysql_fetch_assoc($query2); //this is the line that warns

لحل هذه المشكلة، يُفضل التحقق أولاً من نجاح تنفيذ الاستعلام باستخدام دالة mysql_query() ومن ثم التأكد من أن النتيجة التي تم استرجاعها هي نوع “resource” وليس “boolean”. يمكنك استخدام دالة mysql_num_rows() للتحقق من وجود نتائج قبل استخدام mysql_fetch_assoc().

فيما يلي نموذج لكيفية تحسين الكود لتجنب هذا التحذير:

php
$query2 = mysql_query("SELECT * FROM `order` WHERE `reservation_id` = '$reservation_id' "); // Check if the query was successful if ($query2) { // Check if there are any results if (mysql_num_rows($query2) > 0) { $row = mysql_fetch_assoc($query2); echo $row['order_id']; } else { echo "No results found."; } } else { echo "Error in the query: " . mysql_error(); }

هذا التحسين يتيح للكود التحقق من صحة التنفيذ ووجود النتائج قبل محاولة استخدام mysql_fetch_assoc()، مما يقلل من فرص ظهور هذا التحذير.

المزيد من المعلومات

بالتأكيد، دعوني أضيف المزيد من المعلومات لفهم أفضل حول المشكلة المطروحة.

في الشيفرة التي قدمتها، يتم استخدام دالة mysql_query() لتنفيذ استعلام SQL واسترجاع نتائجه في متغير $query2. هنا يكمن المشكلة، حيث يُفضل استخدام دوال mysqli أو PDO بدلاً من دوال mysql التي أصبحت قديمة ومهملة في إصدارات PHP الحديثة.

لتصحيح الكود وجعله متوافقًا مع التحديثات الأخيرة، يُفضل استخدام دوال mysqli. فيما يلي نسخة محدثة من الكود:

php
// استخدام دالة mysqli_connect() للاتصال بقاعدة البيانات $mysqli = new mysqli("اسم_الخادم", "اسم_المستخدم", "كلمة_المرور", "اسم_قاعدة_البيانات"); // التحقق من نجاح الاتصال if ($mysqli->connect_error) { die("فشل الاتصال: " . $mysqli->connect_error); } $reservation_id = mysqli_real_escape_string($mysqli, $reservation_id); $query2 = $mysqli->query("SELECT * FROM `order` WHERE `reservation_id` = '$reservation_id' "); // التحقق من نجاح الاستعلام if ($query2) { // التحقق من وجود نتائج if ($query2->num_rows > 0) { $row = $query2->fetch_assoc(); echo $row['order_id']; } else { echo "لم يتم العثور على نتائج."; } } else { echo "خطأ في الاستعلام: " . $mysqli->error; } // إغلاق الاتصال بقاعدة البيانات $mysqli->close();

يتم في هذا الكود استخدام دوال mysqli لتنفيذ الاستعلام والتحقق من الاتصال بقاعدة البيانات. كما تم استخدام دالة mysqli_real_escape_string() لتفادي هجمات حقن ال SQL. يتم أيضًا إغلاق الاتصال بقاعدة البيانات في النهاية باستخدام $mysqli->close() لتحسين أداء التطبيق وتجنب استنزاف الموارد.

زر الذهاب إلى الأعلى