10

مشكلة في صفحة تسجيل الدخول بالكوكيز فقط

khaledhtml

السلام عليكم. تحية طيبة للجميع.

لدي مشكلة في صفحة تسجيل الدخول بالكوكيز فقط.

حيث عندما ادخل بالاسم و كلمة السر ادخل للصفحة عادي

واذا افتحت نفس الصفحة في نافذة اخرى نفس المتصفح وبدون اغلاق الصفحة الاولى

اضطر للدخول بالاسم و كلمة السر مرة اخرى .

وانا اريد ان تبقى الصفحة مفتوحة على الاقل نصف ساعة.

اريد الحل يكون بالكوكيز فقط

بدون قاعدة البيانات او السيشن

الكود الصفحة في الرابط اسفله:

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

يحدث هذا الأمر لأنك لا تتأكد من وجود الكوكيز، حيث يجب أن يحتوي الكود على آلية للتحقق من وجود الكوكيز في حالة لم يكن الطلب من نوع POST كالتالي:

<?php
error_reporting(0);
$user = "admin";
$pass = "admin";

$_COOKIE['username'] = $user;

if (isset($_POST['login'])) {
    if ($_POST['username'] == $user && $_POST['password'] == $pass) {
        setcookie('login', $user, time() + 60); //60 = 1 minute
        echo 'HTML PAGE HERE ... You are logged in!';
    } else {
        echo "invalid password";
    }
} elseif (isset($_COOKIE['login']) && $_COOKIE['login'] == $user) {
    echo 'HTML PAGE HERE ... You are logged in!';
} else {
    echo 'Please login first';
}

لاحظ وجود جملة if else للتأكد من وجود الكوكيز وأن قيمتها تساوي قيمة المتغير user.

الأمر الآخر هو أن الدالة time تقوم بإرجاع الوقت في شكل unix timestamp أي عدد من الثواني، وبالتالي في الكود الخاص بك يتم إضافة كوكيز لمدة دقيقة واحدة فقط وليس نصف ساعة، يمكنك أن تقوم بإضافة الكوكيز لمدة نصف ساعة من خلال إضافة 1800 ثانية (60 * 30)، كالتالي:

setcookie('login', $user, time() + (60 * 30));

تم اصلاح المشكل بفضلك اخي اشرف

ولكن هل تسطيع ان تعدل على الكود الذي سيظهر بعد تسجيل الدخول للصفحة

بوضعه مرة واحدة ققط وليس مرتين كما فعلت انت هنا.؟

setcookie('login', $user, time() + 60); //60 = 1 minute
        echo 'HTML PAGE HERE ... You are logged in!';

وهنا :

elseif (isset($_COOKIE['login']) && $_COOKIE['login'] == $user) {
    echo 'HTML PAGE HERE ... You are logged in!';

لان كود html الذي اضعه انا في صفحتي كبير جدا و من الصعب وضعه مرتين في الصفحة.

بالنسبة لدالة الوقت لدقيقة واحدة فقط وليس نصف ساعة, وضعته من اجل التجربة الكود بسر عة.

و شكرا على المساعدة...

بالتأكيد يمكنك أن تستخدم صيغة Heredoc في PHP والتي تسمح لك بإستخدام مجموعة من الأسطر كنص، على النحو التالي:

$html_content = <<<HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    Hi {$user}
</body>
</html>
HTML;

لاحظ صيغة Heredoc تبدأ بعلامة >>> ثم اسم من إختيارك (يمكنك أن تستعمل أي كلمة ولكن يجب أن تستعمل نفس الكلمة في نهاية النص) على سبيل المثال إستخدمت أنا كلمة HTML بأحرف كبيرة للتعبير عن بداية ونهاية النص، وخزنت كل هذا النص في متغير باسم $html_content، الآن يمكنك أن تقوم بطباعة هذا المتغير بدلًا من جملة You are logged in ، كالتالي:

if (isset($_POST['login'])) {
    if ($_POST['username'] == $user && $_POST['password'] == $pass) {
        setcookie('login', $user, time() + 60); //60 = 1 minute
        echo $html_content;
    } else {
        echo "invalid password";
    }
} elseif (isset($_COOKIE['login']) && $_COOKIE['login'] == 'admin') {
    echo $html_content;
} else {
    echo 'Please login first';
}

صيغة Heredoc توفر عليك عناء إستخدام علامة إقتباس فردية أو مزدوجة حول النص، وبالتالي يمكنك إستخدام كلاهما بداخل النص بدون مشكلة.

ملاحظة: يمكنك أن تستعمل المتغيرات بداخل صيغة Heredoc بدون مشكلة أيضًا.

تستطيع أن تقرأ أكثر حول صيغة Heredocs وكذلك صيغة Nowdoc من خلال موسوعة حسوب من هنا:

@Elalfi_Web

بارك الله فيك اخي اشرف على المساعدة و الرد على اسئلتي.

بالنسبة لصيغة heredoc اول مرة اسمع بها واضافة جديدة لمعلوماتي بلغة php .

وانا وجدت حل اخر من خلال دالة:

header refrech او header location

وبالتوفيق لك باذن الله.