آگهی
article

آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL

mysql-php-login-logout

در مطلب قبل از بخش آموزش کاربردی PHP و MySQL با نحوه برنامه نویسی سیستم ساده عضویت کاربران در سایت آشنا شدیم، فرم HTML جهت ورود اطلاعات کاربران را نیز با چند فیلد شامل نام کاربری و کلمه عبور جهت نمونه ساختیم و در سمت سرور با کدنویسی PHP داده ها را کنترل و در نهایت در دیتابیس ذخیره کردیم، اکنون در این آموزش می خواهیم کار را با ساخت فرم ورود و خروج تکمیل کنیم تا کاربران پس از ثبت نام در سایت بتوانند به محیط مدیریت وارد شده و از امکانات پنل کاربری شخصی خود استفاده کنند، در این مطلب خواهیم دید که مبحث مربوط به نشست ها (سشن یا Session) برای ایجاد فرم ورود و خروج تا چه میزان اهمیت دارد و با نحوه تنظیمات سفارشی مربوط به آن بیشتر آشنا خواهیم شد.

سشن (Session) یا نشست چیست و چه کاربردی دارد؟


قبل از اینکه به کدنویسی کار بپردازیم لازم است نگاهی داشته باشیم به اینکه چرا باید در فرم ورود و خروج از سشن (Session) یا نشست استفاده کنیم، اصلا این اصطلاح به چه معنی است و چه کاربردی دارد؟
برای درک صحیح مطلب اجازه دهید با یک مثال موضوع را مطرح کنیم، فرض کنیم می خواهیم وارد یک نمایشگاه بزرگ کتاب با غرفه های متعدد شویم و برای این کار از قبل در سیستم نمایشگاه اطلاعاتمان را وارد و ثبت نام کرده ایم، در قسمت ورودی نمایشگاه پس از ارائه مدارک شناسایی و در صورت انطباق صحیح نام کاربری و کلمه عبور با اطلاعات موجود در دیتابیس افراد ثبت نام شده برگه ای با شماره کد اختصاصی و تاریخ انقضاء مشخص به ما تعلق می گیرد که برای ورود به غرفه های گوناگون باید آن را ارائه کنیم (برگه را سشن، کد اختصاصی را همان مقدار سشن و غرفه ها را صفحات یک سایت فرض می کنیم)، در هر ورود به غرفه ها نیز صحت سشن و مدت اعتبار آن بررسی و در صورت تائید با مدت اعتبار جدید به روزرسانی می شود، بر همین روال و با توجه به سیاست های مدیریت ممکن است بعد از خروج از نمایشگاه دیگر نتوانیم با آن برگه وارد شویم (اعتبار برگه منقضی شود) و یا بعد از گذشت چند دقیقه یا چند ساعت اگر وارد هیچ غرفه ای نشده باشیم این اتفاق رخ دهد و مجبور به گرفتن برگه جدید از قسمت ورودی نمایشگاه شویم، حال اگر این برگه که روی آن کد اعتباری ما در مراجعه فعلی به نمایشگاه درج شده است به هر دلیل دریافت نشود یا از بین برود غرفه ها نمی توانند هویت ما را شناسایی کنند و لذا ممکن است اجازه دسترسی به خدماتشان را ندهند.
مشابه همین حالت به نوعی در سایت های وب در مورد بحث نشست یا سشن (Session) اتفاق می افتد، با اجرای هر درخواست ورود و در صورت تائید اطلاعات (معمولا شامل نام کاربری و کلمه عبور) برنامه فایلی با مقدار متنی اختصاصی برای هر کاربر در سرور و همچنین در مرورگر او ایجاد می کند (به فایلی که در سرور ایجاد می شود فایل سشن و به فایلی که در مرورگر ایجاد می شود کوکی گفته می شود) تا در هر بار درخواست صفحات سایت مرورگر مقدار کوکی را ارسال کرده و برنامه با تطبیق اطلاعات ارسالی با مقدار سشن بررسی کند که آیا کاربر مورد نظر دارای اعتبار لازم برای استفاده از صفحه درخواستی می باشد یا خیر، گفتیم این اعتبار در صورتی به کاربر تعلق می گیرد که او نام کاربری و کلمه عبور را به طور صحیح وارد کرده باشد و متغیرهای سشن مربوط به آن نام کاربری در سمت سرور از قبل تنظیم شده و دارای اعتبار باشند (به فرض نشست منقضی نشده یا کاربر از سیستم خارج نشده باشد).
هر نشست در PHP به صورت پیش فرض تا 24 دقیقه اعتبار دارد و اگر در این مدت کاربر هیچ صفحه ای را فراخوانی نکند باید مجددا وارد سایت شود، با فراخوانی هر صفحه مدت اعتبار نشست برای 24 دقیقه دیگر تمدید خواهد شد، این حالت را می توانیم تغییر دهیم که در این خصوص در آموزش بعد مفصل توضیح خواهیم داد.

ساخت دیتابیس، جدول، ستون ها و درج نمونه اطلاعات


کاربران برای ورود به پنل مدیریت قبلا باید در سایت ثبت نام کرده باشند که در آموزش قبل در این خصوص به صورت اختصاصی صحبت کردیم، لذا در این مطلب جهت جلوگیری از تکرار مباحث گذشته از توضیح دوباره مبحث خودداری می کنیم، در صورتی که آموزش قبل را مطالعه نکرده اید لطفا ابتدا با پیروی از مطالب آموزش آدرس زیر، دیتابیس، جدول و ستون ها را ساخته و نمونه اطلاعات اولیه را در آن درج نمائید:
آموزش ساخت فرم عضویت در سایت با PHP و MySQL
پس از ساخت دیتابیس، جدول، ستون ها و درج نمونه اطلاعات اولیه، ساز و کار لازم برای ایجاد مرحله ورود اعضاء به پنل مدیریت فراهم می شود.

تنظیم اطلاعات اتصال به دیتابیس در فایل config.php


برای اتصال به دیتابیس نیاز به تنظیم چند پارامتر در تابع mysqli_connect است که شامل نام سرور، نام کاربری دیتابیس، کلمه عبور دیتابیس و در نهایت عنوان دیتابیس است، برای تجمیع این موارد و استفاده چندباره از تنظیمات پیکربندی در صفحات مختلف معمولا از فایل Configoration استفاده می شود که در این آموزش نیز بر همین اساس اطلاعات را در فایلی با نام دلخواه config.php به صورت نمونه زیر قرار داده ایم:
<?php
//تنظیمات اتصال به دیتابیس
$config = array(
    'host' => 'localhost',
    'db_user' => 'نام کاربری دیتابیس',
    'db_pass' => 'کلمه عبور دیتابیس',
    'db_name' => 'نام دیتابیس'
);
?>
این فایل جهت نمونه است و باید مطابق با اطلاعات دیتابیسمان تکمیل شود.

فرم HTML جهت ورود و خروج در فایل index.php


مشابه آنچه در آموزش مربوط به ساخت فرم عضویت در سایت با PHP و MySQL دیدیم برای ورود به پنل مدیریت هم به فرم HTML جهت دریافت نام کاربری و کلمه عبور اعضاء نیازمندیم، البته اگرچه این فرم به صورت HTML است اما بهتر است پسوند فایل را به php ذخیره کنیم چون به دلیل کار با سشن و دریافت اطلاعات از کاربر و به فرض نمایش پیام در حالت ورود و خروج از پنل سایت به کدنویسی PHP نیاز خواهیم داشت، به هر صورت ابتدا فرم زیر را در فایلی با پسوند php و نام دلخواه index.php ایجاد می کنیم:
<?php
if(!isset($check)){
$text = null;
$username = null;
}
?>
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | فرم HTML ورود کاربر به پنل مدیریت سایت</title>
<!-- Webgoo.ir -->
<style>
body{
font-family:Tahoma, Geneva, sans-serif;
direction:rtl;
font-size:12px;
line-height: 22px;
}
.error{
height: 30px;
width: 100%;
color: #dd000a;
}
</style>
</head>
<body>
<?php echo $text; ?>
<form action="login.php" method="post">
<label for="user">نام کاربری:</label>
<input name="username" id="user" type="text" value="<?php echo $username; ?>" maxlength="255" dir="ltr">
<label for="pass">کلمه عبور:</label>
<input name="password" id="pass" type="password" maxlength="255" dir="ltr">
<input name="check" type="hidden" value="1">
<input type="submit" value="ورود به پنل">
</form>
<hr>
- قبل از ورود کاربر به پنل مدیریت سایت ابتدا باید اطلاعات اتصال به دیتابیس را در فایل config.php در آرایه config تعریف کرده باشیم، نام کاربری در لوکال هاست معمولا root و بدون کلمه عبور است.<br>
- اجرای صحیح این کد مستلزم ساخت دیتابیس، جدول، ستون ها و درج نمونه اطلاعاتی است که در آموزش نحوه ساخت فرم عضویت سایت توضیح داده ایم (در صورتی که این آموزش را مطالعه نکرده اید لطفا به بخش آموزش های کاربردی MySQL مراجعه کنید).<br>
- دقت کنیم برای رمزنگاری کلمه عبور در مرحله عضویت کاربر از تابع password_hash استفاده کرده ایم، این تابع از نسخه PHP 5.5 در دسترس است، برای سازگاری نسخه های قدیمی تر کتابخه password_compat به کدها اضافه شده است.<br>
</body>
</html>
توضیح:
- دو فیلد اصلی در فرم ورود با نام های username و password مشخص شده اند، فیلد مربوط به کلمه عبور از نوع password است تا کلمه عبور کاربر به شکل حفاظت شده و مخفی وارد شود.
- اطلاعات این فرم به فایلی با نام دلخواه login.php و با متد POST ارسال می شود، با توجه به آدرس دهی قسمت action فرم این فایل باید در کنار فایل index.php قرار داشته باشد.
- فیلد مخفی با نام فرضی check جهت اطمینان از ارسال فرم ورود توسط کاربر است.
- تکه کدهای PHP استفاده شده در این فایل هماهنگ با سایر فایل هایی هستند که در ادامه بررسی خواهیم کرد.

بررسی وضعیت ورود کاربر با فایل login.php


پس از اینکه کاربر اطلاعات خود را در فرم ورود وارد کرده و بر روی دکمه ارسال کلیک می کند، داده ها شامل نام کاربری و کلمه عبور در سرور و کدهای PHP دریافت می شوند، در این مرحله برای اینکه کاربر دسترسی مجاز به پنل کاربری داشته باشد مقادیر ارسالی باید با آنچه که در دیتابیس سرور وجود دارد تطبیق داده شوند، به طور معمول این تطبیق با برنامه نویسی PHP و MySQL انجام می شود که این کار در نمونه کد زیر هماهنگ با فرم عضویتی که در آموزش قبل ساختیم انجام شده است:
<?php
//شروع نشست
session_name('panel');
session_start();

//پیش فرض
$_SESSION['access'] = false;
$_SESSION['user'] = null;
$error = 0;
$text = null;

//فایل تنظیمات اتصال به دیتابیس
include_once('config.php');

//تعریف توابع کلمه عبور در نسخه های پائین تر از PHP 5.5
if(!function_exists('password_hash')) {
    include_once('lib/password_compat.php');
}

//دریافت و تعریف متغیرها
@$username = $_POST['username'];
@$password = $_POST['password'];
@$check = $_POST['check'];

/* بررسی معتبر بودن اطلاعات ارسالی کاربر در صورت ارسال فرم */
if($check == 1) {
    //نام کاربری
    if(!isset($username) || empty($username)) {
        $error = 1;
        $text = "نام کاربری خود را وارد کنید!";
    } //کلمه عبور
    elseif(!isset($password) || empty($password)) {
        $error = 1;
        $text = "کلمه عبور خود را وارد کنید!";
    }

    //بررسی خطا
    if($error === 0) {
        //اتصال به دیتابیس
        $conn = mysqli_connect($config['host'], $config['db_user'], $config['db_pass'], $config['db_name']);

        if(!$conn) {
            echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
            exit;
        } else {
            //ایمن سازی پارامترها
            $username = mysqli_real_escape_string($conn, $username);

            //نام جدول
            $tbl_name = "users";

            //اانتخاب اطلاعات از جدول و ستون
            $sql = "SELECT `password` FROM $tbl_name WHERE `username` = '$username' LIMIT 1";
            $query = mysqli_query($conn, $sql);

            if(!$query) {
                echo "Selecting From Table $tbl_name: Error! " . mysqli_error($conn) . '<br>';
            } else {
                //تعداد ردیف های انتخاب شده
                $count = mysqli_num_rows($query);

                if($count === 0) {
                    $error = 1;
                    $text = "نام کاربری یا کلمه عبور اشتباه است!";
                } else {
                    while($row = mysqli_fetch_array($query)) {
                        $db_hashed_password = $row['password'];

                        //تطبیق کلمه عبور
                        if(password_verify($password, $db_hashed_password)) {
                            $_SESSION['access'] = true;
                            $_SESSION['user'] = $username;
                            header("Location: panel.php");
                            exit;
                        } else {
                            $error = 1;
                            $text = "نام کاربری یا کلمه عبور اشتباه است!";
                        }
                    }
                }
            }
        }

        //پایان اتصال
        mysqli_close($conn);
    }
}

//بارگذاری مجدد فرم ورود در صورت بروز خطا یا فراخوانی مجدد
if($check != 1 || $error == 1) {
    if($error == 1) {
        $text = '<div class="error">' . $text . '</div>';
    }

    include_once('index.php');
}
?>
توضیح:
- اگر بخواهیم نام سشن و کوکی به صورت سفارشی و دلخواه تنظیم شود می توانیم با تابع session_name این کار را انجام دهیم، در غیر اینصورت مفسر PHP به صورت پیش فرض از نام PHPSESSID برای سشن و کوکی استفاده خواهد کرد.
- در گام دوم با تابع session_start یک نشست یا سشن را برای ورود فعلی تعریف می کنیم، دقت کنیم که این تابع باید قبل از ارسال هر نوع خروجی به مرورگر تنظیم شود در غیر اینصورت خطای 
Warning: Cannot modify header information - headers already sent...
دریافت خواهیم کرد.
- در مرحله بعد متغیرهای پیش فرض برنامه را با مقادیر اولیه تعریف می کنیم.
- با توجه به اینکه توابع مربوط به رمزنگاری و تطبیق کلمه عبور (password_hash و password_verify) در نسخه های قدیمی PHP در دسترس نیستند، از کتابخانه جایگزین password_compat بدین منظور استفاده کرده ایم تا برنامه با این نسخه ها نیز سازگار باشد.
- مقادیر ارسالی کاربر از فرم را در متغیرهایی دریافت می کنیم تا در ادامه کدها از این اطلاعات استفاده کنیم، در اینجا توجه به پارامتر نام (name) فیلدهای input اهمیت زیادی دارد، چرا که متغیرها و مقادیر آنها بر اساس نام فیلد و متد POST مقداردهی می شوند.
- قسمت مربوط به متغیر check برای اطمینان از ارسال فرم توسط کاربر درنظر گرفته شده است، نوع input به صورت hidden یا مخفی است و جلوه ظاهری ندارد اما با ارسال فرم مقدار 1 به سرور ارسال می شود که با این شیوه می توانیم بین دو حالت ارسال و عدم ارسال فرم در کدهای PHP تفاوت قائل شویم.
- برای اعتبارسنجی مقادیر ارسال شده از فرم ورود از دستورات شرطی if و elseif و توابع isset (بررسی وجود یک متغیر) و empty (بررسی خالی نبودن مقدار متغیر) استفاده کرده ایم.
- سپس اتصال به پایگاه داده را با توجه به اطلاعات موجود در فایل config.php برقرار می کنیم، برای سرور مجازی یا لوکال هاست معمولا از نام کاربری root و بدون پسورد استفاده می شود، نام پایگاه داده نیز بستگی به خودمان و دیتابیسی دارد که پیشتر ساخته ایم (در آموزش های مقدماتی MySQL دیدیم که دیتابیس را هم می توانیم با کدهای PHP و هم به صورت دستی در برنامه phpMyAdmin بسازیم).
- بعد از برقراری اتصال به پایگاه داده باید متغیر نام کاربری را با تابع mysqli_real_escape_string ایمن سازی کنیم تا از برنامه در مقابل نفوذ احتمالی به پایگاه داده حفاظت کرده باشیم، البته یادآور می شویم تابع عنوان شده صرفا جهت نمونه و برای کاربردهای متداول است، قاعدتا می توانیم از روش ها و توابع پیچیده تری نیز برای افزایش ضریب امنیت استفاده کنیم.
- با دستور SELECT بررسی می کنیم تا ببینیم آیا کاربری با این مشخصات در دیتابیس برنامه وجود دارد یا خیر، اگر تعداد فیلدهای انتخاب شده برابر با 0 باشد (mysqli_num_rows تعداد ردیف های نتایج یک پرس و جو را برمی گرداند)، پس چنین کاربری وجود ندارد و پیغام خطا نمایش داده می شود، در غیر اینصورت اگر مقادیر 1 برگردانده شود این نام کاربری وجود دارد و وارد مرحله تطبیق کلمه عبور می شویم.
- اگر کاربر مشخصات را صحیح وارد کرده و تطبیق با تابع password_verify صحیح (true) باشد دو متغیر از نوع SESSION تنظیم می کنیم، مقادیر access برای متغیر جهت تعیین وضعیت دسترسی مجاز یا غیرمجاز و مقادیر user نام کاربری را در خود نگهداری می کند.
- متغیرهای نوع SESSION به صورت سراسری (Superglobal) هستند و بین صفحات مختلف در هر قسمت از برنامه می توانیم به مقدار آنها دسترسی داشته باشیم.
- در صورت تطبیق اطلاعات و پس از تنظیم متغیرهای سشن، کاربر به صورت خودکار به پنل مدیریت هدایت می شود و در صورت عدم تطبیق پیغام خطا نمایش داده خواهد شد.
- در نهایت نیز اتصال به پایگاه داده را با تابع mysqli_close خاتمه می دهیم.
- در صورتی که کاربر فرم را ارسال نکرده یا فرم با خطا مواجه شود، فایل index.php را در انتهای کدهای فایل login.php وارد می کنیم تا فرم ورود نمایش داده شود، این ساز و کار به عنوان نمونه است و جنبه آموزشی دارد، قاعدتا با درک نحوه کار سشن و کوکی می توانیم ساختار سفارشی و مد نظر خودمان را داشته باشیم.

برقراری نشست (Session) در پنل کاربری با فایل panel.php


زمانی که کاربر با موفقیت وارد محیط کاربری برنامه می شود برای برقراری پیوسته نشست در هر صفحه از سایتمان که به صورت مستقل فراخوانی می شود باید از توابع session_name و session_start استفاده کنیم، همچنین در صفحاتی که نیاز به دسترسی مجاز به محتوا دارند باید بررسی کنیم و ببینیم که متغیر سشن access تنظیم شده و برابر مقدار true باشد که این کار را با شرط if و تابع isset انجام داده ایم.
فایل محیط کاربری را که در واقع فایل اصلی پنل کاربری برنامه است با نامی انتخابی و صرفا جهت نمونه به صورت panel.php نامگذاری کرده  و نمونه کدهای زیر را در آن درج می کنیم:
<?php
//شروع نشست
session_name('panel');
session_start();

//بررسی متغیرهای نشست
if(isset($_SESSION['access']) && $_SESSION['access'] === true) {
    echo 'Welcome To Control Panel!<br>User Name: ' . $_SESSION['user'];
    echo '&nbsp;[<a href="logout.php" title="Logout">Logout</a>]';
} else {
    header("HTTP/1.1 403 Forbidden");
    echo 'HTTP 403 Forbidden – Access Denied!';
    exit;
}
?>
این نمونه کد ساختار کلی و اولیه پنل کاربری را نشان می دهد که شامل سه قسمت زیر است:
- نام سشن، کوکی و شروع نشست با توابع session_name و session_start، این توابع باید قبل از ارسال هر نوع خروجی به مرورگر اجرا شوند، این خروجی می تواند شامل کاراکترهای نامرئی BOM (مخفف Byte Order Mark) باشد که برای اطمینان بهتر است فایل ها را در برنامه ++Notepade اجرا و از قسمت Encoding گزینه Encoding in UTF-8 without BOM را انتخاب و مجددا فایل را ذخیره کنیم.
- قسمت مربوط به بررسی وضعیت مجاز بودن دسترسی کاربر که با استفاده از تنظیم متغیر SESSION با نام access و مقدار true (دسترسی مجاز) و یا false (دسترسی غیرمجاز) تعیین می شود، این نوع متغیرها در صورت برقراری نشست در صفحات مختلف در دسترس هستند و می توانیم اطلاعات را از صفحه ای به صفحه دیگر به اشتراک بگذاریم، برای نمونه در اینجا متغیر SESSION با نام usre مقدار نام کاربری را در خود نگهداری می کند و می توانیم با دستور echo از آن خروجی بگیریم.
- در قسمت سوم در صورت عدم برقراری شرط if بخش else اجرا خواهد شد و با تنظیم کد خطای HTTP 403 با استفاده از تابع header دسترسی کاربر به مرورگر غیرمجاز اعلام می شود.
نکته 1: هر نشست در PHP به صورت پیش فرض تا 24 دقیقه اعتبار دارد و اگر کاربر در این فاصله صفحه را رفرش نکرده یا صفحه دیگری را فراخوانی نکند نشست جاری به صورت خودکار منقضی می شود، این تنظیمات از طریق فایل php.ini و همچنین ذخیره و به روزرسانی اطلاعات سشن در دیتابیس قابل تغییر است که در آموزش بعدی در این خصوص بیشتر خواهیم گفت.
نکته 2: این نمونه کد فقط یک ساختار ساده محیط کاربری است و جنبه آموزشی دارد، قاعدتا برنامه های کاربردی نیاز به کدنویسی بیشتر و تعریف امکانات متفاوتی دارند که هر کدام باید در جای خود آموزش داده شوند.

پایان نشست و خروج از سایت با فایل logout.php


اغلب کاربران در مرحله ای از کار نیاز به خاتمه نشست و خروج امن از پنل مدیریت سایت دارند که باید با ساز و کاری این امکان را فراهم کنیم، بدین منظور دو تابع session_unset (حذف متغیرهای نشست) و session_destroy (حذف کامل اطلاعات نشست از سرور) کاربرد دارند که در نمونه کد زیر در فایل logout.php استفاده شده اند:
<?php
//شروع نشست
session_name('panel');
session_start();

//منقضی کردن و حذف اطلاعات نشست
session_unset();
session_destroy();

//انتقال به صفحه ورود
header("Location: login.php");
exit;
?>
توضیح:
- از تابع session_unset برای منقضی کردن متغیرهای سشن استفاده می کنیم، متغیرهای نشست در این ساختار شامل access و user هستند که با SESSION و به صورت آرایه تعریف شده اند، در واقع استفاده از این تابع مساوی با حالت زیر است:
$_SESSION = array();
- با تابع session_destroy فایل حاوی اطلاعات نشست از سرور حذف می شود و برای ورود مجدد کاربر، نیاز به ارسال نام کاربری و کلمه عبور است.
فایل logout.php را هم از طریق لینک و هم با استفاده از فرم HTML و دکمه input می توانیم فراخوانی کنیم:
<a href="logout.php" title="Logout">خروج</a>

<form action="logout.php" method="post">
<input type="submit" value="خروج">
</form>
توضیح:
- این فرم صرفا فایل logout.php را فراخوانی می کند و با فراخوانی این فایل سشن به طور کامل منقضی می شود.
- با کمی آشنایی بیشتر با مبحث نشست ها در PHP می توانیم ایده های جالبی تعریف کنیم، به طور مثال پیام خوش آمد گویی و خروج به کاربر نمایش دهیم یا به فرض از مقادیری که در متغیر سشن user وجود دارد برای نمایش نام کاربری استفاده کنیم.
نکته: در نگاه اول مبحث مربوط به سشن ها ممکن است کمی پیچیده به نظر برسد به همین جهت در این مطلب به همین حد اکتفا می کنیم و در آموزش بعدی خواهیم دید که چگونه می توانیم امکانات جانبی بیشتری به فرم ورود و خروج سایت اضافه کنیم.

دانلود نمونه فایل های آموزش


برای جمع بندی کار می توانیم فایل هایی که در این آموزش بررسی کردیم را از لینک زیر دریافت کنیم:
دانلود نمونه فایل های آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
sectionدسته بندی: آموزش کاربردی » MySQL
related مطالب بیشتر:
» نحوه رسم چارت و نمودار آماری با PHP و MySQL
» آموزش ساخت فرم تماس با PHP و MySQL
» هوشمند سازی پنل ورود و خروج سایت با PHP و MySQL
» آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
» آموزش ساخت فرم عضویت در سایت با PHP و MySQL
commentنظرات (۲۲۹ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: Reza
زمان: ۰۹:۴۸:۱۴ - تاریخ: ۱۳۹۱/۰۴/۰۳
ممنون
نویسنده: Reza
زمان: ۲۲:۲۴:۱۵ - تاریخ: ۱۳۹۱/۰۴/۲۳
سلام
می خواستم بپرسم چطوری میشه به جای متن "شما به سایت وارد شده اید" یک پیغام خوش آمد گویی به همراه نام کاربری اعضا نمایش داده شود؟
مثلا اگه من با نام کاربری Reza ثبت نام کرده باشم، بعد از ورود به سایت بنویسه "خوش آمدید Reza"
پاسخ: 
سلام
برای این کار دو راه وجود دارد، یک حالت استفاده از متغیر
$_SESSION['username']
است، اگر از این متغیر با دستور echo خروجی بگیرید، نام کاربر را نشان می دهد، چون ما آن را برابر با username قرار داده ایم، راه دوم اینکه نام کاربر را در دیتابیس، هنگام ثبت نام، ذخیره کرده باشیم و پس از تطبیق مشخصات او، از آن نام استفاده کنیم.
نویسنده: mohammad
زمان: ۰۱:۵۶:۵۵ - تاریخ: ۱۳۹۱/۰۴/۲۴
سلام
خیلی جامع و کامل بود ...مرسی
فقط من یه سوال دارم، من می خوام وقتی طرف وارد شد نام و نام خانوادگی و چند فیلد دیگه که تو دیتابیس هست رو در چند تکست باکس متفاوت نمایش بدم (هر کدام از فیلد ها در یک تکست) میشه بگین چجوری این کار رو بکنم؟
پاسخ: 
سلام
اگر با نحوه کار php و mysql آشنا باشید، انجام این کار چندان سخت نیست، کافی است مقادیر ردیف های مورد نظر را با دستور SELECT * FROM فراخوانی کنید و متغیر مورد نظر را به عنوان value برای فیلدها در نظر بگیرید.
مثال:
<?php
//تعریف متغیر ها
$user_name = $_SESSION['username'];
$user_pass = $_SESSION['password'];
$result = mysql_query("SELECT * FROM table_name WHERE user = '$user_name' AND pass = '$user_pass' LIMIT 1")
or die(mysql_error());
while($row = mysql_fetch_array($result)){
//در یافت مقادیر ردیف ها و تعریف متغیر
$id = $row['id'];
$name = $row['name'];
$family = $row['family'];
}
?>
<form action="#" method="post">
<input name="id" type="hidden" value="<?php echo $id ?>" /><br />
<label for="name">نام:</label>
<input name="name" id="name" type="text" value="<?php echo $name ?>" /><br />
<label for="family">نام خانوادگی:</label>
<input name="family" id="family" type="text" value="<?php echo $family ?>" /><br />
<input type="submit" value="ارسال" />
</form>
البته این تنها یک مثال است، می توان با کمی تجربه شیوه های مورد نظر خودتان را ایجاد کنید.
نویسنده: علی
زمان: ۱۷:۵۴:۳۵ - تاریخ: ۱۳۹۱/۰۵/۰۱
سلام
آموزش بسیار عالی بود
فقط می خواستم بدونم کلا بحث استفاده از دیتابیس توش چیه من باید برم یک table به نام register ایجاد کنم بعدش باید چی کار کنم لطفا کمک کنید.
پاسخ: 
سلام
از آنجایی که سیستم های ورود و خروج اعضاء به سایت، مبتنی بر پایگاه داده هستند، لذا باید اطلاعات آنها هنگام ثبت نام، ابتدا در دیتابیس و در جدولی با چند ستون مختلف (id, username, password و...) ذخیره شود، این اطلاعات به طور معمول شامل نام کاربری و کلمه عبور است، سپس در هنگام ورود، اطلاعات ارسالی کاربر از فرم ورود، با آنچه که در دیتابیس موجود است تطبیق داده می شود تا اگر منطبق بود، اجازه ورود داده شود و سشن ها تنظیم شوند، پس هدف از ساخت جدول: 1- دریافت و ذخیره اطلاعات هنگام ثبت نام درون فیلدها است. 2- تطبیق نام کاربری و کلمه عبور با آنچه از قبل ذخیره شده است. در ضمن این آموزش مبتنی بر مطلب دیگری است که لینک آن در بالا و در قسمت "ساخت دیتابیس، ردیف ها و اطلاعات اعضاء" ذکر شده.
اگر مشکل دیگری بود عنوان کنید.
نویسنده: متین
زمان: ۱۹:۴۹:۵۳ - تاریخ: ۱۳۹۱/۰۵/۰۳
با سلام
من یک سایت دارم طراحی میکنم یه مشکل کوچولو دارم اگه ممکنه یه کمکی بکنید:
من یک صفحه بنام index.php دارم که میخوام وقتی کاربر به این صفحه میاد خود به خود آدرس به این شکل تغییر کنه :
index.php?page=1
میشه راهنمایی کنید چه جوری باید این کار رو کرد.
خیلی متشکر
پاسخ: 
سلام
ساده ترین راه برای این کار استفاده از توابع header و ریدایرکت در php است، به فرض ابتدا چک می کنیم که آیا متغیر page تنظیم شده است یا خیر، اگر تنظیم نشده باشد، با ریدایرکت، کاربر را به طور خودکار به آدرس پیش فرض انتقال می دهیم:
$page = $_GET['page'];
if (!isset($page) || $page == ''){
header('Location: http://yoursite.com/index.php?page=1');
die();
}
این کد باید قبل از ارسال هر نوع خروجی html در صفحه قرار گیرد (در بالاترین قسمت صفحه)، یک روش دیگر بررسی لینک درخواستی است، اگر 9 حرف آخر آدرس درخواستی برابر index.php باشد، آنگاه کاربر را به آدرس مورد نظر منتقل می کنیم:
$requested_url = $_SERVER['REQUEST_URI'];
if (substr($requested_url,-9) == 'index.php'){
header('Location: http://yoursite.com/index.php?page=1');
die();
}
اگر می خواهید یک لینک را برای همیشه منتقل کنید نیز از ریدایرکت 301 استفاده نمائید:
$requested_url = $_SERVER['REQUEST_URI'];
if (substr($requested_url,-9) == 'index.php'){
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://yoursite.com/index.php?page=1');
die();
}
استفاده از این کدها باید با آگاهی از نحوه عملکرد آنها انجام شود تا دچار مشکل دیگری نشوید.
نویسنده: solmaz
زمان: ۰۰:۲۲:۴۶ - تاریخ: ۱۳۹۱/۰۵/۰۵
سلام
ببخشید من می خواهم یک سیستم تغذیه دانشگاه با php برای پروژه ام درست کنم ولی نمی تونم متاسفانه چون من نمی دونم چه جوری ما دانشگاه مون فیش می گیریم و php در حد مبتدی بلدم
پاسخ: 
سلام
با شرایطی که عنوان کردید، حل مشکل شما نیاز به آشنایی و کار قبلی با php دارد، برنامه شما به فرض نیاز به دیتابیس، جداول و لیست کارت های تغذیه، سیستم ثبت روزانه و... خواهد داشت که هر کدام نیاز به کدنویسی دارند، واقعیت مطلب این است که تبدیل ایده های ذهنی به یک برنامه کاربردی بدون تجربه و تسلط چندان متصور نیست، اما اگر قبلا چند پروژه ساده انجام داده بودید، این کار را هم به راحتی می توانستید انجام دهید.
نویسنده: mahsa
زمان: ۱۵:۱۵:۱۹ - تاریخ: ۱۳۹۱/۰۵/۰۵
سلام
تشکر از آموزشتون. میخواستم بدونم آموزش بعدی در رابطه با "امکانات جانبی بیشتر این فرم" رو تقریباً چه مدت دیگه میذارید؟ آخه یه پروژه وبسایت دارم که بهش نیاز دارم هر چه زودتر
پاسخ: 
سلام
یک بخش کوچک از آموزش مربوط به فرم ثبت نام باقی است و آن نحوه به خاطر سپاری کاربر و همچنین خارج شدن خودکار از سیستم بعد از چند دقیقه غیر فعال بودن است که در هفته آینده تکمیل خواهد شد، اگر امکانات جانبی دیگری مد نظر شماست، لطفا بیان کنید تا در صورت امکان در آموزش بعدی گنجانده شود.
نویسنده: مانوک
زمان: ۱۵:۲۷:۰۸ - تاریخ: ۱۳۹۱/۰۵/۰۶
سلام، ممنون از راهنماییتون، میخواستم بدونم اگر ممکنه در مورد MD5 کردن یه توضیحی بدین الان من با user و pass وارد میشم و pass من 32 کاراکتری یا همون md5 میشه، این کار تو جدول session انجام میشه و اون 32 کاراکتر هم برای check id هست و هم برایsession id، میخواستم بدونم نقش این دوتا با هم چیه و زمانیکه رمز عبور گرفته میشه، این دو چه کاری میکنند؟ ممنون میشم اگه زود جواب بدین
پاسخ: 
سلام
md5 یک تابع برای رمزنگاری بدون بازگشت کلمه عبور است که برای محافظت از پسوردها استفاده می شود، البته عیب و شاید در عین حال مزیت آن در این است که تنها کاربر می داند که چه چیز را به عنوان پسورد تعیین کرده است، یعنی در صورت فراموش شدن کلمه عبور نمی توان عین آن را بازیابی کرد و باید رمز جدید اختصاص داده شود، حاصل استفاده از md5 برای هر پسورد همیشه یک کد رمزی شده است، به فرض کلمه php اگر به تابع md5 داده شود، همیشه نتیجه به صورت زیر خواهد بود:
<?php
echo md5('php');
e1bfd762321e409cee4ac0b6e841963c
?>
به این صورت هنگام ورود، کلمه عبور، ابتدا تبدیل به رمز شده و رمز با آنچه در دیتابیس از قبل و در هنگام ثبت نام ذخیره شده تطبیق داده می شود.
اما session id تنها یک کد است که سرور آن را به صورت رندوم ساخته و به کاربر اختصاص می دهد تا در درخواست ها، کاربران متفاوت را از هم شناسایی کند، session id هم در سرور و هم در مرورگر کاربران به صورت کوکی ایجاد می شود، اما آنچه که باعث شناسایی دقیق کاربر هنگام ورود و استفاده از بخش اعضاء سایت می شود در واقع وجود نام کاربری و کلمه عبور به صورت متغیر های سشن
$_SESSION['username'];
$_SESSION['password'];
در سرور است، برای هر session id دو متغیر بالا در سرور تنظیم می شود و این کار تنها پس از ورود صحیح اطلاعات نام کاربری و کلمه عبور صورت می گیرد و با خروج از سیستم نیز متغیر های سشن با تابع unset از بین می روند.
نویسنده: mahsa
زمان: ۱۶:۰۳:۱۳ - تاریخ: ۱۳۹۱/۰۵/۰۷
سلام
من تمام کدهای شما رو پیاده سازی کردم ولی میخوام با ورود کاربر، باز همان صفحه ای که username و password از ما میخواد نمایش داده بشه با این تفاوت که دکمه خروج اضافه بشه.
پاسخ: 
سلام
این کار بسیار ساده است، کافی است وضعیت مجوز استفاده از بخش اعضاء کاربر را با یک دستور شرطی if بررسی کنید، اگر وارد سیستم شده باشد، کد مربوط به خروج یا هر چیز دیگری را که بخواهید، با دستور echo چاپ کنید. به طور مثال:
<?php
session_start();
//پیش فرض
$user_login = 0;
//بررسی ورود کاربر
if (!isset($_SESSION['username']) || !isset($_SESSION['password'])){
header("location:index.php");
}
//بررسی مجوز استفاده از بخش اعضاء
elseif (isset($_SESSION['username']) && isset($_SESSION['password'])){
$user_login = 1;
}
//چاپ خروجی برای اعضاء
if ($user_login == 1){
echo'<form action="logout.php" method="post">
<input type="submit" value="خروج" />
</form>';
}
?>
اگر به نحوه عملکرد کد دقت کنید، خودتان می توانید به راحتی آن را توسعه دهید و امکانات مورد نظر را اضافه نمائید.
نویسنده: Reza
زمان: ۱۷:۰۹:۰۳ - تاریخ: ۱۳۹۱/۰۵/۱۳
سلام
من پنل ورود سایتم رو با کوکی نوشتم، یه سوال راجب نوشتن نام کاربری در کنار یک متن دلخواه به جای عبارت "شما به سایت وارد شده اید" قبلا پرسیدم و کارهایی که شما گفتین رو انجام دادم. ولی نتیجه نگرفتم، این کدی که من نوشتم:
$lname = $_COOKIE['lname'];
lname یعنی نام خانوادگی که کاربر هنگام عضویت وارد میکنه و برای فراخوانی نام خانوادگی این کد رو نوشتم:
echo $lname;
لطفا راهنمایی کنید.
پاسخ: 
سلام
استفاده از متغیر کوکی نیز می تواند مقصود شما را برآورده کند، اما اگر متغیر های سشن را درست تنظیم کرده باشید، با خروجی گرفتن از آنها باید نام کاربر (یا هر مقدار دیگر) نشان داده شود، در غیر این صورت به احتمال قوی در جایی از برنامه خود اشتباه کرده اید، وقتی یک متغیر سشن ست می شود، در هر صفحه که نشست ادامه دارد و شروع می شود، آن متغیر باید در دسترس باشد و با دستور echo خروجی مورد نظر را بدهد، اگر مقادیر دستور echo از آن سشن خالی باشد، پس سشنی ست نشده یا خالی است! می توانید از isset نیز برای بررسی ست شدن یا نشدن سشن استفاده کنید. یک نکته دیگر اینکه ممکن است مشکل شما از ست شدن اشتباه کوکی ها باشد و سرور نتواند متغیرهای سشن را از صفحه ای به صفحه دیگر منتقل کند، کد خود را بدون ست کردن کوکی نیز تست کنید، منتها ابتدا کوکی های موجود را از حافظه مرورگر حذف نمائید.
نویسنده: علی
زمان: ۱۵:۳۱:۳۵ - تاریخ: ۱۳۹۱/۰۵/۱۴
با سلام
اگه مثلا ادمین سایت بخواهد بفهمه که چه کسانی ثبت نام کردند باید چی کار کنم ؟؟
مثلا با دادن رمز عبور و نام کاربری وارد یک جدول بشه که اطلاعات اون هایی که ثبت نام کردند رو ببینه
لطفا کمکم کنید ممنون
پاسخ: 
سلام
شما باید با نحوه کار php و mysql آشنا باشید، دستور SELECT * FROM می تواند به راحتی این کار را انجام دهد و مقادیر را به خروجی ارسال کند، توصیه می کنیم بخش آموزش های مقدماتی MySQL را مطالعه کنید.
نویسنده: مصی جون
زمان: ۲۲:۴۳:۲۷ - تاریخ: ۱۳۹۱/۰۵/۱۴
سلام
فرم ثبت نام من درست کار میکنه ولی فرم ورود خطای اطلاعات وارد شده صحیح نیست!
را میدهد.درصورتی که اطلاعات در دیتابیس مشاهده مییشود.
درضمن من سیشن روهم درهمون صفحه در بالای همه کدها نوشتم.
پاسخ: 
سلام
هنگام ورود از متغیر count ، username و password با echo خروجی بگیرید و آن را با دیتابیس مقایسه کنید، این خطا یعنی اطلاعات شما یا نوع کدنگاری با md5 بین فرم ورود و ثبت نام متفاوت است یا اینکه اطلاعات واقعا درست و یکسان وارد نمی شود.
نویسنده: ادیبی
زمان: ۱۳:۰۳:۱۱ - تاریخ: ۱۳۹۱/۰۵/۱۵
خیلی عالی بود تشکر
نویسنده: محسن
زمان: ۱۱:۵۴:۵۸ - تاریخ: ۱۳۹۱/۰۵/۱۹
سلام
میشه یه پروژه ثبت نام حرفه ای برای سایت با php رو بزارید که تو فرم ثبت نام ایمیل طرفو بگیره بعد لینک فعال سازی براش بفرسته و تو فرم ثبت نام کد تشخیص انسان رو هم داشته باشه خیلی من این پروژه رو لازم دارم انصافا سایتی مثل سایت شما تو اینترنت پیدا نکردم اجرت با خدا
پاسخ: 
سلام
نظر لطف شما است.
پروژه درخواستی از قسمت های مختلفی تشکیل می شود که باید هر کدام به صورت مجزا آموزش داده شوند، بخشی از آموزش های مورد نیاز تا این لحظه در سایت قرار داده شده است و برخی نیز در ادامه مطالب، منتشر خواهند شد.
برای اینکه بتوانید امکانات مورد نظر خود را ایجاد کنید، باید تا حدودی با برنامه نویسی وب نیز آشنا باشید، در غیر این صورت، واقعیت این است که هیچ کد آماده ای نمی تواند تمام نیازهای شما را برآورده کند.
نویسنده: ادیبی
زمان: ۱۳:۱۳:۴۶ - تاریخ: ۱۳۹۱/۰۵/۱۹
با سلام و خسته نباشید
من میخوام وقتی کاربری که هنوز وارد سیستم نشده لینکی که مجاز به دیدنش نیست رو می زنه وقتی برگردونده میشه به صفحه اصلی سیستم بهش پیغام بده که چون وارد نشدید مجاز به دیدن این صفحه نیستید
حالا در فایلی که کاربر مجاز به دیدن آن نیست بعد از چک ورود کاربر متغیری رو مقداردهی می کنم می خوام بدونم برای اینکه این متغیر رو بتونم در فایل صفحه اصلی چک کنم آیا باید حتما در فایلی که کاربر مجاز به دیدن آن نیست فرم تعریف کنم تا بتونم متغیر رو از طریق post_ $ در صفحه اصلی بهش دسترسی پیدا کنم یا راه دیگه ای برای دسترسی به این متغیر بدون تعریف فرم وجود داره؟
با تشکر منتظر پاسختون هستم
پاسخ: 
سلام
دسترسی به مقادیر متغیر ها در php از چند طریق امکان پذیر است، یک روش استفاده از متدهای POST یا GET و... است که بیشتر برای فرم های وب کاربرد دارد، روش دیگر که در مورد مشکل شما می تواند کاربردی باشد، استفاده از متغیرهای سشن است، وقتی متغیری به صورت سشن (session) تعریف می شود، مقادیر آن در هر صفحه ای که نشست در آن شروع شود، قابل دسترسی است که به این حالت در اصطلاح متغیر های superglobals می گویند، متغیرهای این دسته شامل موارد زیر می شود:
 $GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
توجه کنید قبل از شروع تابع session_start نباید هیچ نوع خروجی به مرورگر ارسال شود، برخی ویرایشگرها کاراکترهای نامرئی (BOM) به صفحات اضافه می کنند که باعث دریافت خطای Cannot modify header information - headers already sent می شود.
لذا کافی است متغیر مورد نظر خود را در قالب یک SESSION_$ تعریف کنید و از آن در صفحات مختلف جهت بررسی موارد مورد نظر استفاده نمائید.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- مواردی که به کلی خارج از موضوع این مطلب هستند را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم، غیرضروری و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ خاصی داده نخواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- تمام یادداشت ها بررسی و برای هر کاربر زمان مشخصی جهت پاسخگویی در نظر گرفته می شود، لذا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.




5 × 6
 refresh
نکته:
با توجه به تاریخ نگارش آموزش های سایت و پیشرفت تکنولوژی های مرتبط با وب در سالیان اخیر، محتوای برخی از مطالب قدیمی ممکن است نیاز به ویرایش و به روزرسانی داشته باشد که این کار هم زمان با تهیه نسخه جدید «وبگو» به مرور در حال انجام است، لطفا در استفاده از مطالب سایت به این نکته دقت داشته و حتی المقدور از چند منبع مختلف استفاده نمائید.
آخرین دیدگاه ها
form نادی
در:
سلام من دارم تو ری اکت از تگ p استفاده میکنم باید چیکار کنم که نقطه رو نچسبونه به اول خط!؟
۱۰:۵۹:۵۴ ۱۳۹۹/۰۱/۱۱

form amir
در:
سلام و ارادت سال نو مبارک ... من یه صفحه دارم که شامل یه سری پست هست و میخوام امکان لایک مطالب پست...
۱۳:۲۲:۲۱ ۱۳۹۹/۰۱/۱۰

form hadis
در:
سلام من تازه کارم میخاستم بدون اون قسمت درباره وبلاگ تعداد سطرها رو بیشتر و هم طرف راست و هم طرف چپ باشه میشه...
۰۴:۵۲:۱۸ ۱۳۹۹/۰۱/۱۰

form نیلوفر
در:
سلام من منوی سایتم فونتش بهم ریخته من هیچ دستکاری نکردم سایت وردپرسی هستش لطفا اگر اطلاعاتی دارین به من بدید ممنونم
۱۸:۵۹:۵۲ ۱۳۹۹/۰۱/۰۵

form محمود
در:
سلام. ممنون از راهنمایتان و متشکرم. دوباره مزاحم می شوم.
۱۰:۵۹:۴۷ ۱۳۹۹/۰۱/۰۵

form mahdi
در:
سلام استاد عزیز ، عذر میخوام من سوال زیاد میپرسم ، میخواستم بدونم چه توی css و چه javascript ما ie8 رو در نظر بگیریم...
۱۲:۱۳:۲۸ ۱۳۹۹/۰۱/۰۴

form محمود
در:
سلام و عرض ادب. وقتی روی فایل pdf روی سایتم کلیک می شود ،PDF در همان تب باز می شود ولی من می خام...
۱۱:۵۵:۱۸ ۱۳۹۹/۰۱/۰۴

form mahdi
در:
سلام استاد عزیز ، Bubble یا حباب دقیقا یعنی چی ؟ یعنی گسترده شدن رویداد یک عنصر تا عنصر فرزندش؟
۱۰:۴۱:۵۴ ۱۳۹۹/۰۱/۰۴

form D.A.Y.A.N.A
در:
سلام یه سوال داشتم وقتی که میخوام وب رو تو موتورهای جست و جو قرار بدیم اون که کد به ما...
۱۴:۵۳:۲۶ ۱۳۹۹/۰۱/۰۳

form محمود
در:
سلام و احترام. خیلی عالی بود، بسیار متشکر هستم، تمام.
۱۲:۵۴:۲۳ ۱۳۹۹/۰۱/۰۳

form mimi
در:
سلام. روی میهن بلاگ وبلاگ دارم و قالبش رو خودم تهیه کردم. چند ماهه که قالب وبلاگ همینه. رفرنس کدهای css در یک سایت...
۱۰:۰۲:۱۳ ۱۳۹۹/۰۱/۰۳

form محمود
در:
سلام استاد گرامی قبلن از اینکه سایت بسیار پر بار ، عالی و بدرد بخور دارید به شما تبریک می گویم. من می...
۱۳:۰۸:۲۰ ۱۳۹۹/۰۱/۰۲

form mahdi
در:
سلام استاد ، یه سوالی داشتم ، من باید دونه دونه ایونت ها رو یاد بگیرم ؟ چون خیلیاشون رو دیدم که اصلا الکی هستن...
۲۰:۲۸:۱۴ ۱۳۹۹/۰۱/۰۱

form mahdi
در:
سلام استاد عزیز و گرامی و با معرفت ، سال نو رو تبریک میگم بهت امیدوارم خودت و خانوادت سالم و سلامت و همدل و...
۱۹:۴۶:۴۰ ۱۳۹۸/۱۲/۲۹

form Meysam
در:
با سلام میخواستم وقتی پست وبلاگ باز میشه بجای post130 بیاد عنوان پست تو لینک قرار بگیره یجوری میخوام باشه که وقتی پست تو...
۱۱:۴۲:۴۴ ۱۳۹۸/۱۲/۲۸
آگهی