آموزش ساخت پنل کاربری در php ثبت نام ، ورود ، فراموشی رمز عبور ، تایید ایمیل کاربر
آموزش ساخت پنل کاربری در php که شامل ثبت نام کاربر، ورود کاربر ، فراموشی رمز عبور، تایید کاربر بر اساس ایمیل است را با هم خواهیم ساخت .
این پروژه ی آموزشی شامل 8 بخش می باشد که به ترتیب :
1- ثبت نام کاربر با PHP و Mysql
2- تایید کاربر بر اساس ایمیل با PHP و Mysql
3- فرم لاگین (login) کاربر با PHP و Mysql
4- ساخت صفحه پروفایل کاربر و ویرایش آن با PHP و Mysql
5- دریافت گراواتار کاربر با PHP
6- گزارش گیری کاربران با PHP و Mysql
7- ساخت سیستم بازیابی رمزعبور کاربر با PHP و Mysql
8- کدنویسی خروج از حساب کاربری (Log-out) در PHP
برای درک بهتر می توانید لینک دانلود پروژه کامل پنل کاربری را دریافت کنید .
دقت داشته باشید که برای استفاده از حداکثر کارایی برنامه با PHP 7 + اجرا کرده و بر روی هاست و دامنه اجرا شود تا برای ارسال ایمیل با مشکل مواجه نشوید .
0- محدودیت دسترسی کاربران
در ابتدا 2 حالت وجود دارد
حالت اول کاربر وارد حساب کاربری خود شده باشد files_can_load_in_login
حالت دوم کاربر به صورت میهمان وارد files_can_load_in_guest
صفحات را با استفاده از action که در url داده می شود بارگذاری می کنیم
همچنین باید برای اولین که برنامه بارگذاری می شود table های مورد نظر را وارد دیتابیس کند از طریق فایل install.php
2 جدول وجود دارد :
1- users
2- user_token
users برای کاربران و مشخصات است و user_token برای token هایی که برای کاربر ساخته می شود .
define("DSPR", DIRECTORY_SEPARATOR); define("ABSPATH", __DIR__ . DIRECTORY_SEPARATOR); define("HTTP_ROOT", "http://{$_SERVER['SERVER_NAME']}"); define("WEBSITE_NAME" , str_replace(["http://" , "https://"] , "" , HTTP_ROOT)); require_once ABSPATH . "inc" . DSPR . "class-loader.php"; $db = new DB(); $file_list = scandir(ABSPATH); if (in_array("install.php", $file_list)) { require_once ABSPATH . "install.php"; header("Refresh: 1"); exit(); } date_default_timezone_set("Asia/Tehran"); $file_to_action = $_GET['action'] ?? "login"; $file_to_action .= ".php"; $all_files_can_load = ["view-profile.php", "list-users.php", "expire.php", "edit-profile.php", "forgot-password.php", "login.php", "signup.php", "verify.php", "new-password.php"]; $files_can_load_in_guest = ["forgot-password.php", "login.php", "signup.php", "verify.php", "new-password.php" , "view-profile.php"]; $files_can_load_in_login = [ "edit-profile.php", "expire.php", "list-users.php", "view-profile.php" ]; $is_logged_in = UserVerify::verify_user_by_session(); $files_can_load = $is_logged_in ? $files_can_load_in_login : $files_can_load_in_guest; if (in_array($file_to_action, $files_can_load)) require_once $file_to_action; elseif (in_array($file_to_action, $all_files_can_load)) { $direct_to = HTTP_ROOT; if ($is_logged_in) $direct_to = "{$direct_to}?action=view-profile"; else $direct_to = "{$direct_to}?action=login"; header("Location: {$direct_to}"); } else { header("HTTP/1.0 404 Not Found"); echo "404"; }
1- ثبت نام کاربر با PHP و Mysql
public static function handler_signup() { $post_data = array_filter($_POST); if (4 <= count($post_data)) { # Validation $validate_fullname = Helper::validate_fullname($post_data['fullname']); $validate_email = filter_var($post_data['email'], FILTER_VALIDATE_EMAIL); $validate_username = preg_match("/^[a-zA-Z0-9]+([_.]?[a-zA-Z0-9])*$/", $post_data['username']); $is_valid = Helper::validate_password($post_data['password']); if (!$validate_fullname['is_valid']) $msg = "نام کامل معتبر نمی باشد"; else if (!$validate_email) $msg = "ایمیل معتبر نمی باشد"; else if (!$validate_username) $msg = "نام کاربری معتبر نمی باشد"; else if ($post_data['password'] !== $post_data['re-password']) $msg = "رمزعبور وارد شده یکی نیست !"; else if (!$is_valid) $msg = "رمزعبور معتبر نمی باشد"; # check is username or email exist $post_data['username'] = strtolower($post_data['username']); $post_data['email'] = strtolower($post_data['email']); $is_username_exist = $GLOBALS['db']->row_exist(["table" => "users", "content" => "username=?", "types" => "s", "values" => [$post_data['username']]]); $is_email_exist = $GLOBALS['db']->row_exist(["table" => "users", "content" => "email=?", "types" => "s", "values" => [$post_data['email']]]); if ($is_email_exist) $msg = "این ایمیل از قبل انتخاب شده"; else if ($is_username_exist) $msg = "این نام کاربری از قبل انتخاب شده"; if (!empty($msg)) { $_GET['msg'] = $msg; return $post_data; } } else { if (empty($_GET['msg'])) { $_GET['msg'] = 'تمامی فیلد ها اجباری است !'; return $post_data; } } $current_timestamp = time(); $post_data['password'] = password_hash($post_data['password'], PASSWORD_BCRYPT); $inserted_id = $GLOBALS['db']->row_insert(["table" => "users", "content" => "(username , email , password , fullname , time_created , time_updated) VALUES (? , ? , ? , ? , ? , ?)", "types" => "ssssss", "values" => [$post_data['username'], $post_data['email'], $post_data['password'], $validate_fullname['validated'], $current_timestamp, '']]); if ($inserted_id) { $direct_to = HTTP_ROOT . "?action=verify&type=acc&username={$post_data['username']}"; header("Location: {$direct_to}"); } else $_GET['msg'] = 'خطا در ارتباط'; return $post_data; }
در ابتدا ورودی های کاربر را اعتبار سنجی می کنیم و سپس در صورت که معتبر نبود پیغام مرتبط با آن را نمایش می دهیم در غیر اینصورت ادامه روند .
در قدم بعدی 2 ورودی کاربر یعنی ایمیل و نام کاربری که منحصر به فرد است را بررسی می کنیم در صورت که در پایگاه داده مان وجود داشت پیغام ایمیل یا نام کاربری از قبل وجود داشته را نمایش می دهیم .
در صورتی که بخش نهایی یعنی وارد کردن اطلاعات کاربر به دیتابیس رسید یعنی کاربر می تواند به راحتی ثبت نام کند و آن را به صفحه تایید ایمیل دایرکت می کنیم .
2- تایید کاربر بر اساس ایمیل با PHP و Mysql
public static function handler_verify_acc($get_data) { global $current_timestamp, $expire_timestamp; $is_username_confirmed = $GLOBALS['db']->row_exist(["table" => "users", "content" => "username=? AND verified=?", "types" => "ss", "values" => [$get_data['username'], 1]]); if (!$is_username_confirmed) { $acc_token = $get_data['token'] ?? false; // user visit auth page if (!empty($acc_token)) { $is_token_valid = $GLOBALS['db']->row_exist(["table" => "user_token", "content" => "username=? AND type=? AND ?<time_expire and="" checked="?" token="?"," "types"=""> "sssss", "values" => [$get_data['username'], $get_data['type'], $current_timestamp, 0, $acc_token]]); if ($is_token_valid) { $GLOBALS['db']->row_update(["table" => "user_token", "content" => "checked=? WHERE token=?", "types" => "ss", "values" => [1, $acc_token]]); $GLOBALS['db']->row_update(["table" => "users", "content" => "verified=? , time_updated=? WHERE username=?", "types" => "sss", "values" => [1, $current_timestamp, $get_data['username']]]); global $description_verify; $description_verify = ["title" => "فعال", "description" => "حساب کاربری تان با موفقیت فعال شد (:"]; } else $_GET['msg'] = 'توکن داده شده معتبر نیست'; return $get_data; } $is_token_generated = $GLOBALS['db']->row_exist(["table" => "user_token", "content" => "username=? AND type=? AND ?<time_expire and="" checked="?" limit="" 1",="" "types"=""> "ssss", "values" => [$get_data['username'], $get_data['type'], $current_timestamp, 0]]); $user_db_data = Helper::select_user_by_uname($get_data['username']); $user_db_data = $user_db_data[0]; if (!$is_token_generated) UserVerify::verify_data_to_send($user_db_data, $get_data['username'], $get_data['type'], $current_timestamp, $expire_timestamp, "تایید حساب کاربری در رپید کد"); } else $_GET['msg'] = "حساب کاربری تان از قبل تایید شده است"; return $user_db_data ?? false; }
ابتدا بررسی می کنیم که آیا کاربر از طریق لینکی که به ایمیل آن ارسال شده آمده ، که اگر اینطور بود token آن را بررسی کند دقت داشته باشید که توکن داده شده تا 1 ساعت معتبر است .
در صورتی که کاربر به تازگی از صفحه sign up هدایت شده بررسی می کنیم از قبل توکن معتبر برای آن ساخت شده یا خیر ، در صورتی که وجود داشت آن را به ایمیل ارسال می کنیم در صورت که وجود نداشته یکی ساخت و ارسال می کنیم .
3- فرم لاگین (login) کاربر با PHP و Mysql
public static function handler_login() { $post_data = array_filter($_POST); if (!empty($post_data['username']) && !empty($post_data['password'])) { $remember_check = !empty($post_data['remember']) && $post_data['remember'] === "yes" ? true : false; $user_db_data = Helper::select_user_by_uname($post_data['username']); $user_db_data = $user_db_data ? $user_db_data : Helper::select_user_by_email($post_data['username']); if ($user_db_data) { $user_db_data = $user_db_data[0]; $user_valid = password_verify($post_data['password'], $user_db_data['password']); if ($user_valid) { $is_user_confirmed = boolval($user_db_data['verified']); if ($is_user_confirmed) { $current_timestamp = time(); $expire_timestamp = null; $days = 90; $username = $user_db_data['username']; if ($remember_check) $expire_timestamp = $current_timestamp + 86400 * $days; $token_db = $GLOBALS['db']->row_select(["table" => "user_token", "content" => "type=? AND ?<time_expire AND username=? LIMIT 1", "types" => "sss", "values" => ['user_session', $current_timestamp, $username]]); $session_token = false; if ($token_db) { $session_token = $token_db[0]['token']; } else { $session_token = UserVerify::set_user_session_db($username,$current_timestamp, $expire_timestamp, $days); } $user_token = ["username" => $username, "session_token" => $session_token , "expire" => $expire_timestamp]; $user_token = json_encode($user_token); UserVerify::set_user_session($user_token, $expire_timestamp); $direct_to = HTTP_ROOT . "?action=view-profile"; header("Location: {$direct_to}"); } else { $_GET['msg'] = "حساب کاربری ثبت گردیده اما تایید نشده برای تایید می توانید از فراموشی رمزعبور استفاده کنید"; } } else $_GET['msg'] = "نام کاربری یا رمزعبور صحیح نمی باشد"; } else $_GET['msg'] = "نام کاربری یا رمزعبور صحیح نمی باشد"; } else if (!empty($post_data['test'])) { $_GET['msg'] = "نام کاربری یا رمزعبور وارد نشده"; } }
ابتدا کاربر را با استفاده از email یا username در دیتابیس جستجو می کنیم در صورتی که یافت شد رمز ورود آن را بررسی می کنیم اگر صحیح بود ادامه روند .
بعد از آن می رسیم به این که آیا کاربر ایمیل خود را تایید کرده است یا خیر در صورتی که تایید کرده بود یک session با مدت اعتبار 90 روز برای کاربر در دیتابیس می سازیم .
همچنین اگر کاربر تیک “مرا به خاطر بسپار” را زده بود کوکی را تا 90 روز تایید می کنیم در غیر اینصورت به صورت session آن می سازیم که در صورت بسته شدن مرورگر پاک شود .
دقت داشته باشید که در هر بار بارگذاری صفحه کوکی های کاربر که شامل session_token می باشد را در فایل index.php با کمک متود UserVerify::verify_user_by_session بررسی می کنیم .
4- ساخت صفحه پروفایل کاربر و ویرایش آن با PHP و Mysql به همراه 5- دریافت گراواتار کاربر با PHP
پروفایل کاربر
public static function handler_view_profile() { $user_data = ['date_register' => '', 'fullname' => '', 'username' => '', 'email' => '', 'is_user_profile' => false]; if (isset($_GET['uname'])) { $uname = $_GET['uname']; } else if (!empty($GLOBALS['temp_user_data'])) { $user_tmp = $GLOBALS['temp_user_data']; $uname = $user_tmp['uname']; $user_data['is_user_profile'] = true; } else { $_GET['msg'] = "کاربر داده شده معتبر نیست"; return false; } $user_db_data = Helper::select_user_by_uname($uname); if ($user_db_data) { $user_db_data = $user_db_data[0]; $user_data['date_register'] = date("Y/m/d | H:i:s", intval($user_db_data['time_created'])); $user_data['fullname'] = $user_db_data['fullname']; $user_data['username'] = $user_db_data['username']; $user_data['email'] = $user_db_data['email']; } else { $_GET['msg'] = "کاربر مورد نظر یافت نشد"; return false; } return $user_data; }
پروفایل کاربر شامل 3 بخش است :
1- نام کاربری
2- نام کامل
3- تاریخ ثبت نام
از خط 5 تا 14 : uname همان username به صورت مختصر است .
در شرط اول بررسی می کنیم که آیا نام کاربری از طریق query string به نام uname داده شده است .
در شرط دوم بررسی می کنیم که آیا uname از طریق cookie های کاربر وارد شده اگر شرط true بود is_user_profile را true می دهیم تا لینک ویرایش و خروج از حساب را فعال کنیم .
آخرین شرط در صورتی که uname دریافت نکردیم پیغام خطای مورد نظر را چاپ می کنیم .
نام کاربری را در دیتابیس جستجو کرده و در صورتی که یافت شده تاریخ ثبت نام را با فرمت دلخواه باسازی می کنیم در غیر اینصورت پیغام کاربر مورد نظر یافت نشد را می دهیم .
پیدا کردن گراواتار کاربر بر اساس ایمیل
آموزش ساخت پنل کاربری در php
$user_email_hash = md5(strtolower(trim($user_data['email']))); $user_gravatar = "https://secure.gravatar.com/avatar/{$user_email_hash}?s=80&d=mm";
user_email_hash همان ایمیل کاربر است که که هش شده و با استفاده از secure.gravatar.com/avatar آن را دریافت می کنیم .
s? اندازه تصویر است و d در صورتی که تصویر یافت نشد پیشفرض چه تصویری برگرداند
ویرایش پروفایل کاربر
شامل 4 بخش است :
1- نام کامل
2- رمز فعلی
3- رمز جدید
4- تکرار رمز جدید
در صورتی که یکی از 3 رمزعبور پر شود باید رمز فعلی صحیح باشد و رمز جدید و تکرار آن معتبر و مطابق هم باشد .
public static function handler_edit_profile() { $username = $GLOBALS['temp_user_data']['uname']; $expire_timestamp_session = $GLOBALS['temp_user_data']['expire']; $user_db_data = $GLOBALS['db']->row_select(["table" => "users", "content" => "username=? LIMIT 1", "types" => "s", "values" => [$username]]); $user_db_data = $user_db_data[0]; $password = $user_db_data['password']; $fullname = $user_db_data['fullname']; $post_data = $_POST; $prefix_msg = "عدم بروزرسانی اطلاعات : "; $msg = ""; $password_changed = false; if (!empty($post_data['fullname'])) { $validate_fullname = Helper::validate_fullname($post_data['fullname']); if (!empty($post_data['password']) || !empty($post_data['new-password']) || !empty($post_data['re-new-password'])) $password_changed = true; if (!$validate_fullname['is_valid']) $msg = "نام کامل معتبر نیست"; elseif ($password_changed && (empty($post_data['password']) || empty($post_data['new-password']) || empty($post_data['re-new-password']))) $msg = "هر 3 ورودی رمز را کامل وارد کنید"; elseif ($password_changed && !password_verify($post_data['password'], $password)) $msg = "رمز فعلی صحیح نمی باشد"; elseif ($password_changed && $post_data['new-password'] !== $post_data['re-new-password']) $msg = "رمزعبور جدید با تکرار آن همخوانی ندارد"; elseif ($password_changed && !Helper::validate_password($post_data['new-password'])) $msg = "رمزعبور جدید معتبر نیست"; else { $current_timestamp = time(); if ($password_changed) { $password = password_hash($post_data['new-password'], PASSWORD_BCRYPT); $expire_timestamp_session = is_null($expire_timestamp_session) ? null : $expire_timestamp_session; $db_days = 90; Helper::invalid_session_token_db($username); $session_token = UserVerify::set_user_session_db($GLOBALS['temp_user_data']['uname'],$current_timestamp, $current_timestamp + 86400 * $db_days , $db_days); $user_token = ["username" => $username, "session_token" => $session_token , "expire"=> $expire_timestamp_session]; $user_token = json_encode($user_token); UserVerify::set_user_session($user_token, $expire_timestamp_session); } $fullname = $validate_fullname['validated']; $GLOBALS['db']->row_update(["table" => "users", "content" => "fullname=? , password=? , time_updated=? WHERE username=?", "types" => "ssss", "values" => [$fullname, $password, $current_timestamp, $username]]); $prefix_msg = "موفق : "; $msg = "تغییرات با موفقیت اعمال شد"; } } else $msg = "نام کامل خالی است"; if ($msg && !empty($post_data['test'])) $_GET['msg'] = $prefix_msg . $msg; return $fullname; }
در صورتی که رمز عبور جدید ثبت گردید session قبلی کاربر را نامعتبر و یک session جدید می سازد .
6- گزارش گیری کاربران با PHP و Mysql
public static function handler_list_users() { $list_users = []; if (isset($GLOBALS['temp_user_data'])) { $users = $GLOBALS['db']->row_select(["table" => "users", "content" => "1=? ORDER BY `id` ASC", "types" => "s", "values" => [1]]); foreach ($users as $user) { $list_users[] = $user; } } else $_GET['msg'] = "برای مشاهده کاربران وارد شوید"; return $list_users; }
آموزش ساخت پنل کاربری در php
7- ساخت سیستم بازیابی رمزعبور کاربر با PHP و Mysql
public static function handler_verify_acc_reset($get_data) { global $current_timestamp, $expire_timestamp; $acc_reset_token = $get_data['token'] ?? false; if (!empty($acc_reset_token)) { $is_token_valid = $GLOBALS['db']->row_exist(["table" => "user_token", "content" => "username=? AND type=? AND ?<time_expire AND checked=? AND token=?", "types" => "sssss", "values" => [$get_data['username'], $get_data['type'], $current_timestamp, 0, $acc_reset_token]]); if ($is_token_valid) { $GLOBALS['db']->row_update(["table" => "user_token", "content" => "checked=? WHERE token=?", "types" => "ss", "values" => [1, $acc_reset_token]]); $user_db_data = Helper::select_user_by_uname($get_data['username']); $user_email = $user_db_data[0]['email']; $token = UserVerify::generate_token($user_email, $current_timestamp); $expire_timestamp = $current_timestamp + 300; $GLOBALS['db']->row_insert(["table" => "user_token", "content" => "(type , username , token , time_created , time_expire , time_sent) VALUES (? , ? , ? , ? , ? , ?)", "types" => "ssssss", "values" => ['npwd', $get_data['username'], $token, $current_timestamp, $expire_timestamp, $current_timestamp]]); $direct_to = HTTP_ROOT . "?action=new-password&token={$token}"; header("Location: {$direct_to}"); } else $_GET['msg'] = 'توکن داده شده معتبر نیست'; return $get_data; } $is_token_generated = $GLOBALS['db']->row_exist(["table" => "user_token", "content" => "username=? AND type=? AND ?<time_expire AND checked=? LIMIT 1", "types" => "ssss", "values" => [$get_data['username'], $get_data['type'], $current_timestamp, 0]]); $user_db_data = Helper::select_user_by_uname($get_data['username']); $user_db_data = $user_db_data[0]; if (!$is_token_generated) UserVerify::verify_data_to_send($user_db_data, $get_data['username'], $get_data['type'], $current_timestamp, $expire_timestamp, "بازگردانی رمزعبور در رپید کد"); else { $token_db = $GLOBALS['db']->row_select(["table" => "user_token", "content" => "username=? AND type=? AND ?<time_expire AND checked=? LIMIT 1", "types" => "ssss", "values" => [$get_data['username'], $get_data['type'], $current_timestamp, 0]]); $token = $token_db[0]; $temp_next_request = intval($token['time_sent']); $next_request = $current_timestamp - $temp_next_request; $time_per_request = 1200; if ($next_request < $time_per_request) { $temp_next_request = $temp_next_request + $time_per_request; $temp_next_request = date("H:i:s ⏺ Y/m/d", $temp_next_request); $_GET['msg'] = "امکان ارسال مجدد درخواست از {$temp_next_request} به بعد وجود دارد"; return; } $token = $token['token']; $GLOBALS['db']->row_update(["table" => "user_token", "content" => "time_sent=? WHERE token=?", "types" => "ss", "values" => [$current_timestamp, $token]]); $link = UserVerify::verify_link($get_data['username'], $get_data['type'], $token); UserVerify::send_mail(1, $get_data['type'], $user_db_data['email'], "بازگردانی رمزعبور در رپید کد", $user_db_data['fullname'], $link); } global $description_verify; $description_verify = ["title" => "تایید ایمیل", "description" => "جهت بازگردانی رمزعبور ایمیل خود را بررسی کنید ( لینک ارسال شده تا 1 ساعت معتبر است )"]; return $user_db_data ?? false; }
1- در ابتدا بررسی می کنیم که آیا کاربر با لینک داده شده به ایمیل به این صفحه میاد با استفاده از query string که برای token تعریف کردیم . در صورتی که معتبر بود یک token جدید با اعتبار 5 دقیقه ساخته و به فرم تغییر رمز جدید ارسال می کنیم ( کاربر 5 دقیقه وقت دارد تا رمز جدیدی انتخاب کند )
2- در صورتی که کاربر برای اولین درخواست بازگردانی رمز جدید می کند توکن برای آن ساخته و ارسال می شود.
3- اما اگر برای دومین بار کاربر درخواست بازگردانی رمز جدید می کند از آخرین ارسال ایمیل اگر 20 دقیقه گذشته بود مجدد لینک بازگردانی برای آن ایمیل شود در غیر اینصورت از زمان آخرین ارسال ایمیل باید 20 دقیقه بگذرد تا بتواند درخواست جدید ثبت کند .
8- کدنویسی خروج از حساب کاربری (Log-out) در PHP
public static function remove_auth_session() { setcookie('auth_token', '', time() - 3600); }
Helper::remove_auth_session(); $direct_to = HTTP_ROOT . "?action=login"; header("Location: {$direct_to}");
کوکی auth_token که برای اعتبارسنجی کاربر است را پاک کرده و به صفحه ورود ارجاع می دهیم .
قبل از استفاده وارد پوشه inc شده و فایل db.php را متناسب با سرور تان تنظیم کنید .
دانلود پروژه پنل کاربری حرفه ای در PHP
آموزش ساخت پنل کاربری در php
لیست نظرات
سلام مجدد یه سوال دیگه هم داشتم. این فرم های ثبت نام هستند که به صورت کلی یه سری اطلاعات زیاد میگیرند و درکنارش هم عکس کاربر میگیرند و در نهایت گوشه صفحه عکس کاربر هم نمایش داده میشه. این مدل فرم ها چطوری میشه زد؟ خیلی سرچ کردم ولی تیکه تیکه کدها بودند و واضح جایی نبود. شاید هم من درست سرچ نمیکردم.
سلام سوال جالبی بود به تا 2 الی 3 روز آینده این آموزش رو هم میذاریم . آپدیت : اینم آموزش
سلام وقت بخیر چطوری تاریخ تولد افراد رو به صورت فارسی میتونیم به فرم اضافه کنیم؟ ممنون
سلام این آموزش به کار میاد
سلام وقت بخیر خسته نباشید. من میخوام ثبت نام کاربران و new-password و forgot-password رو کلا بردارم به صورتی که فقط یک اکانت ادمین باشه در دیتابیس admin = 1 or admin = 0 که اون بتونه از پنل حساب بسازه، مسدود کنه و پاک کنه (دیدن لیست حساب ها و تغییر اطلاعاتشون) و میخوام وقتی کاربر عادی وارد شد فقط یک پیام سلام نشان داده بشه مثلا (خودم ویرایش میکنم بعدا)، و اینکه قضیه verified اگر 0 بود به جای اینکه بگه تایید کنید بگه حساب شما مسدود شده، یه قابلیت تیکت هم میخوام خیلی مهم نیست ولی باشه خوبه، اموزش این رو میتونید بزارید؟ چون واقعا نیاز دارم نمیدونم کجا بدم برام بسازن، اگر اموزشش رو بزارید ممنون میشم، تشکر بابت اموزش خوب
درود ، همین مورد کافیه که بخش های که نمی خواین رو مثل new-password فایل ش رو پاک کنید و لینک و slug که داخل سورس PHP هست رو بردارید در رابطه با سیستم تیکت بزودی در وبسایت قرار خواهد گرفت .
سلام خسته نباشید. الان من پروژه رو دانلود کردم چطوری روی زمپ قرارش بدم لطفا راهنماییم کنید خیلی واجبه💛
وارد پوشه xampp و سپس پوشه www شوید و پوشه جدید با نام web بسازید پروژه را در آن کپی کرده و وارد در مرورگر وارد آدرس : http://localhost/web شوید
ممنونم بابت پروژه خوبتون
ضمن سپاس و قدردانی از زحماتتان اینجانب نیز دقیقا سفارشی که به محمد فرموده بودید انجام دادم تیبل را تشکیل میدهد ولی بدون ذخیره نام کاربر به صفحه xammp میرود و سایت xammp را باز میکند
سلام بهتره که روی دامنه مجازی لوکال یا واقعی پروژه رو تست کنید .
ممنون از مینی پروژه خوب وکاملتون
سلام فایل install.php رو چطوری توی php my admin ایمپورت کنم؟
درود نیازی به این کار نیست کافیه که پوشه پروژه رو داخل www کپی کنید با نام panel یا هر نامی که دوست دارید و با مرورگر وارد : http://localhost/panel بشید .
سلام من توی سیستم میزنم ساخت حساب کاربری میره به صفحه localhostچیکار کنم ادرس signup.php که میدم وقتی وارد صفحه میشه همه جا سفیده
درود به پاسخی که به mohammad داده شد دقت کنید
سلام, من لیستی از غذاها را بصورت منو در سمت چپ دارم و در سمت راست یک مربع که خاصیت فیکس دارد. می خواهم وقتی که روی منوی غذاها کلیک می شود, جمع حساب آن در سمت راست روی کادر نمایش داده شود. اگر لطف کنید و من را راهنمایی کنید حد اقل سیصد هزار تومان و اگر راهنمایی جامع باشد؛ تا پانصد هزار تومان می پردازم. بسیار متشکرم. ایمیل من: parsa.*****beik@gmail.com
درود و احترام . کار زیاد سختی نیست کافی هست مقدار آیتم ها رو با query جمع آوری کرده و جمع نهایی بزنید .
عالییییییییییییییییییییییییییی
دیتابیس چی بسازیم
مطمئن شوید که از آخرین نسخه پی اچ پی استفاده می کنید و دیتابیس را هم نام با آموزش بسازید .
سلام چرا این کلا ارور میده
سلام در بعضی از خطوط از ?? استفاده شده که توسط php ناشناخته است. باید چه گاری انجام بدیم؟
مطمئن شوید که از آخرین نسخه پی اچ پی استفاده می کنید .
سلام.دوست عزیز امکان داره برام تو هاستم نصب کنید