البرمجة

حل مشاكل Fatal Error في PHP: دليل تصحيح أخطاء mysqli_execute

فيما يبدو، تقوم بتطوير نظام مكتبة باستخدام لغة البرمجة PHP وقاعدة بيانات MySQL. واستنادًا إلى الأخطاء التي تظهر لديك، يبدو أن هناك مشكلة في تنفيذ استعلام الإدخال إلى قاعدة البيانات. دعنا نقوم بفحص الكود والتعرف على المشكلات المحتملة.

أولًا، يُلاحظ أن لديك خطأ في كتابة اسم المتغير عند استخدام الدالة mysqli_connect. يجب أن يكون الاسم الصحيح هو $connection بدلاً من $mysli_link، لذا يجب تصحيح هذا الخطأ.

php
$stm = $connection->prepare("INSERT INTO users (username,password,first_name,middle_name,last_name,address,contact_no,email,activation_code) values(?,?,?,?,?,?,?,?,?)"); $stm->bind_param("sssssssss", $USERNAME, $PASSWORD, $FIRST_NAME, $MIDDLE_NAME, $LAST_NAME, $ADDRESS, $CONTACT_NO, $EMAIL, $ACTIVATION_CODE);

ثانيًا، يجب تصحيح ترتيب استخدام دالة bind_param. يجب أن يكون النمط (types) أولًا، وبعد ذلك يتبعها القيم. في هذا السياق، يجب تغيير خط الربط إلى الشكل التالي:

php
$stm->bind_param("sssssssss", $USERNAME, $PASSWORD, $FIRST_NAME, $MIDDLE_NAME, $LAST_NAME, $ADDRESS, $CONTACT_NO, $EMAIL, $ACTIVATION_CODE);

وتأكد من أن النمط (types) المستخدم يتناسب مع أنواع البيانات المتوقعة في الجدول.

ثالثًا، قم بنقل تحضير الاستعلام ($stm->prepare()) إلى داخل الشرط if(isset($_POST['register'])) حتى لا يتم تنفيذه إلا إذا تم تقديم النموذج.

php
if(isset($_POST['register'])){ $USERNAME = trim(mysqli_real_escape_string($connection,$_POST['username'])); // ... (التعريفات الأخرى) $ACTIVATION_CODE = md5($USERNAME.(rand(0,1000))); $stm = $connection->prepare("INSERT INTO users (username,password,first_name,middle_name,last_name,address,contact_no,email,activation_code) values(?,?,?,?,?,?,?,?,?)"); $stm->bind_param("sssssssss", $USERNAME, $PASSWORD, $FIRST_NAME, $MIDDLE_NAME, $LAST_NAME, $ADDRESS, $CONTACT_NO, $EMAIL, $ACTIVATION_CODE); $stm->execute(); }

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

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

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

أولًا، يُلاحظ أنك تقوم بفتح اتصال جديد بقاعدة البيانات باستخدام mysqli_connect وفي الوقت نفسه تستخدم المتغير $connection الذي تم فتحه بواسطة mysqli_connect. يُفضل استخدام نفس المتغير لتجنب اللبس وتحسين الأداء.

php
$connection = mysqli_connect('localhost', 'root', '', 'library_system') or die(mysqli_error());

ثانيًا، يُلاحظ أنك تقوم بتهيئة القيم المتعلقة بالمستخدم من خلال استخدام mysqli_real_escape_string، ولكن يُفضل أيضًا استخدام استعلام محضر (Prepared Statements) لتحسين أمان البرنامج وتفادي هجمات حقن الشيفرة.

ثالثًا، يجب عليك التحقق من نجاح عملية التحضير والربط قبل تنفيذ الاستعلام. يمكنك فعل ذلك بفحص قيمة $stm:

php
$stm = $connection->prepare("INSERT INTO users (username,password,first_name,middle_name,last_name,address,contact_no,email,activation_code) values(?,?,?,?,?,?,?,?,?)"); if ($stm === false) { die('Error in preparing statement: ' . $connection->error); } $success = $stm->bind_param("sssssssss", $USERNAME, $PASSWORD, $FIRST_NAME, $MIDDLE_NAME, $LAST_NAME, $ADDRESS, $CONTACT_NO, $EMAIL, $ACTIVATION_CODE); if ($success === false) { die('Error in binding parameters: ' . $stm->error); } if (isset($_POST['register'])) { // ... (التعريفات الأخرى) $ACTIVATION_CODE = md5($USERNAME . (rand(0, 1000))); $success = $stm->execute(); if ($success === false) { die('Error in executing statement: ' . $stm->error); } }

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

أخيرًا، يُفضل أيضًا تقديم رسائل أخطاء ونصائح أكثر وضوحًا إلى المستخدمين، وذلك لتسهيل فهم المشاكل في حالة حدوث أخطاء.

مقالات ذات صلة

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

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر