۱۵ شعبان زاده
unset کردن SESSION
جامعه پی اچ پی ایجاد شده در ۰۶ اردیبهشت ۱۴۰۲

سلام . وقت بخیر

من قسمتی که در فایل register بعد از شرط if سشن را unset می‌کنم کلا پیغام خطا نشان داده نمی‌شود . اما استاد در دقیقه 14:40 فیلم آموزشی یکبار پیغام خطا را می‌گیرند و سپس سشن unset می‌شود . فایل پروژه ام را آپلود می‌کنم . خیلی ممنون اگر چک بفرمایید .

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Register Pagetitle>
    
    <link rel="stylesheet" type="text/css" href=" assets('css/styles.css'); ?>">
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet" />
    <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
    <link href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/4.2.0/mdb.min.css" rel="stylesheet" />
head>
<body>
    
    <section class="background-radial-gradient overflow-hidden">
        <div class="container px-4 py-5 px-md-5 text-center text-lg-start my-5">
            <div class="row gx-lg-5 align-items-center mb-5 justify-content-center">
                <div class="col-lg-6 mb-5 mb-lg-0" style="z-index: 10">
                    <h1 class="my-5 display-5 fw-bold ls-tight" style="color: hsl(218, 81%, 95%)">
                        7Learn Auth <br />
                        <span style="color: hsl(218, 81%, 75%)">Register Pagespan>
                    h1>
                     if(!empty($_SESSION['error'])) : ?>
                        <h3 class="text-danger">Fix This Error And Try Again:h3>
                        <h4 class="mb-4 opacity-70 text-danger">
                             $_SESSION['error'] ?>
                        h4>
                    
                        unset($_SESSION['error']); 
                    endif;  ?>
                div>
                <div class="col-lg-6 mb-5 mb-lg-0 position-relative">
                    <div id="radius-shape-1" class="position-absolute rounded-circle shadow-5-strong">div>
                    <div id="radius-shape-2" class="position-absolute shadow-5-strong">div>
                    <div class="card bg-glass">
                        <div class="card-body px-4 py-5 px-md-5">
                            <form action=" site_url('auth.php?action=register') ?>" method="post">
                                
                                <div class="form-outline mb-4">
                                    <input type="text" name="name" id="name" class="form-control" />
                                    <label class="form-label" for="name">Namelabel>
                                div>
                                
                                <div class="form-outline mb-4">
                                    <input type="text" name="phone" id="phone" class="form-control" />
                                    <label class="form-label" for="phone">Phonelabel>
                                div>
                                
                                <div class="form-outline mb-4">
                                    <input type="email" name="email" id="email" class="form-control" />
                                    <label class="form-label" for="email">Email addresslabel>
                                div>
                                
                                <div class="form-check d-flex justify-content-center mb-4">
                                    <input class="form-check-input me-2" type="checkbox" value="" id="remember-me" checked />
                                    <label class="form-check-label" for="remember-me">
                                        Remember Me
                                    label>
                                div>
                                
                                <button type="submit" class="btn btn-primary btn-block mb-4">
                                    Sign up
                                button>
                                <hr>
                                
                                <div class="row mt-4">
                                    <div class="col-6">
                                        <p class="text-start fs-5">If you sign up before:p>
                                    div>
                                    <div class="col-6  d-flex justify-content-end">
                                        <a href=" site_url('auth.php?action=login') ?>" class="btn btn-success btn-small mb-4">
                                            login
                                        a>
                                    div>
                                div>
                            form>
                        div>
                    div>
                div>
            div>
        div>
    section>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/4.2.0/mdb.min.js">script>
body>
html>

و فایل init:

session_start();
require 'constants.php';
require 'config.php';
require  BASE_PATH . 'libs/helpers.php';
// dsn= driver(mysql) host , dbname , charset
$dsn="mysql:host=$database_config->host;dbname=$database_config->dbname;charset=$database_config->charset";
try{
   $pdo = new PDO($dsn , $database_config->user , $database_config->password );
    
    
}catch(PDOException $e){
    diePage("Connection Failed : " . $e->getMessage());
}

من از php7.4 استفاده می‌کنم

درضمن هر چه سعی کردم فایل برنامه را آپلود کنم با اینکه 7کیلو بایت بیشتر نبود اما نشد .

من مجددا چک کردم . مشکل از خود فرم هست . زمانی که هر ۳ فیلد name & phone & email پر شده باشد ، اطلاعات وارد شده در فرم متغیر $_POST قرار گرفته و به صفحه auth.php ارسال می‌شود و اگر یکی از فیلد‌ها مثلا phone خالی باشد اطلاعات درون $_POST ریخته نمی‌شود و به صفحه auth.php ارسال نمی‌شود . در نتیجه وارد مرحله چک کردن و مقدار گرفتن SESSION نمی‌شود .

من در صفحه رجیستر یکی از فیلد‌ها را خالی گذاشتم و آن طرف در سمت سرور یعنی یعنی فایل auth.php متغیر $_POST را var_dump کردم و متوجه شدم که وقتی یکی از فیلد‌ها خالی باشد اطلاعات به سمت سرور ارسال نمی‌شود

سلام،

مشکل برطرف شده؟

اگر برطرف نشده فقط قسمت‌های مرتبط با موضوع رو کدهاشو بذارید و کدهای html رو هم نیازی نیست.

محسن موحد ۰۷ اردیبهشت ۱۴۰۲، ۱۱:۳۵

سلام . شب شما بخیر

نه هنوز برطرف نشده . باشه

     if(!empty($_SESSION['error'])) : ?>
                        <h3 class="text-danger">Fix This Error And Try Again:h3>
                        <h4 class="mb-4 opacity-70 text-danger">
                             $_SESSION['error'] ?>
                        h4>
                    
                        unset($_SESSION['error']); 
                    endif;  ?>                    
                        
                            
                        
                    



و کد‌های فایل auth.php که از فرم html ورودی‌های فرم رو دریافت می‌کنه . اگر موقع ثبت نام یکی از ورودی‌ها وارد نشه باید session پیغام

خطا بگیره و در صفحه اچ تی ام ال فقط یکبار نمایش داده بشه .

متد‌های موجود در فایل helper

function redirect(string $target = BASE_URL): void 
{
    header("Location: " . $target);
    // die();
}
//for addressing assets file in project
function assets(string $path): string {
    return site_url("/assets/" . $path);
}
function setErrorAndRedirect(string $message , string $target) : void{
     $_SESSION['error']= $message;
     redirect(site_url($target)); 
    
}

و فایل init


session_start();
require 'constants.php';
require 'config.php';
require  BASE_PATH . 'libs/helpers.php';
// dsn= driver(mysql) host , dbname , charset
$dsn="mysql:host=$database_config->host;dbname=$database_config->dbname;charset=$database_config->charset";
try{
   $pdo = new PDO($dsn , $database_config->user , $database_config->password );
    
    
}catch(PDOException $e){
    diePage("Connection Failed : " . $e->getMessage());
}



توضیحی که می‌تونم بدم اینه ما اطلاعات کاربر رو از طریق فرم رجیستر می‌گیریم و با متغیر گلوبال $_POST به صفحه auth.php ارسال می‌کنیم . حال اگر سه ورودی نام ،‌ایمیل و تلفن هر سه کامل وارد بشه اطلاعات ارسال میشه . اما اگر یکی از ورودی‌ها پر نشه اصلا هیچ اطلاعاتی درون متغیر گلوبال $_POST ریخته نشده و به صفحه auth.php ارسال نمی‌شود .

من چند بار سعی کردم پوشه پروژه ام رو آپلود کنم اما متاسفانه نمیشه .

شعبان زاده ۰۷ اردیبهشت ۱۴۰۲، ۱۹:۴۱

بازم نشد.

به این شکل بذارید تا بتونم ارتباط رو بفهمم:

مثلا کدهای صفحه auth.php:

// some codes

تابع setErrorAndRedirect کجا ازش استفاده شده، کدهای اون قسمت رو هم بذارید.

محسن موحد ۰۸ اردیبهشت ۱۴۰۲، ۱۶:۱۹

ببخشید جناب موحد . متاسفانه پلتفرم مشکل داره . من فایل‌ها را توی پلتفرم کپی می‌کنم اما ارسال نمیشه .چند بار سعی کردم . اگر پوشه پروژه رو بشه با تلگرام بفرستم برای شما بهتر هست .


شعبان زاده ۰۸ اردیبهشت ۱۴۰۲، ۱۷:۱۶

این بار چندم هست که هر که کد‌ها رو اینجا می‌گذارم و هیچی ارسال نمیشه . فکر کنم محدودیت کاراکتر گذاشتند.

دوباره طی چند پیام می‌فرستم :

فایل register-tpl

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Register Pagetitle>
    
    <link rel="stylesheet" type="text/css" href=" assets('css/styles.css'); ?>">
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet" />
    <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
    <link href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/4.2.0/mdb.min.css" rel="stylesheet" />
head>
<body>
    
    <section class="background-radial-gradient overflow-hidden">
        <div class="container px-4 py-5 px-md-5 text-center text-lg-start my-5">
            <div class="row gx-lg-5 align-items-center mb-5 justify-content-center">
                <div class="col-lg-6 mb-5 mb-lg-0" style="z-index: 10">
                    <h1 class="my-5 display-5 fw-bold ls-tight" style="color: hsl(218, 81%, 95%)">
                        7Learn Auth <br />
                        <span style="color: hsl(218, 81%, 75%)">Register Pagespan>
                    h1>
                     if(!empty($_SESSION['error'])) : ?>
                        <h3 class="text-danger">Fix This Error And Try Again:h3>
                        <h4 class="mb-4 opacity-70 text-danger">
                             $_SESSION['error'] ?>
                        h4>
                    
                        unset($_SESSION['error']); 
                    endif;  ?>
                div>
                <div class="col-lg-6 mb-5 mb-lg-0 position-relative">
                    <div id="radius-shape-1" class="position-absolute rounded-circle shadow-5-strong">div>
                    <div id="radius-shape-2" class="position-absolute shadow-5-strong">div>
                    <div class="card bg-glass">
                        <div class="card-body px-4 py-5 px-md-5">
                            <form action=" site_url('auth.php?action=register') ?>" method="post">
                                
                                <div class="form-outline mb-4">
                                    <input type="text" name="name" id="name"  class="form-control"/>
                                    <label class="form-label" for="name">Namelabel>
                                div>
                                
                                <div class="form-outline mb-4">
                                    <input type="text" name="phone" id="phone" class="form-control" />
                                    <label class="form-label" for="phone">Phonelabel>
                                div>
                                
                                <div class="form-outline mb-4">
                                    <input type="email" name="email" id="email" class="form-control" />
                                    <label class="form-label" for="email">Email addresslabel>
                                div>
                                
                                <div class="form-check d-flex justify-content-center mb-4">
                                    <input class="form-check-input me-2" type="checkbox" value="" id="remember-me" checked />
                                    <label class="form-check-label" for="remember-me">
                                        Remember Me
                                    label>
                                div>
                                
                                <button type="submit" class="btn btn-primary btn-block mb-4">
                                    Sign up
                                button>
                                <hr>
                                
                                <div class="row mt-4">
                                    <div class="col-6">
                                        <p class="text-start fs-5">If you sign up before:p>
                                    div>
                                    <div class="col-6  d-flex justify-content-end">
                                        <a href=" site_url('auth.php?action=login') ?>" class="btn btn-success btn-small mb-4">
                                            login
                                        a>
                                    div>
                                div>
                            form>
                        div>
                    div>
                div>
            div>
        div>
    section>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/4.2.0/mdb.min.js">script>
body>
html>

auth.php :

شعبان زاده ۰۸ اردیبهشت ۱۴۰۲، ۱۸:۲۴

auth-php:


require "bootstrap/init.php";
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $action =  $_GET['action'];
    $params = $_POST;
    var_dump($params);
    if($action == 'register') {
        // validate data
        if(empty($params['name']) || empty($params['email']) || empty($params['phone'])) {
           setErrorAndRedirect('All Input Fields Required' , 'auth.php?action=register');
          
        }
        if(!filter_var($params['email'] , FILTER_VALIDATE_EMAIL)){
            setErrorAndRedirect('Enter the Valid Email Address' , 'auth.php?action=register');
        }
    }
}
if(isset($_GET['action']) && $_GET['action'] == 'register'){
    
    include 'tpl/register-tpl.php';
    
    
}else{
    include 'tpl/login-tpl.php';
}

helpers:


defined('BASE_PATH') OR die("Permision Denied");
function isAjaxRequest(){
   
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
   return true;
       } 
      return false;
}
function site_url(string $uri = ''){
    return BASE_URL . $uri;
}
function diePage($msg){
    echo "
$msg
"
;     die(); } function message($msg , $cssClass = 'info'){     echo "
$msg
"
;     } function dd($var){     echo "
";
    var_dump($var);
    echo "
"
; } function validate_password($password) {     $pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$/';     return preg_match($pattern, $password); } function validate_username($username) {     $pattern = '/^[a-zA-Z0-9_-]{3,20}$/';     return preg_match($pattern, $username); } function validateLatLng($lat, $lng) {     $lat_pattern = '/^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$/';  //regex expression pattern for latitude     $lng_pattern = '/^[-+]?((1[0-7]|[1-9])?\\d(\\.\\d+)?|180(\\.0+)?)$/';  //regex expression pattern for longitude         if (preg_match($lat_pattern, $lat) && preg_match($lng_pattern, $lng)) {       return true;  // valid latitude and longitude     } else {       return false;  // invalid latitude or longitude     }   } function redirect(string $target = BASE_URL): void {     header("Location: " . $target);     // die(); } //for addressing assets file in project function assets(string $path): string {     return site_url("/assets/" . $path); } function setErrorAndRedirect(string $message , string $target) : void{      $_SESSION['error']= $message;      redirect(site_url($target));     }


شعبان زاده ۰۸ اردیبهشت ۱۴۰۲، ۱۸:۲۶

init:

host;dbname=$database_config->dbname;charset=$database_config->charset";
try{
   $pdo = new PDO($dsn , $database_config->user , $database_config->password );
    
    
}catch(PDOException $e){
    diePage("Connection Failed : " . $e->getMessage());
}

فقط یک موضوع رو من بگم :

ببینید فرم ثبت نام سه ورودی می‌گیره که عبارتند از نام ،‌ایمیل ، تلفن . اگر ما سه تا input رو وارد نکنیم اصلا فرم سمت سرور ارسال نمیشه . یعنی ورودی‌ها داخل متغیر گلوبال پست ریخته نمیشه . احتمالا با جاوا اسکریپت هندلش کردن . اما من نتونستم پیداش کنم . احتمالا تو cdnjs کدی وجود داره که اگر سه ورودی کامل نشد فرم سمت سرور ارسال نمیشه .


اما مشکل من :‌

استاد تو فیلم در دقیقه 14:35 سشن رو unset می‌کنن که پیغام خطایی که داخل سشن ریخته میشه فقط یکبار نشون داده بشه . من وقتی سشن رو unset کردم کلا هیچ پیغام خطایی داخل session- error ریخته نمیشه و پیغام خطا رو نمی‌گیرم بررسی کردم و متوجه شدم که اصلا وارد بلاک if نمیشه . همچنین وقتی یکی از input ‌های فرم خالی هست هیچ داده ای سمت سرور ارسال نمیشه که بعدش سشن ست بشه .

امیدوارم تونسته باشم منظورم رو برسونم .

خیلی ممنون

شعبان زاده ۰۸ اردیبهشت ۱۴۰۲، ۱۸:۴۵

سلام . روز شما بخیر

من پروژه را روی گیت هاب فرستادم . آدرسش رو می‌گذارم :

https://github.com/AliShabanzade/PrimaryPHP/tree/master/18-Projects/7auth

خیلی ممنون

شعبان زاده ۰۹ اردیبهشت ۱۴۰۲، ۱۱:۲۴

با توجه به کدهایی که گذاشتید توو پست دومتون من میبینم تابع ریدایرکت die() رو کامنت کردید و وقتی کدها به ریدایرکت میرسن بعد از ست شدن سشن، فایل register هم اجرا شده و داخل if وارد شده و سشن unset میشه و بعد عمل ریدایرکت هم انجام میشه.

die() رو از حالت کامنت خارج کنید تا بعد از ست شدن سشن، ادامه ی کدها اجرا نشه و همون لحظه ریدایرکت انجام بشه.

محسن موحد ۰۹ اردیبهشت ۱۴۰۲، ۱۳:۳۵

درست شد . خیلی ممنون . با توجه به توضیحاتی که شما دادید باید دقیق trace کنم تا کاملا متوجه بشم . باز هم ممنون .

شعبان زاده ۰۹ اردیبهشت ۱۴۰۲، ۱۵:۳۳

البته مشکل حل شد اما اگر ممکنه کمی توضیح بیشتر بدید ؟

من متغیر $params رو در فایل auth.php ازش var_dump گرفتم . وقتی ۲ تا از ورودی‌های فرم رجیستر رو پر می‌کنم و یکیش رو خالی می‌گذارم و کلید signUp رو می‌زنم هیج داده ای را سمت سرور داخل فایل auth.php نمی‌گیرم . گفتم متغیر params رو var_dump کردم . اما چیز داخلش نیست . بعد چطور تو فایل auth.php وارد شرط if میشه تا چک کنه که params نام یا شماره تلفن یا ایمیل خالی هست؟

شعبان زاده ۰۹ اردیبهشت ۱۴۰۲، ۱۵:۴۷

اگر میخواهید زمانیکه حداقل یک فیلد خالیه var_dump رو ببینید، بعد از var_dump دستور exit رو بنویسید چون وارد if میشود و صفحه بعد از ست شدن سشن، ریدایرکت میشود و شما چیزی در صفحه نمیبینید. صفحه ریدایرکت که بشه دیگه داخل if مربوط به post نمیشه و دیتای پستی هم وجود نداره.

محسن موحد ۰۹ اردیبهشت ۱۴۰۲، ۱۷:۱۲

سلام . روز شما بخیر .

من چند بار با نرم افزار php debug اسکریپت رو دیباگ کردم . نمی‌فهمم چرا وقتی به دستور var_dump در فایل auth.php می‌رسه

var_dump($params);

، با اینکه داخل متغیر params مقادیر POST ریخته شده و دارای مقدار هست ، اون رو تو مرورگر چاپ نمی‌کنه .


و همچنین وقتی یکی از ورودی‌های فرم رجیستر رو خالی می‌گذارم در زمانی که دیباگ می‌کنم می‌بینم که متغیر سشن مقدار داره و وارد حلقه if هم میشه :

 if(!empty($_SESSION['error'])) : ?>

، اما وقتی به دستور :

   $_SESSION['error'] ?>

می رسه باز مثل قبل مقدار SESSION[error] چاپ نمیشه و وقتی اسکریپت تمام می‌شود ، بعد پیغام All input fields Required روی صفحه مرورگر به رنگ قرمز چاپ میشه .

مگر اسکریپت خط به خط اجرا نمیشه . پس باید همون لحظه ای که به دستور var_dump در صفحه auth.php یا دستور echo $_SESSION[ERROR] در صفحه register می‌رسه مقادیرتو مرورگر چاپ بشه !!؟؟

شعبان زاده ۱۰ اردیبهشت ۱۴۰۲، ۰۸:۵۴

چون داخل ram قرار گرفته و بعد از پایان اسکریپت به سمت مرورگر response ارسال میشه.

شما در زمان debug از قسمت superglobal میتونید محتویات $_POST رو مشاهده کنید.

بهترین پاسخ
محسن موحد ۱۰ اردیبهشت ۱۴۰۲، ۲۰:۴۰

خیلی ممنون . لطف کردید .

شعبان زاده ۱۱ اردیبهشت ۱۴۰۲، ۱۳:۲۴