यह उपयोगकर्ता खाता प्रबंधन प्रणाली, प्रमाणीकरण, भूमिकाओं, अनुमतियों पर एक श्रृंखला का दूसरा भाग है। आपको पहला भाग यहां मिल सकता है।
डेटाबेस कॉन्फ़िगरेशन
उपयोगकर्ता-खाते नामक एक MySQL डेटाबेस बनाएं। फिर अपने प्रोजेक्ट (उपयोगकर्ता-खाता फ़ोल्डर) के रूट फ़ोल्डर में, एक फ़ाइल बनाएं और इसे config.php कहें। इस फ़ाइल का उपयोग डेटाबेस चर को कॉन्फ़िगर करने के लिए किया जाएगा और फिर हमारे एप्लिकेशन को हमारे द्वारा अभी बनाए गए MySQL डेटाबेस से कनेक्ट करें।
config.php:
<?php
session_start(); // start session
// connect to database
$conn = new mysqli("localhost", "root", "", "user-accounts");
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// define global constants
define ('ROOT_PATH', realpath(dirname(__FILE__))); // path to the root folder
define ('INCLUDE_PATH', realpath(dirname(__FILE__) . '/includes' )); // Path to includes folder
define('BASE_URL', 'http://localhost/user-accounts/'); // the home url of the website
?>
हमने सत्र भी शुरू कर दिया है क्योंकि हमें बाद में लॉग इन उपयोगकर्ता जानकारी जैसे उपयोगकर्ता नाम को स्टोर करने के लिए इसका उपयोग करने की आवश्यकता होगी। फ़ाइल के अंत में, हम स्थिरांक को परिभाषित कर रहे हैं जो हमें फ़ाइल को बेहतर ढंग से संभालने में मदद करेगा।
हमारा एप्लिकेशन अब MySQL डेटाबेस से जुड़ा है। आइए एक फॉर्म बनाएं जो उपयोगकर्ता को अपना विवरण दर्ज करने और अपना खाता पंजीकृत करने की अनुमति देता है। प्रोजेक्ट के रूट फोल्डर में साइनअप.php फाइल बनाएं:
साइनअप.php:
<?php include('config.php'); ?>
<?php include(INCLUDE_PATH . '/logic/userSignup.php'); ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>UserAccounts - Sign up</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
<!-- Custom styles -->
<link rel="stylesheet" href="assets/css/style.css">
</head>
<body>
<?php include(INCLUDE_PATH . "/layouts/navbar.php") ?>
<div class="container">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<form class="form" action="signup.php" method="post" enctype="multipart/form-data">
<h2 class="text-center">Sign up</h2>
<hr>
<div class="form-group">
<label class="control-label">Username</label>
<input type="text" name="username" class="form-control">
</div>
<div class="form-group">
<label class="control-label">Email Address</label>
<input type="email" name="email" class="form-control">
</div>
<div class="form-group">
<label class="control-label">Password</label>
<input type="password" name="password" class="form-control">
</div>
<div class="form-group">
<label class="control-label">Password confirmation</label>
<input type="password" name="passwordConf" class="form-control">
</div>
<div class="form-group" style="text-align: center;">
<img src="http://via.placeholder.com/150x150" id="profile_img" style="height: 100px; border-radius: 50%" alt="">
<!-- hidden file input to trigger with JQuery -->
<input type="file" name="profile_picture" id="profile_input" value="" style="display: none;">
</div>
<div class="form-group">
<button type="submit" name="signup_btn" class="btn btn-success btn-block">Sign up</button>
</div>
<p>Aready have an account? <a href="login.php">Sign in</a></p>
</form>
</div>
</div>
</div>
<?php include(INCLUDE_PATH . "/layouts/footer.php") ?>
<script type="text/javascript" src="assets/js/display_profile_image.js"></script>
इस फ़ाइल में पहली पंक्ति में, हम पहले बनाई गई config.php फ़ाइल को शामिल कर रहे हैं क्योंकि हमें INCLUDE_PATH स्थिरांक का उपयोग करने की आवश्यकता होगी जो config.php हमारी साइनअप.php फ़ाइल के अंदर प्रदान करता है। इस INCLUDE_PATH स्थिरांक का उपयोग करते हुए, हम navbar.php, footer.php, और userSignup.php भी शामिल कर रहे हैं, जो किसी डेटाबेस में उपयोगकर्ता को पंजीकृत करने का तर्क रखता है। हम ये फ़ाइलें बहुत जल्द बनाएंगे।
फ़ाइल के अंत के पास, एक गोल फ़ील्ड है जहाँ उपयोगकर्ता प्रोफ़ाइल छवि अपलोड करने के लिए क्लिक कर सकता है। जब उपयोगकर्ता इस क्षेत्र पर क्लिक करता है और अपने कंप्यूटर से एक प्रोफ़ाइल छवि का चयन करता है, तो सबसे पहले इस छवि का पूर्वावलोकन प्रदर्शित होता है।
यह छवि पूर्वावलोकन jQuery के साथ हासिल किया गया है। जब उपयोगकर्ता अपलोड छवि बटन पर क्लिक करता है, तो हम JQuery का उपयोग करके फ़ाइल इनपुट फ़ील्ड को प्रोग्रामेटिक रूप से ट्रिगर करेंगे और यह उपयोगकर्ता की कंप्यूटर फ़ाइलों को उनके कंप्यूटर ब्राउज़ करने और उनकी प्रोफ़ाइल छवि चुनने के लिए लाता है। जब वे छवि का चयन करते हैं, तो हम अस्थायी रूप से छवि प्रदर्शित करने के लिए jQuery अभी भी का उपयोग करते हैं। ऐसा करने वाला कोड हमारी display_profile_image.php फ़ाइल में पाया जाता है जिसे हम जल्द ही बनाएंगे।
अभी ब्राउज़र पर न देखें। आइए पहले इस फाइल को वह दें जो हम पर बकाया है। अभी के लिए, एसेट/सीएसएस फोल्डर के अंदर, स्टाइल.सीएसएस फाइल बनाते हैं जिसे हमने हेड सेक्शन में लिंक किया है।
style.css:
@import url('https://fonts.googleapis.com/css?family=Lora');
* { font-family: 'Lora', serif; font-size: 1.04em; }
span.help-block { font-size: .7em; }
form label { font-weight: normal; }
.success_msg { color: '#218823'; }
.form { border-radius: 5px; border: 1px solid #d1d1d1; padding: 0px 10px 0px 10px; margin-bottom: 50px; }
#image_display { height: 90px; width: 80px; float: right; margin-right: 10px; }
इस फ़ाइल की पहली पंक्ति में, हम 'लोरा' नाम का एक Google फ़ॉन्ट आयात कर रहे हैं ताकि हमारे ऐप में अधिक सुंदर फ़ॉन्ट हो।
इस साइनअप.php में हमें जो अगली फ़ाइल चाहिए, वह है navbar.php और footer.php फ़ाइलें। इन दो फ़ाइलों को अंदर शामिल/लेआउट फ़ोल्डर बनाएं:
navbar.php:
<div class="container"> <!-- The closing container div is found in the footer -->
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">UserAccounts</a>
</div>
<ul class="nav navbar-nav navbar-right">
<li><a href="<?php echo BASE_URL . 'signup.php' ?>"><span class="glyphicon glyphicon-user"></span> Sign Up</a></li>
<li><a href="<?php echo BASE_URL . 'login.php' ?>"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
</ul>
</div>
</nav>
footer.php:
<!-- JQuery -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!-- Bootstrap JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</div> <!-- closing container div -->
</body>
</html>
साइनअप.php फ़ाइल की अंतिम पंक्ति डिस्प्ले_प्रोफाइल_इमेज.जेएस नामक एक JQuery स्क्रिप्ट से लिंक होती है और यह वही करती है जो उसका नाम कहता है। इस फ़ाइल को एसेट/जेएस फ़ोल्डर के अंदर बनाएं और इस कोड को इसके अंदर पेस्ट करें:
display_profile_image.js:
$(document).ready(function(){
// when user clicks on the upload profile image button ...
$(document).on('click', '#profile_img', function(){
// ...use Jquery to click on the hidden file input field
$('#profile_input').click();
// a 'change' event occurs when user selects image from the system.
// when that happens, grab the image and display it
$(document).on('change', '#profile_input', function(){
// grab the file
var file = $('#profile_input')[0].files[0];
if (file) {
var reader = new FileReader();
reader.onload = function (e) {
// set the value of the input for profile picture
$('#profile_input').attr('value', file.name);
// display the image
$('#profile_img').attr('src', e.target.result);
};
reader.readAsDataURL(file);
}
});
});
});
और अंत में, userSignup.php फ़ाइल। यह फ़ाइल वह जगह है जहां डेटाबेस में प्रसंस्करण और सहेजने के लिए साइनअप फ़ॉर्म डेटा सबमिट किया जाता है। शामिल/तर्क फ़ोल्डर के अंदर userSignup.php बनाएं और इस कोड को उसके अंदर पेस्ट करें:
userSignup.php:
<?php include(INCLUDE_PATH . "/logic/common_functions.php"); ?>
<?php
// variable declaration
$username = "";
$email = "";
$errors = [];
// SIGN UP USER
if (isset($_POST['signup_btn'])) {
// validate form values
$errors = validateUser($_POST, ['signup_btn']);
// receive all input values from the form. No need to escape... bind_param takes care of escaping
$username = $_POST['username'];
$email = $_POST['email'];
$password = password_hash($_POST['password'], PASSWORD_DEFAULT); //encrypt the password before saving in the database
$profile_picture = uploadProfilePicture();
$created_at = date('Y-m-d H:i:s');
// if no errors, proceed with signup
if (count($errors) === 0) {
// insert user into database
$query = "INSERT INTO users SET username=?, email=?, password=?, profile_picture=?, created_at=?";
$stmt = $conn->prepare($query);
$stmt->bind_param('sssss', $username, $email, $password, $profile_picture, $created_at);
$result = $stmt->execute();
if ($result) {
$user_id = $stmt->insert_id;
$stmt->close();
loginById($user_id); // log user in
} else {
$_SESSION['error_msg'] = "Database error: Could not register user";
}
}
}
मैंने इस फाइल को आखिरी के लिए सहेजा था क्योंकि इसमें और काम था। पहली बात यह है कि हम इस फ़ाइल के शीर्ष पर एक और फ़ाइल शामिल कर रहे हैं जिसका नाम common_functions.php है। हम इस फ़ाइल को इसलिए शामिल कर रहे हैं क्योंकि हम इससे आने वाली दो विधियों का उपयोग कर रहे हैं:वेलिडेटयूज़र () और लॉगिनबायआईड () जिसे हम जल्द ही बनाएंगे।
अपने शामिल/तर्क फ़ोल्डर में यह common_functions.php फ़ाइल बनाएं:
common_functions.php:
<?php
// Accept a user ID and returns true if user is admin and false if otherwise
function isAdmin($user_id) {
global $conn;
$sql = "SELECT * FROM users WHERE id=? AND role_id IS NOT NULL LIMIT 1";
$user = getSingleRecord($sql, 'i', [$user_id]); // get single user from database
if (!empty($user)) {
return true;
} else {
return false;
}
}
function loginById($user_id) {
global $conn;
$sql = "SELECT u.id, u.role_id, u.username, r.name as role FROM users u LEFT JOIN roles r ON u.role_id=r.id WHERE u.id=? LIMIT 1";
$user = getSingleRecord($sql, 'i', [$user_id]);
if (!empty($user)) {
// put logged in user into session array
$_SESSION['user'] = $user;
$_SESSION['success_msg'] = "You are now logged in";
// if user is admin, redirect to dashboard, otherwise to homepage
if (isAdmin($user_id)) {
$permissionsSql = "SELECT p.name as permission_name FROM permissions as p
JOIN permission_role as pr ON p.id=pr.permission_id
WHERE pr.role_id=?";
$userPermissions = getMultipleRecords($permissionsSql, "i", [$user['role_id']]);
$_SESSION['userPermissions'] = $userPermissions;
header('location: ' . BASE_URL . 'admin/dashboard.php');
} else {
header('location: ' . BASE_URL . 'index.php');
}
exit(0);
}
}
// Accept a user object, validates user and return an array with the error messages
function validateUser($user, $ignoreFields) {
global $conn;
$errors = [];
// password confirmation
if (isset($user['passwordConf']) && ($user['password'] !== $user['passwordConf'])) {
$errors['passwordConf'] = "The two passwords do not match";
}
// if passwordOld was sent, then verify old password
if (isset($user['passwordOld']) && isset($user['user_id'])) {
$sql = "SELECT * FROM users WHERE id=? LIMIT 1";
$oldUser = getSingleRecord($sql, 'i', [$user['user_id']]);
$prevPasswordHash = $oldUser['password'];
if (!password_verify($user['passwordOld'], $prevPasswordHash)) {
$errors['passwordOld'] = "The old password does not match";
}
}
// the email should be unique for each user for cases where we are saving admin user or signing up new user
if (in_array('save_user', $ignoreFields) || in_array('signup_btn', $ignoreFields)) {
$sql = "SELECT * FROM users WHERE email=? OR username=? LIMIT 1";
$oldUser = getSingleRecord($sql, 'ss', [$user['email'], $user['username']]);
if (!empty($oldUser['email']) && $oldUser['email'] === $user['email']) { // if user exists
$errors['email'] = "Email already exists";
}
if (!empty($oldUser['username']) && $oldUser['username'] === $user['username']) { // if user exists
$errors['username'] = "Username already exists";
}
}
// required validation
foreach ($user as $key => $value) {
if (in_array($key, $ignoreFields)) {
continue;
}
if (empty($user[$key])) {
$errors[$key] = "This field is required";
}
}
return $errors;
}
// upload's user profile profile picture and returns the name of the file
function uploadProfilePicture()
{
// if file was sent from signup form ...
if (!empty($_FILES) && !empty($_FILES['profile_picture']['name'])) {
// Get image name
$profile_picture = date("Y.m.d") . $_FILES['profile_picture']['name'];
// define Where image will be stored
$target = ROOT_PATH . "/assets/images/" . $profile_picture;
// upload image to folder
if (move_uploaded_file($_FILES['profile_picture']['tmp_name'], $target)) {
return $profile_picture;
exit();
}else{
echo "Failed to upload image";
}
}
}
मैं इस फाइल के 2 महत्वपूर्ण कार्यों की ओर आपका ध्यान आकर्षित करता हूं। वे हैं:getSingleRecord() और getMultipleRecords()। ये फ़ंक्शन बहुत महत्वपूर्ण हैं क्योंकि हमारे पूरे एप्लिकेशन में कहीं भी, जब हम डेटाबेस से एक रिकॉर्ड का चयन करना चाहते हैं, तो हम केवल getSingleRecord() फ़ंक्शन को कॉल करेंगे और इसमें SQL क्वेरी पास करेंगे। यदि हम एकाधिक रिकॉर्ड का चयन करना चाहते हैं, तो आपने अनुमान लगाया है, हम उचित SQL क्वेरी पास करने के साथ बस getMultipleRecords() फ़ंक्शन को भी कॉल करेंगे।
ये दो फ़ंक्शन 3 पैरामीटर लेते हैं, जैसे कि SQL क्वेरी, चर प्रकार (उदाहरण के लिए, 's' का अर्थ है स्ट्रिंग, 'si' का अर्थ स्ट्रिंग और पूर्णांक, और इसी तरह) और अंत में एक तीसरा पैरामीटर जो सभी मानों की एक सरणी है। निष्पादित करने के लिए क्वेरी की आवश्यकता है।
<ब्लॉकक्वॉट>उदाहरण के लिए, यदि मैं उपयोगकर्ता तालिका से चयन करना चाहता हूं जहां उपयोगकर्ता नाम 'जॉन' है और उम्र 24 है, तो मैं अपनी क्वेरी इस तरह लिखूंगा:
$sql = SELECT * FROM users WHERE username=John AND age=20; // this is the query
$user = getSingleRecord($sql, 'si', ['John', 20]); // perform database query
फ़ंक्शन कॉल में, 's' स्ट्रिंग प्रकार का प्रतिनिधित्व करता है (चूंकि उपयोगकर्ता नाम 'जॉन' एक स्ट्रिंग है) और 'i' का अर्थ पूर्णांक है (आयु 20 एक पूर्णांक है)। यह फ़ंक्शन हमारे काम को बेहद आसान बनाता है क्योंकि अगर हम अपने आवेदन में सौ अलग-अलग स्थानों पर डेटाबेस क्वेरी करना चाहते हैं, तो हमें केवल इन दो पंक्तियों की आवश्यकता नहीं होगी। प्रत्येक फ़ंक्शन में कोड की लगभग 8 - 10 पंक्तियाँ होती हैं इसलिए हम कोड को दोहराने से बच जाते हैं। आइए इन विधियों को एक बार में लागू करें।
config.php फ़ाइल को हर उस फ़ाइल में शामिल किया जाएगा जहाँ डेटाबेस क्वेरीज़ की जाती हैं क्योंकि इसमें डेटाबेस कॉन्फ़िगरेशन है। तो इन तरीकों को परिभाषित करने के लिए यह सही जगह है। config.php को एक बार फिर से खोलें और इन विधियों को फ़ाइल के अंत में जोड़ें:
config.php:
// ...More code here ...
function getMultipleRecords($sql, $types = null, $params = []) {
global $conn;
$stmt = $conn->prepare($sql);
if (!empty($params) && !empty($params)) { // parameters must exist before you call bind_param() method
$stmt->bind_param($types, ...$params);
}
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_all(MYSQLI_ASSOC);
$stmt->close();
return $user;
}
function getSingleRecord($sql, $types, $params) {
global $conn;
$stmt = $conn->prepare($sql);
$stmt->bind_param($types, ...$params);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
$stmt->close();
return $user;
}
function modifyRecord($sql, $types, $params) {
global $conn;
$stmt = $conn->prepare($sql);
$stmt->bind_param($types, ...$params);
$result = $stmt->execute();
$stmt->close();
return $result;
}
हम तैयार बयानों का उपयोग कर रहे हैं और सुरक्षा कारणों से यह महत्वपूर्ण है।
अब वापस हमारे common_functions.php फाइल पर फिर से। इस फ़ाइल में 4 महत्वपूर्ण कार्य हैं जिनका उपयोग बाद में कई अन्य फ़ाइलों द्वारा किया जाएगा।
जब उपयोगकर्ता पंजीकरण करता है, तो हम यह सुनिश्चित करना चाहते हैं कि उन्होंने सही डेटा प्रदान किया है, इसलिए हम ValidateUser() फ़ंक्शन को कॉल करते हैं, जिसे यह फ़ाइल प्रदान करती है। अगर कोई प्रोफ़ाइल छवि चुनी गई थी, तो हम इसे अपलोडप्रोफाइल पिक्चर () फ़ंक्शन को कॉल करके अपलोड करते हैं, जिसे यह फ़ाइल प्रदान करती है।
यदि हम डेटाबेस में उपयोगकर्ता को सफलतापूर्वक सहेजते हैं तो हम उन्हें तुरंत लॉग इन करना चाहते हैं, इसलिए हम लॉगिनबायआईडी () फ़ंक्शन को कॉल करते हैं, जो यह फ़ाइल प्रदान करता है। जब कोई उपयोगकर्ता लॉग इन करता है, तो हम जानना चाहते हैं कि वे व्यवस्थापक हैं या सामान्य, इसलिए हम isAdmin() फ़ंक्शन को कॉल करते हैं, जिसे यह फ़ाइल प्रदान करती है। यदि हम पाते हैं कि वे व्यवस्थापक हैं (यदि isAdmin() सत्य लौटाता है), तो हम उन्हें डैशबोर्ड पर पुनर्निर्देशित करते हैं। यदि सामान्य उपयोगकर्ता हैं, तो हम होमपेज पर रीडायरेक्ट करते हैं।
तो आप देख सकते हैं कि हमारी common_functions.php फ़ाइल बहुत महत्वपूर्ण है। हम इन सभी कार्यों का उपयोग तब करेंगे जब हम अपने व्यवस्थापक अनुभाग पर काम कर रहे होंगे जो हमारे काम को बहुत कम कर देता है और कोड की पुनरावृत्ति से बचता है।
उपयोगकर्ता को साइन अप करने के लिए सक्षम करने के लिए, उपयोगकर्ता तालिका बनाते हैं। लेकिन चूंकि उपयोगकर्ता तालिका भूमिका तालिका से संबंधित है, हम पहले भूमिका तालिका बनाएंगे।
भूमिका तालिका:
CREATE TABLE `roles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`description` text NOT NULL,
PRIMARY KEY (`id`)
)
उपयोगकर्ता तालिका:
CREATE TABLE `users`(
`id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`role_id` INT(11) DEFAULT NULL,
`username` VARCHAR(255) UNIQUE NOT NULL,
`email` VARCHAR(255) UNIQUE NOT NULL,
`password` VARCHAR(255) NOT NULL,
`profile_picture` VARCHAR(255) DEFAULT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
CONSTRAINT `users_ibfk_1` FOREIGN KEY(`role_id`) REFERENCES `roles`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION
)
उपयोगकर्ता तालिका कई-से-एक संबंध में भूमिका तालिका से संबंधित है। जब भूमिका तालिका से किसी भूमिका को हटा दिया जाता है, तो हम चाहते हैं कि उन सभी उपयोगकर्ताओं के पास पहले से वह भूमिका_आईडी उनकी विशेषता के रूप में हो, जिसका मान NULL पर सेट हो। इसका मतलब है कि उपयोगकर्ता अब व्यवस्थापक नहीं रहेगा।
यदि आप मैन्युअल रूप से तालिका बना रहे हैं, तो इस बाधा को जोड़ने के लिए अच्छा करें। यदि आप PHPMyAdmin का उपयोग कर रहे हैं, तो आप उपयोगकर्ता तालिका पर संरचना टैब पर क्लिक करके, फिर संबंध दृश्य तालिका पर क्लिक करके और अंत में इस फ़ॉर्म को इस तरह भरकर ऐसा कर सकते हैं:
इस बिंदु पर, हमारा सिस्टम उपयोगकर्ता को पंजीकरण करने की अनुमति देता है और फिर पंजीकरण के बाद, वे स्वचालित रूप से लॉग इन हो जाते हैं। लेकिन लॉग इन करने के बाद, जैसा कि लॉगिनबायआईडी () फ़ंक्शन में दिखाया गया है, उन्हें होम पेज (index.php) पर रीडायरेक्ट किया जाता है। चलिए वो पेज बनाते हैं। एप्लिकेशन के रूट में index.php नाम की एक फाइल बनाएं।
index.php:
<?php include("config.php") ?>
<?php include(INCLUDE_PATH . "/logic/common_functions.php"); ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>UserAccounts - Home</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
<!-- Custome styles -->
<link rel="stylesheet" href="static/css/style.css">
</head>
<body>
<?php include(INCLUDE_PATH . "/layouts/navbar.php") ?>
<?php include(INCLUDE_PATH . "/layouts/messages.php") ?>
<h1>Home page</h1>
<?php include(INCLUDE_PATH . "/layouts/footer.php") ?>
अब अपना ब्राउज़र खोलें, http://localhost/user-accounts/signup.php पर जाएं, कुछ परीक्षण जानकारी के साथ फ़ॉर्म भरें (और उन्हें याद रखें क्योंकि हम बाद में लॉग इन करने के लिए उपयोगकर्ता का उपयोग करेंगे), फिर क्लिक करें साइनअप बटन। यदि सब कुछ ठीक रहा, तो उपयोगकर्ता डेटाबेस में सहेजा जाएगा और हमारा एप्लिकेशन होम पेज पर रीडायरेक्ट हो जाएगा।
मुखपृष्ठ पर, आपको एक त्रुटि दिखाई देगी जो उत्पन्न होती है क्योंकि हम उस संदेश को शामिल कर रहे हैं जिसे हमने अभी तक नहीं बनाया है। आइए इसे एक बार में बनाएं।
शामिल/लेआउट निर्देशिका में, संदेश नाम की एक फ़ाइल बनाएं।php:
संदेश.php:
<?php if (isset($_SESSION['success_msg'])): ?>
<div class="alert <?php echo 'alert-success'; ?> alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<?php
echo $_SESSION['success_msg'];
unset($_SESSION['success_msg']);
?>
</div>
<?php endif; ?>
<?php if (isset($_SESSION['error_msg'])): ?>
<div class="alert alert-danger alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<?php
echo $_SESSION['error_msg'];
unset($_SESSION['error_msg']);
?>
</div>
<?php endif; ?>
अब होमपेज को रीफ्रेश करें और त्रुटि दूर हो गई है।
और इस भाग के लिए बस इतना ही। अगले भाग में हम साइनअप फॉर्म, यूजर लॉगिन/लॉगआउट को मान्य करना जारी रखेंगे और एडमिन सेक्शन पर काम शुरू करेंगे। यह बहुत अधिक काम की तरह लगता है, लेकिन मेरा विश्वास करो, यह सीधा है, खासकर क्योंकि हमने पहले से ही कुछ कोड लिखा है जो हमारे काम को आसान बनाता है।
निम्नलिखित के लिए धन्यवाद। आशा है कि आप साथ आ रहे हैं। यदि आपके कोई विचार हैं, तो उन्हें नीचे टिप्पणी में छोड़ दें। अगर आपको किसी त्रुटि का सामना करना पड़ा या कुछ समझ में नहीं आया, तो मुझे टिप्पणी अनुभाग में बताएं ताकि मैं कोशिश कर सकूं और आपकी मदद कर सकूं।
मिलते हैं अगले भाग में।