اذهب إلى المحتوى

السؤال

نشر

      لدي مشكل في استدعاء قيمة من قاعدة البيانات المشكل بتحديد في 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();

       
}

 

Recommended Posts

  • 1
نشر
بتاريخ منذ ساعة مضت قال 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 . 

  • 0
نشر
بتاريخ 14 دقائق مضت قال Seyid Ahmed Khessam:


 

تفضل اخي

regester.sql

برجاء عملexport لقاعدة البيانات بالبيانات التي بداخلها + ما المشكلة التي تحدث تحديداً؟ هل تقوم قاعدة البيانات بإرسال مصفوفة فارغة بدلاً من إرسال البيانات أم ماذا تحديداً؟

  • 0
نشر

يا اخي قاعدة البيانات فارغة قمت بحدف القيم المحفوظه فيها وكانت تشتغل بشكل طبيعي لكن  لما اضفت foreach من اجل استدعاء قيمة البريد الالكتروني لمعرفة اذا ماكان مسجلا من قبل ام لا لم تشتغل foreach دون ارجاع اي خطا ولو ازلت foreach يرجع الكود سليم ويمكنني تطبيق الاستعلامات على قاعدة البيانات بشكل عادي اذا اردت هذا هو الكود كاملا

regester.php

  • 0
نشر
بتاريخ 2 ساعات قال Seyid Ahmed Khessam:

يا اخي قاعدة البيانات فارغة قمت بحدف القيم المحفوظه فيها وكانت تشتغل بشكل طبيعي لكن  لما اضفت foreach من اجل استدعاء قيمة البريد الالكتروني لمعرفة اذا ماكان مسجلا من قبل ام لا لم تشتغل foreach دون ارجاع اي خطا ولو ازلت foreach يرجع الكود سليم ويمكنني تطبيق الاستعلامات على قاعدة البيانات بشكل عادي اذا اردت هذا هو الكود كاملا

regester.php

أخي الكود الذي أرسلته لا يوجد به صفحات حتى أستطيع إختباره, هل يمكنك أن تحدد لي كيف أقوم بإختبار الكود حتى أستطيع مساعدتك؟

  • 0
نشر
بتاريخ 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 . 

يا اخي وفيت وكفيت والفكرة وصلت ونفس فكرتك جاءت ببالي لذالك اعطيت للتحقق =! ومع دلك لم تنجح وطريقتك هي الاصح والاكثر منطقية بارك الله فيك اخي ♥♥

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...