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

ما هو سبب المشكلة Trying to access array offset on value of type bool in بلغة PHP

Ahmed Alhamdany

السؤال

Recommended Posts

  • 0

يبدو أن سبب المشكلة هي أن متغير $row ليس مصفوفة Array لكن قيمته bool أي إما True أو False.

غالبًا ستكون قيمة $row هي False، لذالك لا تستطيع أخد الخاصية username_users من المتغير.

يمكنك كتابة الكود التالي لحل المشكلة:

if( is_array($row) && ($user ==  $row['username_users'])){
	echo "hello";
}

في هذه الشيفرة قمنا بالتأكد من أن متغير $row هو عبارة عن مصفوفة، قبل التحقق من تواجد الخاصية username_users ومقارنة قيمتها مع  $user.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 49 دقائق مضت قال Ahmed Alhamdany:

تم ارفاق ملف الكود 

صراحة لم أفهم الفكرة التي تشتغل عليها، فهمت الجزء الأول منها لكني لم أفهم الشرط الثاني.

if ($count > 0) {
	// تقوم بتسجيل البيانات ثم تقوم بالإنتقال لإحدى الصفحات على حسب نوع المستخدم
} else {
	// هذا المستخدم غير موجود أي لا نستطيع أخد قيمة خاصية
	// username_users منه
	// يعني يجب عرض رسالة الخطأ مباشرة
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 31 دقائق مضت قال Ahmed Alhamdany:

المقصود هنا اذا البيانات القادمة من البوست لا تطابق البيانات الموجوده في قاعدة البيانات سوف ننفذ شرط بعد else

أنت في البداية، ذهبت لقاعدة البيانات وقمت بطلب المستخدم الذي لديه إسم مستخدم وكلمة سر معينة.

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

لن نحتاج لإعادة إختبار هل المعلومات مطابقة أو لا، لأنها خاطئة بالفعل، ولا يوجد أي مستخدم بهذه المعلومات.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

شكرا الك اخي على الشرح 

لكن الصراحة لم افهم ما هو قصدك 

اني بعثت لحضرتك الملف السابق 

المطلوب اذا اليوزر صحيح والباسوورد خطا نضهر رساله خطا 

واذا اليوزر والباسوورد خطا نضهر رساله خطا اخرى

وهكذا ؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ الآن قال Ahmed Alhamdany:

المطلوب اذا اليوزر صحيح والباسوورد خطا نضهر رساله خطا، واذا اليوزر والباسوورد خطا نضهر رساله خطا اخرى

لو ممكن تقوم بإرفاق ملف int.php.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال محمد ربيع زليول:

لو ممكن تقوم بإرفاق ملف int.php.

ليس له علاقه بالخلل int.php 

يحتوي على الهيدر وباقي تفاصيل التصميم 

الخلل واضح ستاذ في السطر الذي تم اشارته اليه سابقا

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال Ahmed Alhamdany:

ليس له علاقه بالخلل int.php 

أعلم، أريد فقط سطر الكود، الذي تقوم به بإدخال معلومات الإتصال بقاعدة البيانات ( إسم المستخدم، كلمة السر، إسم قاعدة البيانات، ..)

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 5 ساعات قال محمد ربيع زليول:

أعلم، أريد فقط سطر الكود، الذي تقوم به بإدخال معلومات الإتصال بقاعدة البيانات ( إسم المستخدم، كلمة السر، إسم قاعدة البيانات، ..)

<?php

// يمكن استخدام الاوامر ادناه لجميع السكربتات التي تطلب اتصال بقاعدة بيانات

$dsn = 'mysql:host=localhost;dbname=tours'; // اسم السيرفر + اسم القاعدة

$user = 'root'; // يوزر القاعدة

$pass = ''; // الباسوورد

$option = array (

PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8', // لجعل الجميع بهذا الاسم يقره عربي

);



try { // الاتصال بالقاعدة 

    $con = new PDO($dsn ,$user,$pass,$option);

    $con->setAttribute(PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION);

}



catch(PDOException $e){ // في حالة لم يتصل 

    echo "failed connect" . $e->getMessage();

}

?>

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 ساعات قال Ahmed Alhamdany:

هل يوجد رد من اصحاب الاختصاص ؟؟؟

في البداية نقوم بالإتصال بقاعدة البيانات، ونبحث عن مستخدم يمتلك إسم مستخدم وكلمة سر مطابقة لما قمنا بإدخالها في فورم تسجيل الدخول.

يقوم الكود التالي:

$stmt = $con -> prepare("SELECT  * from users WHERE username_users = ? AND password_users = ? limit 1");
$stmt->execute(array($user,$hashpass));
$row = $stmt->fetch();
$count = $stmt->rowcount();
  • بإعادة القيمة 1 في حالة كان هناك مستخدم يمتلك معلومات مطابقة للمعلومات المدخلة في الفورم.
  • بإعادة القيمة صفر 0 في حالة لم يكن هناك أي مستخدم يمتلك معلومات مطابقة للمعلومات المدخلة في الفورم.

الجزء الأول من الكود صحيح، أي الجزء الموجود داخل الشفرة التالية:

if ($count > 0){
 // باقي محتوى الكود
}

أما الجزء الثاني، فيجب تعويضه بهذا:

} else {
	echo "error in password";
}

لأنه في حالة لم يكن أي مستخدم يمتلك تلك المعلومات، ستكون قيمة $row مساوية للقيمة False، إذن لا يمكننا الحصول على إسم المستخدم من مستخدم غير موجود.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 35 دقائق مضت قال محمد ربيع زليول:

في البداية نقوم بالإتصال بقاعدة البيانات، ونبحث عن مستخدم يمتلك إسم مستخدم وكلمة سر مطابقة لما قمنا بإدخالها في فورم تسجيل الدخول.

يقوم الكود التالي:


$stmt = $con -> prepare("SELECT  * from users WHERE username_users = ? AND password_users = ? limit 1");
$stmt->execute(array($user,$hashpass));
$row = $stmt->fetch();
$count = $stmt->rowcount();
  • بإعادة القيمة 1 في حالة كان هناك مستخدم يمتلك معلومات مطابقة للمعلومات المدخلة في الفورم.
  • بإعادة القيمة صفر 0 في حالة لم يكن هناك أي مستخدم يمتلك معلومات مطابقة للمعلومات المدخلة في الفورم.

الجزء الأول من الكود صحيح، أي الجزء الموجود داخل الشفرة التالية:


if ($count > 0){
 // باقي محتوى الكود
}

أما الجزء الثاني، فيجب تعويضه بهذا:


} else {
	echo "error in password";
}

لأنه في حالة لم يكن أي مستخدم يمتلك تلك المعلومات، ستكون قيمة $row مساوية للقيمة False، إذن لا يمكننا الحصول على إسم المستخدم من مستخدم غير موجود.

شكرا اخي على الاجابة 

في حالة أدخل المستخدم يوزر صحيح والباسوورد خطا كيف يتم كتابة الكود ؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ الآن قال Ahmed Alhamdany:

في حالة أدخل المستخدم يوزر صحيح والباسوورد خطا كيف يتم كتابة الكود ؟

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

  • أولًا تقوم بالبحث عن مستخدم في قاعدة البيانات عن مستخدم لديه الإسم المدخل في فورم تسجيل الدخول هكذا مثلًا:
$stmt = $con->prepare("SELECT  * from users WHERE username_users = ? limit 1"); // قمت بالبحث بإسم المستخدم فقط
$stmt->execute(array($user)); // قمت بالبحث بإسم المستخدم فقط
$row = $stmt->fetch();
$count = $stmt->rowcount();

الكود التالي يرجع القيمة 1 إذا كان هناك مستخدم بهذا الإسم والقيمة 0 إذا لم يكون هناك إي مستخدم بهذا الإسم.

إذن في حالة كانت القيمة 0 سنقوم بعرض رسالة الخطأ:

if ($count == 0 ) {
	echo "Username is wrong";
} else {

	// باقي الكود

}

وفي حالة كانت قيمة count تساوي 1، سنقوم بالتحقق من أن كلمة السر التي أدخلها المستخدم مطابقة لكلمة السر في قاعدة البيانات،

  • في حالة لم تكن مطابقة سنعرض رسالة خطأ
  • في حالة كنت متطابقة نقوم بالإنتقال لصفحة admin.php أو index.php
if ($count == 0 ) {
	echo "Username is wrong";
} else {

	if($hashpass != $row['password_users']) {
		echo "Password is wrong"; // نقوم بعرض رسالة الباسورد خاطئ
	} else {
		// نقوم بتسجيل الدخول والإنتقال للصفحات

      $_SESSION['username'] = $user ; 
      $_SESSION['id'] = $row['id_users'];
      $_SESSION['types'] = $row['types_users'];

      if($_SESSION['types'] == 2 || $_SESSION['types'] == 3){
      	header('location: index.php');
      }
      if($_SESSION['types'] == 0 || $_SESSION['types'] == 1){
      	header('location: admin.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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...