Seyid Ahmed Khessam نشر 17 سبتمبر 2021 أرسل تقرير نشر 17 سبتمبر 2021 لدي مشكل في استدعاء قيمة من قاعدة البيانات المشكل بتحديد في foreach مع انها لاترجع نوع الخطا try { $conn = new PDO("mysql:host=$serName;dbname=$dabName", $usrName, $usrPass); $stnt = $conn-> prepare("SELECT emailw FROM data"); $stnt-> execute(); $stnt-> setFetchMode(PDO::FETCH_ASSOC); foreach ($stnt as $val) { if ($val["emailw"] != $this - > mail) { return $val["emailw"]; $conn-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // send data to database .. $stmt = $conn-> prepare("INSERT INTO data (namew, emailw, passwordw, datew) VALUES (:name, :mail, :pass, :date)"); $stmt->bindParam(':name', $namep); $stmt->bindParam(':mail', $mailp); $stmt-> bindParam(':pass', $passp); $stmt-> bindParam(':date', $datep); $namep = $this-> name; $mailp = $this-> mail; $passp = $this-> pass; $datep = $this-> date; $stmt - > execute(); return "Successfully connected .."; break; } else { return 'this email has created ..'; } } $conn = null; } catch (PDOException $e) { return 'false connect ..' . $e->getMessage(); } 2 اقتباس
1 Adnane Kadri نشر 17 سبتمبر 2021 أرسل تقرير نشر 17 سبتمبر 2021 بتاريخ منذ ساعة مضت قال Seyid Ahmed Khessam: يا اخي قاعدة البيانات فارغة قمت بحدف القيم المحفوظه فيها وكانت تشتغل بشكل طبيعي لكن لما اضفت foreach من اجل استدعاء قيمة البريد الالكتروني لمعرفة اذا ماكان مسجلا من قبل ام لا لم تشتغل foreach دون ارجاع اي خطا ولو ازلت foreach يرجع الكود سليم ويمكنني تطبيق الاستعلامات على قاعدة البيانات بشكل عادي اذا اردت هذا هو الكود كاملا regester.php المشكلة الوحيدة لديك هي أن قاعدة البيانات التي تحاول القراءة من عليها فارغة , فمن المنطقي أن لا يتم الإنطلاق في الدور foreach و القراءة من عليه . أي أن أي شيفرة بداخل الدور كالتالي : foreach($stnt as $val) { echo 'يوجد بيانات في قاعدة البيانات'; سيتم تجاهلها في حالة ما كان المعاد من تنفيذ الإستعلام stnt مصفوفة فارغة . في حين أن نفس الشيفرة سيتم تنفيذها في حالة كان المعاد من تنفيذ الإستعلام مصفوفة بعناصر يمكن القراءة من عليها عن طريق الدور . و لذلك تأكد من أن الجدول data الذي تحاول القراءة من عليه يمتلك على الأقل قيمة أو أكثر افتراضيا حتى يكون ما داخل الدور foreach قابلا للوصول . و لكن أفهم أن الفكرة التي تحاول تطبيقها هي : اقتباس التحقق من أنه لا يوجد أي مستخدم ببيانات مشابهة مسجل بالفعل . يكون هذا كشرط أساسي للتسجيل بدرجة أولى . و لتحقيق هذا تحاول جلب كامل بيانات الأعضاء المسجلين . عن طريق الدور foreach تحاول التحقق ما ان كانت بيانات هذا المستخدم مطابقة لبيانات العضو المسجل . فإن كان نعم : تم تجاهل طلبه و تكملة الدور . و إن كان لا : تسجيل هذا المستخدم و كسر الدور . و لكن ما هو عيب هاته الطريقة ؟ => هو أنه لن يتم تسجيل أي عضو في حالة ما لم يتم تسجيل على الأقل عضو أو أكثر يدويا من قبل , فهذه هي الطريقة الوحيدة للوصول إلى ما داخل الدور . و لتجاوز هاته المشكلة سنقوم بتطبيق المنطق التالي : يتم قبول أي عضو تلقائيا ما ان لم تكن بياناته مطابقة لعضو اخر مسجل بالفعل . و ذلك عوضا عن : التحقق من أن كامل الأعضاء لا يطابقون بيانات هذا العضو كشرط لتسجيله , بحيث يقوم هذا بإغفال احتمال فراغ قاعدة البيانات . لنقم بالتالي : تعريف متغير isAlreadyRegistered كمتغير يحمل قيمة false افتراضيا . يتم تغيير قيمة isAlreadyRegistered إلى true في حالة مطابقة بيانات أحد الأعضاء المسجلين لبيانات العضو الذي يحاول التسجيل . يتم في مرحلة أخيرة التحقق من قيمة isAlreadyRegistered و التصرف بناء عليها . فإن كانت isAlreadyRegistered تحمل القيمة false تم تسجيل العضو و إلا فلن يمكن ذلك و ستظهر رسالة الخطأ . ستتبع الشيفرة نحوا مشابها : $isAlreadyRegistered = false; foreach($stnt as $val) { if ($val["emailw"] == $this-> mail) { // لاحظ شرط التطابق $isAlreadyRegistered = true; // إعادة تعيين قيمة المتغير break; } } if (!$isAlreadyRegistered) { // return $val["emailw"]; $conn-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // send data to database .. $stmt = $conn - > prepare("INSERT INTO data (namew, emailw, passwordw, datew) VALUES (:name, :mail, :pass, :date)"); $stmt-> bindParam(':name', $namep); $stmt-> bindParam(':mail', $mailp); $stmt-> bindParam(':pass', $passp); $stmt-> bindParam(':date', $datep); $namep = $this-> name; $mailp = $this-> mail; $passp = $this-> pass; $datep = $this-> date; $stmt-> execute(); return "Successfully connected .."; } else { return 'this email has created ..'; } ثم سيمكنك إنشاء أعضاء في كامل الحالات و وفقا لأي احتمالات . ملاحظة : الشيفرة لديك قد تحتاج بعض التنظيم و التنظيف حتى تصبح مفهومة و سهلة التشخيص و القراءة , و قد كان ذلك ضروريا حتى أستطيع التوغل في شيفرتك و أفهم مرادك منها . يمكنك التحصل على نسخة أكثر تنظيما و تنسيقا لملفك هنا : index.php . 1 اقتباس
0 شرف الدين حفني نشر 17 سبتمبر 2021 أرسل تقرير نشر 17 سبتمبر 2021 هل من الممكن أن تقوم بعمل export لقاعدة البيانات حتى أستطيع تجربتها عندي وتحديد الخطأ؟ 1 اقتباس
0 Seyid Ahmed Khessam نشر 17 سبتمبر 2021 الكاتب أرسل تقرير نشر 17 سبتمبر 2021 تفضل اخي regester.sql 1 اقتباس
0 شرف الدين حفني نشر 17 سبتمبر 2021 أرسل تقرير نشر 17 سبتمبر 2021 بتاريخ 14 دقائق مضت قال Seyid Ahmed Khessam: تفضل اخي regester.sql برجاء عملexport لقاعدة البيانات بالبيانات التي بداخلها + ما المشكلة التي تحدث تحديداً؟ هل تقوم قاعدة البيانات بإرسال مصفوفة فارغة بدلاً من إرسال البيانات أم ماذا تحديداً؟ 1 اقتباس
0 Seyid Ahmed Khessam نشر 17 سبتمبر 2021 الكاتب أرسل تقرير نشر 17 سبتمبر 2021 يا اخي قاعدة البيانات فارغة قمت بحدف القيم المحفوظه فيها وكانت تشتغل بشكل طبيعي لكن لما اضفت foreach من اجل استدعاء قيمة البريد الالكتروني لمعرفة اذا ماكان مسجلا من قبل ام لا لم تشتغل foreach دون ارجاع اي خطا ولو ازلت foreach يرجع الكود سليم ويمكنني تطبيق الاستعلامات على قاعدة البيانات بشكل عادي اذا اردت هذا هو الكود كاملا regester.php 1 اقتباس
0 شرف الدين حفني نشر 17 سبتمبر 2021 أرسل تقرير نشر 17 سبتمبر 2021 بتاريخ 2 ساعات قال Seyid Ahmed Khessam: يا اخي قاعدة البيانات فارغة قمت بحدف القيم المحفوظه فيها وكانت تشتغل بشكل طبيعي لكن لما اضفت foreach من اجل استدعاء قيمة البريد الالكتروني لمعرفة اذا ماكان مسجلا من قبل ام لا لم تشتغل foreach دون ارجاع اي خطا ولو ازلت foreach يرجع الكود سليم ويمكنني تطبيق الاستعلامات على قاعدة البيانات بشكل عادي اذا اردت هذا هو الكود كاملا regester.php أخي الكود الذي أرسلته لا يوجد به صفحات حتى أستطيع إختباره, هل يمكنك أن تحدد لي كيف أقوم بإختبار الكود حتى أستطيع مساعدتك؟ 1 اقتباس
0 Seyid Ahmed Khessam نشر 17 سبتمبر 2021 الكاتب أرسل تقرير نشر 17 سبتمبر 2021 بتاريخ 1 ساعة قال Adnane Kadri: المشكلة الوحيدة لديك هي أن قاعدة البيانات التي تحاول القراءة من عليها فارغة , فمن المنطقي أن لا يتم الإنطلاق في الدور foreach و القراءة من عليه . أي أن أي شيفرة بداخل الدور كالتالي : foreach($stnt as $val) { echo 'يوجد بيانات في قاعدة البيانات'; سيتم تجاهلها في حالة ما كان المعاد من تنفيذ الإستعلام stnt مصفوفة فارغة . في حين أن نفس الشيفرة سيتم تنفيذها في حالة كان المعاد من تنفيذ الإستعلام مصفوفة بعناصر يمكن القراءة من عليها عن طريق الدور . و لذلك تأكد من أن الجدول data الذي تحاول القراءة من عليه يمتلك على الأقل قيمة أو أكثر افتراضيا حتى يكون ما داخل الدور foreach قابلا للوصول . و لكن أفهم أن الفكرة التي تحاول تطبيقها هي : و لكن ما هو عيب هاته الطريقة ؟ => هو أنه لن يتم تسجيل أي عضو في حالة ما لم يتم تسجيل على الأقل عضو أو أكثر يدويا من قبل , فهذه هي الطريقة الوحيدة للوصول إلى ما داخل الدور . و لتجاوز هاته المشكلة سنقوم بتطبيق المنطق التالي : يتم قبول أي عضو تلقائيا ما ان لم تكن بياناته مطابقة لعضو اخر مسجل بالفعل . و ذلك عوضا عن : التحقق من أن كامل الأعضاء لا يطابقون بيانات هذا العضو كشرط لتسجيله , بحيث يقوم هذا بإغفال احتمال فراغ قاعدة البيانات . لنقم بالتالي : تعريف متغير isAlreadyRegistered كمتغير يحمل قيمة false افتراضيا . يتم تغيير قيمة isAlreadyRegistered إلى true في حالة مطابقة بيانات أحد الأعضاء المسجلين لبيانات العضو الذي يحاول التسجيل . يتم في مرحلة أخيرة التحقق من قيمة isAlreadyRegistered و التصرف بناء عليها . فإن كانت isAlreadyRegistered تحمل القيمة false تم تسجيل العضو و إلا فلن يمكن ذلك و ستظهر رسالة الخطأ . ستتبع الشيفرة نحوا مشابها : $isAlreadyRegistered = false; foreach($stnt as $val) { if ($val["emailw"] == $this-> mail) { // لاحظ شرط التطابق $isAlreadyRegistered = true; // إعادة تعيين قيمة المتغير break; } } if (!$isAlreadyRegistered) { // return $val["emailw"]; $conn-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // send data to database .. $stmt = $conn - > prepare("INSERT INTO data (namew, emailw, passwordw, datew) VALUES (:name, :mail, :pass, :date)"); $stmt-> bindParam(':name', $namep); $stmt-> bindParam(':mail', $mailp); $stmt-> bindParam(':pass', $passp); $stmt-> bindParam(':date', $datep); $namep = $this-> name; $mailp = $this-> mail; $passp = $this-> pass; $datep = $this-> date; $stmt-> execute(); return "Successfully connected .."; } else { return 'this email has created ..'; } ثم سيمكنك إنشاء أعضاء في كامل الحالات و وفقا لأي احتمالات . ملاحظة : الشيفرة لديك قد تحتاج بعض التنظيم و التنظيف حتى تصبح مفهومة و سهلة التشخيص و القراءة , و قد كان ذلك ضروريا حتى أستطيع التوغل في شيفرتك و أفهم مرادك منها . يمكنك التحصل على نسخة أكثر تنظيما و تنسيقا لملفك هنا : index.php . يا اخي وفيت وكفيت والفكرة وصلت ونفس فكرتك جاءت ببالي لذالك اعطيت للتحقق =! ومع دلك لم تنجح وطريقتك هي الاصح والاكثر منطقية بارك الله فيك اخي ♥♥ 1 اقتباس
السؤال
Seyid Ahmed Khessam
لدي مشكل في استدعاء قيمة من قاعدة البيانات المشكل بتحديد في foreach مع انها لاترجع نوع الخطا
7 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.