PHP आणि MySQL मध्ये Registration Form कसा बनवायचा
आत्तापर्यंत आपण serve केलेलं प्रत्येक page server कडे फक्त काहीतरी मागत होतं. या chapter मध्ये आपण असं page बनवू जे server ला data पाठवतं: HTML मधला registration form, तो data घेणारा PHP script, आणि तो store करणारा MariaDB table, सगळं nginx, php-fpm आणि MariaDB चालणाऱ्या एकाच Amazon Linux EC2 server वर. सोबत AI assistant कडून code कसा घ्यायचा, त्याने दिलेल्या code मध्ये काय बदलायलाच हवं, आणि form चालत नसेल तर कारण कसं शोधायचं, तेही बघू.
या class मध्ये काय शिकणार
- GET आणि POST, आणि data पाठवणारा form POST का वापरतो
- HTML form:
action,methodआणि प्रत्येक input चंname $_POST, submit केलेल्या values ठेवणारा array- Database connection च्या चार values, आणि
localhostम्हणजे127.0.0.1का - PHP चा MySQL driver
php-mysqlnd, आणि php-fpm restart instadatabase,userstable, आणि फक्त app साठी database user- Prepared statement आणि
password_hash()सहregister.htmlआणिsignup.php SELECTने testing, आणिpassword_verify()वापरणाराlogin.php- AI assistant साठी prompts लिहिणं आणि त्याचे placeholders दुरुस्त करणं
- View Page Source, आणि न चालणाऱ्या form साठी checklist
1. GET आणि POST
का: registration form ला name, email आणि password browser कडून server पर्यंत न्यायचे असतात. Browser ते कसे पाठवतो यावर password private राहतो की नाही ते ठरतं.
काय: browser च्या प्रत्येक request ला एक method असते. इथे दोन महत्त्वाच्या:
- GET server कडे काहीतरी मागतो. URL टाइप करणं, link click करणं आणि refresh हे सगळे GET requests. Data असेल तर तो URL मध्ये
?नंतर जातो. - POST server ला data देतो. Data request च्या body मधून जातो, म्हणून तो URL, browser history किंवा server च्या access log मध्ये कधीच दिसत नाही.
Classroom line
In a POST request we aren't asking the server for something; we are giving something to it.
Class मधलं वाक्य
POST request मध्ये आपण server कडे मागत नाही, आपण server ला देतो.
Classroom line – हिंदी
"POST request me hum server se maang nahi rahe, hum server ko de rahe hain."
कसं दिसतं:
- तुम्ही
http://SERVER-IP/register.htmlउघडता: GET. Server form पाठवतो. - Form भरून Register दाबता:
signup.phpला POST, body मध्येname=...&email=...&password=.... method="POST"नसलेला तोच form GET वापरतो, आणि browser च्या address bar मध्येsignup.php?name=Asha&email=asha%40example.com&password=MySecret123दिसतं. Screen, history किंवा log बघणारा कोणीही password वाचू शकतो.
Figure 1. Animation: GET page मागतो आणि data नेत नाही; POST form चा data request च्या body मधून पाठवतो; method=POST नसलेला form GET वापरतो आणि password URL मध्ये टाकतो.
2. Server: nginx, php-fpm आणि MariaDB
का: एकाच EC2 server वर तीन programs एकत्र काम करतात, आणि form चालायच्या आधी तिन्ही चालू असायला हवेत.
काय:
- nginx port 80 वरचा web server. तो
.htmlfiles स्वतः पाठवतो आणि प्रत्येक.phpfile php-fpm कडे देतो. - php-fpm PHP code चालवतो.
- MariaDB port 3306 वरचा database server.
कसं:
- तुमच्या Amazon Linux EC2 instance ला
ssh -i key.pem ec2-user@SERVER-IPने connect करा. - तिन्ही अजून install नसतील तर एकदम install करा:
sudo yum install nginx mariadb105-server php -y. -
सुरू करा:
sudo service nginx start sudo service mariadb start sudo service php-fpm start -
प्रत्येक command
Redirecting to /bin/systemctl start nginx.service(किंवा mariadb, php-fpm) दाखवते. ते normal आहे: Amazon Linux वरservicecommand कामsystemctlकडे देते. - Amazon Linux वर nginx जो folder serve करतो तिथे जा:
cd /usr/share/nginx/html. -
दोन test pages बनवा:
echo '<h1>HTML works</h1>' | sudo tee index.html echo '<?php phpinfo();' | sudo tee index.php -
http://SERVER-IP/index.htmlआणिhttp://SERVER-IP/index.phpउघडा. पहिलं HTML works दाखवतं; दुसरं PHP information चं मोठं जांभळं page दाखवतं.
Classroom line
Make index.html and index.php and check; both pages must open.
Class मधलं वाक्य
"Index.html ani index.php banvun bagha. Donhi page disayla pahijet."
index.html आणि index.php बनवून बघा. दोन्ही pages दिसायला पाहिजेत.
Classroom line
Make index.html and index.php and check; both pages must open.
Classroom line
If both pages open, it means PHP and HTML are working properly.
Class मधलं वाक्य
"He donhi page disayla lagle yacha artha PHP ani HTML barobar work kartay."
हे दोन्ही pages दिसायला लागले याचा अर्थ PHP आणि HTML बरोबर work करतंय.
Classroom line
If both pages open, it means PHP and HTML are working properly.
- PHP information page server ची माहिती दाखवतं, म्हणून बघून झाल्यावर ते delete करा:
sudo rm /usr/share/nginx/html/index.php.
Figure 2. nginx .html देतो आणि .php php-fpm कडे देतो; MariaDB शी बोलायला php-fpm ला php-mysqlnd driver लागतो. तिन्ही sudo service ... start ने सुरू करा.
3. PHP चा MySQL driver: php-mysqlnd
का: फक्त PHP ला MariaDB शी बोलता येत नाही. त्याला driver लागतो, म्हणजे MySQL/MariaDB ची भाषा येणारं extension. तो नसेल तर mysqli functions अस्तित्वातच नसतात, आणि signup.php कोऱ्या page किंवा 500 Internal Server Error वर थांबतो.
काय: Amazon Linux वर package आहे php-mysqlnd. तो तुमच्याकडे आधीच असलेल्या PHP version शी जुळतो आणि mysqli आणि pdo_mysql जोडतो.
कसं:
-
Install करा:
sudo yum install php-mysqlnd -y -
नवीन extension load व्हावं म्हणून php-fpm restart करा:
sudo service php-fpm restart -
PHP extensions फक्त php-fpm load करतो, म्हणून nginx आणि MariaDB ला काहीच करायची गरज नाही.
-
Driver आला का ते तपासा:
php -m | grep -i mysql -
तुम्हाला
mysqli,mysqlndआणिpdo_mysqlदिसायला हवेत.
4. Database: insta, users आणि app user
का: form चा data कुठेतरी पडायला table हवा, आणि PHP code ला database login हवं. ते login root नसावं: app चा password कधी leak झालाच तर नुकसान app ला खरंच लागतं तेवढ्यापुरतंच राहिलं पाहिजे.
कसं:
mysql -u root -pने login करा.-
Database आणि table बनवा:
CREATE DATABASE insta; USE insta; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(150) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL ); -
प्रत्येक form field साठी एक column, आणि rows ना आपोआप number देणारा
id. emailUNIQUEआहे, म्हणून एक email एकदाच register होऊ शकतो.passwordVARCHAR(255)आहे कारण त्यात टाइप केलेला password नाही, hash (section 8) जाणार आहे. आजचा hash 60 characters चा असतो; 255 पुढच्या जास्त मजबूत hashes साठी जागा ठेवतो.-
फक्त app साठी user बनवा, placeholder च्या जागी तुमचा स्वतःचा password टाका:
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'YOUR_APP_PASSWORD'; GRANT SELECT, INSERT ON insta.users TO 'appuser'@'localhost'; -
appuserinsta.usersमधल्या rows वाचू आणि जोडू शकतो, बाकी काही नाही. तो table drop करू शकत नाही किंवा दुसरे databases बघू शकत नाही. SHOW GRANTS FOR 'appuser'@'localhost';ने तपासा.appuserम्हणून login असतानाDROP TABLE users;चालवून बघा,ERROR 1142 ... DROP command deniedयेतो.exit;
5. Connection च्या चार values
का: connection उघडायला PHP ला कळायला हवं की database कुठे आहे, login कोण करतंय, कोणत्या password ने, आणि कोणता database वापरायचा. एक value जरी चुकली तरी काहीच save होत नाही.
काय:
- Server name: MariaDB कुठे चालतो. इथे तो PHP च्याच EC2 server वर आहे, म्हणून
localhost. - User name:
appuser. - Password:
CREATE USERमध्ये ठेवलेला. - Database:
insta.
Classroom line
The database is on the same server as PHP, so we call it localhost.
Class मधलं वाक्य
जिथे PHP आहे तिथेच database आहे, म्हणून त्याला localhost म्हणणार.
Classroom line – हिंदी
"Jahan PHP hai wahi database hai, to usko localhost kahenge."
Classroom line
localhost is a domain name; its IP is 127.0.0.1.
Class मधलं वाक्य
localhost हे एक domain name आहे; त्याचा IP 127.0.0.1 आहे.
Classroom line – हिंदी
"Localhost ek domain name hai; iska IP 127.0.0.1 hai."
कसं: PHP मध्ये चार values म्हणजे चार variables, आणि एक ओळ connection उघडते:
$servername = "localhost";
$username = "appuser";
$password = "YOUR_APP_PASSWORD";
$database = "insta";
$conn = new mysqli($servername, $username, $password, $database);
localhostम्हणजे नेहमी "हीच machine". त्याचा address127.0.0.1.localhostदिलं तर mysqli MariaDB च्या local socket file मधून connect होतो.127.0.0.1दिलं तर TCP port 3306 वापरतो. दोन्ही त्याच database पर्यंत पोहोचतात.- Database कधी स्वतःच्या वेगळ्या server वर गेला (उदा. Amazon RDS), तर फक्त
$servernameबदलतो, त्या server च्या address ने.
Figure 3. Connection च्या चार values: localhost (127.0.0.1, तोच server), फक्त app साठीचा user, त्याचा password, आणि insta database. एक value चुकली तरी connection fail.
6. HTML form: action, method आणि name
का: form चा data कुठे जातो, कसा जातो, आणि तिथे पोहोचल्यावर त्याला काय नाव असतं, हे तीन attributes ठरवतात.
काय:
action="signup.php": data घेणारी file. ती PHP file च्या नावाशी अगदी तंतोतंत जुळली पाहिजे, capital आणि small अक्षरांसकट.method="POST": data request च्या body मधून पाठवा.- प्रत्येक input वर
name="...": प्रत्येक value सोबत जाणारं label. PHP value या नावानेच शोधतो.
Classroom line
If you write signup.php here and put the PHP code in a different file, it won't work.
Class मधलं वाक्य
"Ithe signup.php lihilat ani PHP code vegLya file madhe taklat, tar nahi chalnar."
इथे signup.php लिहिलंत आणि PHP code वेगळ्या file मध्ये टाकलात, तर नाही चालणार.
Classroom line
If you write signup.php here and put the PHP code in a different file, it won't work.
कसं:
-
Form बनवा:
sudo nano /usr/share/nginx/html/register.html<!DOCTYPE html> <html> <head><meta charset="utf-8"><title>Register</title></head> <body> <h2>Create Account</h2> <form action="signup.php" method="POST"> <label>Name</label> <input type="text" name="name" required><br> <label>Email</label> <input type="email" name="email" required><br> <label>Password</label> <input type="password" name="password" minlength="8" required><br> <button type="submit">Register</button> </form> </body> </html> -
type="password"अक्षरांऐवजी dots दाखवतो.requiredआणिminlength="8"मुळे browser पाठवायच्या आधी fields तपासतो. http://SERVER-IP/register.htmlउघडा. थोडी CSS styling असलेलं version खालच्या screenshot सारखं दिसतं; महत्त्वाचे आहेत form tag आणि inputs ची names.

Whiteboard: nginx ने serve केलेला registration form: Name, Email आणि Password fields आणि Register button.
- कोणत्याही page चं HTML बघायचंय, तुमचं किंवा दुसऱ्या कोणाचं? Page वर right-click करा आणि View Page Source निवडा (किंवा Ctrl+U). ते वाचता येतं, आणि सुरुवात म्हणून copy करता येतं.
Classroom line
Want this same code? Right-click on the page, choose View Page Source and copy it.
Class मधलं वाक्य
"Hech code pahije tar page var right click kara, View Page Source kara, copy kara."
हाच code पाहिजे तर page वर right click करा, View Page Source करा, copy करा.
Classroom line
Want this same code? Right-click on the page, choose View Page Source and copy it.
- Source मध्ये
<form ...>ची ओळ शोधा आणि आधीactionआणिmethodतपासा.

Whiteboard: Registration page चा View Page Source: form tag data method POST ने signup.php ला पाठवतो.
7. $_POST: PHP मधला form data
का: POST पोहोचल्यावर signup.php ला प्रत्येक value पर्यंत पोहोचायचा मार्ग हवा.
काय: POST body मधून आलेलं सगळं PHP $_POST मध्ये ठेवतो, जो एक array आहे. Array म्हणजे एक variable ज्यात अनेक values असतात, प्रत्येक आपल्या key खाली. Keys म्हणजे form मधले name attributes.
Classroom line
An array is a variable that holds multiple values inside it.
Class मधलं वाक्य
Array म्हणजे असा variable ज्याच्या आत अनेक values येतात.
Classroom line – हिंदी
"Array matlab ek aisa variable jiske andar multiple values aate hain."
कसं:
- आपल्या form साठी
$_POSTमध्ये तीन entries असतात:'name' => 'Asha','email' => 'asha@example.com','password' => 'MySecret123'. -
प्रत्येक value तिच्या key ने काढा:
$name = trim($_POST["name"] ?? ""); $email = trim($_POST["email"] ?? ""); $pass = $_POST["password"] ?? ""; -
Field नसेल तर
?? ""warning ऐवजी रिकामा string देतो. trim()name आणि email च्या आधी किंवा नंतर चुकून टाइप झालेले spaces काढतो.- PHP मधली key HTML मधल्या
nameपेक्षा वेगळ्या spelling ची असेल (name="email"साठी$_POST["Email"]), तर value सरळ रिकामी येते.
Figure 4. प्रत्येक input चं name $_POST मध्ये key बनतं: request body मधलं name=Asha signup.php मध्ये $_POST['name'] बनतं.
8. signup.php, सुरक्षित पद्धतीने
का: तुमच्या database मध्ये काय पडतं ते ही file ठरवते. दोन नियम तिला सुरक्षित करतात:
- Form data SQL text मध्ये कधीच चिकटवू नका. Query
"... VALUES ('$name', ...)"अशी बनवली, तर name field मध्ये टाइप केलेला quote तुमचा string संपवतो आणि उरलेलं SQL म्हणून चालतं. याला SQL injection म्हणतात. Prepared statement आधी SQL पाठवतो, प्रत्येक value साठी?ठेवून, आणि values वेगळ्या, म्हणून त्या कधीच data शिवाय दुसरं काही होऊ शकत नाहीत. - Password स्वतः कधीच store करू नका.
password_hash()त्याचा one-way hash बनवतो. Table, backup किंवा leak झालेली copy वाचणाऱ्याला फक्त hashes दिसतात.
Classroom line
Understanding it matters more than just doing it; pay attention.
Class मधलं वाक्य
"Karnyapeksha samjun ghena mahatvacha aahe, laksh dya."
करण्यापेक्षा समजून घेणं महत्त्वाचं आहे, लक्ष द्या.
Classroom line
Understanding it matters more than just doing it; pay attention.
कसं: sudo nano /usr/share/nginx/html/signup.php
<?php
// 1. The four connection values
$servername = "localhost"; // same server as PHP (127.0.0.1)
$username = "appuser"; // limited user, not root
$password = "YOUR_APP_PASSWORD"; // placeholder: put your own
$database = "insta";
// Only accept form submissions (POST)
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
header("Location: register.html");
exit;
}
// 2. Read the form fields from $_POST
$name = trim($_POST["name"] ?? "");
$email = trim($_POST["email"] ?? "");
$pass = $_POST["password"] ?? "";
if ($name === "" || !filter_var($email, FILTER_VALIDATE_EMAIL) || strlen($pass) < 8) {
exit("Please fill all fields. Password must be at least 8 characters.");
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
// 3. Connect
$conn = new mysqli($servername, $username, $password, $database);
// 4. Store a hash, never the plain password
$hash = password_hash($pass, PASSWORD_DEFAULT);
// 5. Prepared statement: data goes separately from the SQL
$stmt = $conn->prepare("INSERT INTO users (name, email, password) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $name, $email, $hash);
$stmt->execute();
echo "Registration successful. <a href=\"login.html\">Log in</a>";
} catch (mysqli_sql_exception $e) {
if ($e->getCode() == 1062) {
echo "An account with this email already exists.";
} else {
error_log("signup.php: " . $e->getMessage());
echo "Something went wrong. Please try again later.";
}
}
वरपासून खालपर्यंत वाचा:
- Section 5 मधल्या connection च्या चार values.
signup.phpला आलेली GET (कोणी त्याचा URL टाइप केला तर) form कडे परत पाठवली जाते.- तीन values
$_POSTमधून काढल्या जातात आणि तपासल्या जातात: name, valid email, किमान 8 characters चा password. Browser पण तपासतो, पण browser कोणीही टाळू शकतो, म्हणून server परत तपासतो. mysqli_report(...)मुळे database ची प्रत्येक error exception बनते, जीcatchblock सांभाळतो.password_hash($pass, PASSWORD_DEFAULT)hash बनवतो,$2y$ने सुरू होणारा 60 characters चा text.prepare()तीन?सह SQL पाठवतो.bind_param("sss", ...)तीन strings जोडतो, प्रत्येक?साठी एक, क्रमाने.execute()तो चालवतो.- Error 1062 म्हणजे
UNIQUEemail ची duplicate entry: user ला स्पष्ट message मिळतो. - बाकी कोणतीही error तुमच्यासाठी PHP error log मध्ये जाते, आणि visitor ला साधा message दिसतो. Database चे details page वर कधीच दिसत नाहीत.
Figure 5. चिकटवलेल्या SQL मध्ये टाइप केलेला quote command बदलू शकतो; prepared statement आधी SQL ठरवतो आणि values वेगळ्या पाठवतो, म्हणून तोच text साधं name म्हणून store होतो.
Figure 6. Animation: जसा टाइप केला तसा store केलेला password table असणाऱ्या कोणालाही वाचता येतो; password_hash() 60 characters चा one-way hash store करतो; password_verify() login त्याच्याशी तपासतो.
9. पूर्ण flow test करा
का: "बरोबर दिसणारा" form काहीच सिद्ध करत नाही. एक registration table पर्यंत पूर्ण follow करा.
कसं:
http://SERVER-IP/register.htmlउघडा,Asha,asha@example.comआणि 8 किंवा जास्त characters चा password भरा, आणि Register दाबा.- Page
Registration successful. Log inदाखवतं. Address bar मध्ये फक्त/signup.php, data नाही. - मागे जा आणि तोच email परत register करा. Page
An account with this email already exists.दाखवतं. -
mysql -u root -pने database कडून तपासा:USE insta; SELECT id, name, email, password FROM users; -
Asha ची row आहे, आणि password column मध्ये password नाही,
$2y$12$GscnGr53N2GXU/ebcR2Wg...सारखं काहीतरी आहे. - दुसऱ्या व्यक्तीला register करा. तिचा id 3 आहे, 2 नाही: fail झालेल्या duplicate insert ने id 2 वापरला,
AUTO_INCREMENTtable मधल्या कोणत्याही fail झालेल्या insert सारखं. - Name म्हणून
x'); DROP TABLE users; --टाइप करून register करा. ते साधं name म्हणून save होतं, आणिusersजसाच्या तसा आहे. हेच prepared statement चं काम.
Figure 7. Animation: browser nginx कडून register.html घेतो; Register POST /signup.php पाठवतो, जो nginx php-fpm कडे देतो; signup.php MariaDB मधल्या insta.users मध्ये row टाकतो.
10. पुढची पायरी: login.php
का: registration users store करतं; login page त्यांना तपासतं. तेच तुकडे उलट्या क्रमाने वापरले जातात.
काय: login.html म्हणजे फक्त email आणि password असलेला तोच form, action="login.php" सह. login.php email वरून row शोधतो आणि टाइप केलेला password store केलेल्या hash शी PHP ला compare करू देतो.
कसं: sudo nano /usr/share/nginx/html/login.php
<?php
$servername = "localhost";
$username = "appuser";
$password = "YOUR_APP_PASSWORD";
$database = "insta";
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
header("Location: login.html");
exit;
}
$email = trim($_POST["email"] ?? "");
$pass = $_POST["password"] ?? "";
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$conn = new mysqli($servername, $username, $password, $database);
$stmt = $conn->prepare("SELECT name, password FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$user = $stmt->get_result()->fetch_assoc();
if ($user && password_verify($pass, $user["password"])) {
echo "Welcome, " . htmlspecialchars($user["name"]) . "!";
} else {
echo "Wrong email or password.";
}
} catch (mysqli_sql_exception $e) {
error_log("login.php: " . $e->getMessage());
echo "Something went wrong. Please try again later.";
}
- Query row फक्त email वरून शोधते.
WHERE password = '...'कधीच लिहू नका: column मध्ये hash आहे, password नाही. password_verify($pass, $user["password"])टाइप केलेला password त्याच पद्धतीने hash करून compare करतो. True म्हणजे password बरोबर.- चुकीचा email आणि चुकीचा password यांना एकच message मिळतो, म्हणजे कोणते emails registered आहेत ते form वापरून कोणाला शोधता येत नाही.
- Name मध्ये
<किंवा quotes असले तरीhtmlspecialchars()ते सुरक्षितपणे दाखवतो. - Test: बरोबर password
Welcome, Asha!देतो; चुकीचाWrong email or password.देतो. - खरं app आता session (
session_start()) सुरू करेल, म्हणजे logged-in user एका page पासून दुसऱ्या page पर्यंत लक्षात राहील.
11. AI assistant कडून code लिहून घ्या, मग तो दुरुस्त करा
का: cloud engineer म्हणून तुम्ही स्वतः न लिहिलेली applications deploy, configure आणि debug कराल. ChatGPT सारखे AI assistants असा code काही seconds मध्ये लिहितात, पण त्यांना तुमचा server, database किंवा passwords माहीत असू शकत नाहीत. तुमचं काम म्हणजे स्पष्ट विचारणं, आणि मग प्रत्येक ओळ वाचून दुरुस्त करणं.
Classroom line
Whatever half-information we give ChatGPT, that's all we'll get back from it.
Class मधलं वाक्य
"ChatGPT la aapan jevdhi ardhavat mahiti deto, tevdhach tyachyakadun yenar."
ChatGPT ला आपण जेवढी अर्धवट माहिती देतो, तेवढंच त्याच्याकडून येणार.
Classroom line
Whatever half-information we give ChatGPT, that's all we'll get back from it.
Prompts कसे लिहायचे:
- एका prompt ला एक file, आणि सगळ्याची नावं द्या. Form साठी: Create a registration form in HTML with name, email and password fields that sends the data with POST to signup.php.
- मग script, तुमच्या खऱ्या नावांसह आणि safety च्या नियमांसह: Create signup.php for it: PHP mysqli, database insta, table users with columns name, email and password, prepared statements, password_hash(), and a message if the email already exists.
- make a signup page सारख्या अर्धवट prompt ने assistant file चं नाव, fields, database आणि table चा अंदाज लावतो, आणि ते अंदाज दुरुस्त करण्यात जास्त वेळ जातो.
Classroom line
You must learn how to prompt.
Class मधलं वाक्य
"Prompting shikta aala pahije."
Prompting शिकता आलं पाहिजे.
Classroom line
You must learn how to prompt.
मिळालेल्या code मध्ये काय बदलायचं:
- Connection च्या चार values. Assistant
your_username,your_databaseकिंवाenter your passwordसारखे placeholders लिहितो. ते तसेच कधीच चालत नाहीत. - Database, table आणि column names. ती
SHOW DATABASES;आणिDESC users;मधून घ्या. - Form चा
actionतुम्ही खरंच save करणार असलेल्या PHP file च्या नावाशी जुळला पाहिजे. - Safety: code variables string मध्ये चिकटवून SQL बनवत असेल, किंवा
$_POST["password"]सरळ store करत असेल, तर prepared statement आणिpassword_hash()मागा, किंवा स्वतः बदला. - Test करा, मग
SELECT * FROM users;.
Classroom line
ChatGPT doesn't give you this; it just says 'enter your password'.
Class मधलं वाक्य
"ChatGPT tumhala he det nahi; to mhanto 'enter your password'."
ChatGPT तुम्हाला हे देत नाही; तो म्हणतो 'enter your password'.
Classroom line
ChatGPT doesn't give you this; it just says 'enter your password'.
Code सुरक्षित ठेवा:
- Web root मधली
.phpfile चालवली जाते, दाखवली जात नाही, म्हणून तिच्यातला database password server वरच राहतो. /usr/share/nginx/htmlमध्येsignup.txtकिंवाsignup.php.bakसारखी copy कधीच ठेवू नका: nginx त्या साध्या text म्हणून पाठवतो, password सकट. Code share करायचा तर terminal मधून copy करा किंवाscpवापरा.- तुमचा खरा database password AI chat मध्ये कधीच paste करू नका. Placeholder वापरा आणि server वरच तो भरा.
Figure 8. अर्धवट prompt मुळे assistant अंदाज लावतो; पूर्ण prompts files, fields, database आणि safety चे नियम सांगतात. मग connection values, names आणि action दुरुस्त करा, आणि test करा.
12. माझा form का चालत नाही?
का: जवळजवळ प्रत्येक बिघडलेला form काही छोट्या गोष्टींवर येऊन थांबतो. त्या या क्रमाने तपासा.
Classroom line
These are very small things: a spelling mistake, the wrong folder, a wrong password.
Class मधलं वाक्य
"Lay chotya chotya goshti aahet: spelling mistake, chukicha folder, password chukicha."
लय छोट्या छोट्या गोष्टी आहेत: spelling mistake, चुकीचा folder, password चुकीचा.
Classroom line
These are very small things: a spelling mistake, the wrong folder, a wrong password.
register.htmlला404 Not Found: file चुकीच्या folder मध्ये आहे. Amazon Linux वर nginx/usr/share/nginx/htmlserve करतो./var/www/htmlहा Apache चा folder (आणि Ubuntu वर nginx चा), म्हणून तिथली file इथे 404 देते.ls /usr/share/nginx/htmlने तपासा.- Register काहीच करत नाही, किंवा
405 Not Allowed: form लाactionनाही. तो नसेल तर browser data परतregister.htmlलाच पाठवतो;method="POST"असेल तर nginx साध्या.htmlfile ला आलेली POST 405 ने नाकारतो.action="signup.php"जोडा. - टाइप केलेला data, password सुद्धा, URL मध्ये दिसतो: form ला
methodनाही, म्हणून तो GET वापरतो.method="POST"जोडा.
Classroom line
It's sending the data in the URL; change the HTML and use method.
Class मधलं वाक्य
"Te URL madhe data pathvatay; HTML badla, method vapra."
ते URL मध्ये data पाठवतंय; HTML बदला, method वापरा.
Classroom line
It's sending the data in the URL; change the HTML and use method.
signup.phpला404 Not Found: file चं नावactionपेक्षा वेगळं आहे:signup.html,Signup.php,sigup.php. Linux मध्ये file names case-sensitive असतात.500किंवा कोरं page: PHP error log बघा.Class "mysqli" not foundकिंवाCall to undefined function mysqli_...म्हणजे driver नाही:sudo yum install php-mysqlnd -y, मगsudo service php-fpm restart.Something went wrong, आणि log मध्येAccess denied for user 'appuser'@'localhost'किंवाUnknown database: एखादी connection value MariaDB मध्ये बनवलेल्याशी जुळत नाही.- Log मध्ये
Unknown column 'fullname'किंवाTable 'insta.user' doesn't exist:INSERTतुमच्या table मध्ये नसलेली names वापरतोय. तीDESC users;मधून घ्या. - Logs कुठे आहेत: nginx
/var/log/nginx/error.logमध्ये लिहितो (नसलेल्या files, 404s); php-fpm मधल्या PHP errors/var/log/php-fpm/www-error.logमध्ये जातात. शेवटच्या ओळीsudo tail -n 20आणि file चं नाव देऊन वाचा.
Figure 9. Form का चालत नाही, क्रमाने: चुकीचा folder, action नाही, method नाही, file चं नाव action शी जुळत नाही, driver नाही, चुकीच्या connection values, चुकीची table किंवा column names. कोणतं ते logs सांगतात.
Ravindra Bagale's Tip
Form test करण्याआधी प्रत्येक layer वेगळा test करा. index.html उघडलं: nginx ठीक. index.php उघडलं: php-fpm ठीक. mysql -u appuser -p insta ने login झालं: user, password आणि database बरोबर. त्यानंतरच Register दाबा. काही बिघडलं की sudo tail -n 20 /var/log/nginx/error.log आणि /var/log/php-fpm/www-error.log बहुतेक वेळा नेमका problem एका ओळीत सांगतात.
Practice झाल्यावर गरज नसलेली test pages delete करा आणि EC2 instance stop करा.
13. Hands-on lab: एक registration, form पासून table पर्यंत
हा lab का. Form मध्ये अनेक कड्या असतात: nginx, php-fpm, driver, database, app user, HTML आणि PHP. हा lab प्रत्येक कडी क्रमाने तपासतो, म्हणजे form बिघडला तर कोणती कडी तपासायची ते कळतं.
- तीन services start करा
- Command:
sudo service nginx start; sudo service mariadb start; sudo service php-fpm start - काय दिसेल: तीन
Redirecting to /bin/systemctl start ...ओळी. - Check करा:
sudo service php-fpm statusमध्येactive (running); nginx आणि mariadb साठीही तेच. - का: nginx request घेतो, php-fpm PHP चालवतो, MariaDB row साठवतो. एक service बंद असली तरी पूर्ण form बिघडतो.
- Command:
- PHP साठी MySQL driver install करा
- Command:
sudo yum install php-mysqlnd -y && sudo service php-fpm restart - काय दिसेल:
Complete!आणि restart ची ओळ. - Check करा:
php -m | grep -i mysqlमध्येmysqli,mysqlndआणिpdo_mysqlदिसतात. - का: PHP एकटा MariaDB शी बोलू शकत नाही. php-fpm extensions फक्त start ला load करतो, म्हणून restart.
- Command:
- Database, table आणि app user बनवा
- करा:
sudo mysql -u root -pने login करा आणि section 4 मधलीCREATE DATABASE insta;,CREATE TABLE users (...),CREATE USER 'appuser'@'localhost' ...आणिGRANT SELECT, INSERT ON insta.users ...statements चालवा. - Check करा:
SHOW GRANTS FOR 'appuser'@'localhost';मध्येinsta.usersवरSELECT, INSERTदिसतं. - का: App अशा user ने login करतो जो फक्त एका table मध्ये rows वाचू आणि जोडू शकतो. Code चा कधी गैरवापर झाला तरी तो tables drop करू शकत नाही किंवा दुसरे databases वाचू शकत नाही.
- करा:
- Terminal मधून app login तपासा
- Command:
mysql -u appuser -p insta -e "SELECT COUNT(*) FROM users;" - काय दिसेल: App password नंतर:
0असलेलं छोटं table. - Check करा:
Access deniedनाही. - का: हे चार values (host, user, password, database) इथे fail झाले तर PHP मध्येही fail होतील. आधी इथे तपासलं की database चे प्रॉब्लेम code च्या प्रॉब्लेमपासून वेगळे होतात.
- Command:
- Form आणि signup.php जागेवर ठेवा
- करा:
sudo nanoने/usr/share/nginx/htmlमध्येregister.html(section 6) आणिsignup.php(section 8) बनवा. - Check करा:
php -l /usr/share/nginx/html/signup.php→No syntax errors detected. - का:
action="signup.php"file च्या नावाशी तंतोतंत जुळायला हवं. Visitor ला रिकामं page मिळण्याआधीphp -lराहिलेला semicolon पकडतो.
- करा:
- एक user register करा
- करा:
http://PUBLIC_IP/register.htmlउघडा, name, email आणि password भरा, आणि submit करा. - काय दिसेल:
signup.phpचा success message, आणि address bar मध्ये form data शिवाय/signup.php. - Check करा:
500 Internal Server Errorनाही आणि रिकामं page नाही. - का:
method="POST"असल्याने data URL मध्ये नाही, request च्या body मधून जातो, म्हणून password address bar किंवा browser history मध्ये कधीच दिसत नाही.
- करा:
- Row तपासा
- Command:
sudo mysql -u root -p insta -e "SELECT id, name, email, password FROM users;" - काय दिसेल: तुमचं name आणि email असलेली एक row; password column
$2y$ने सुरू होतो. - Check करा: तुम्ही type केलेला password कुठेही दिसत नाही.
- का:
password_hash()hash साठवतो, password कधीच नाही. Table leak झाला तरी खरे passwords leak होत नाहीत.
- Command:
- Instance stop करा
- करा: EC2 console → Instance state → Stop instance.
- Check करा: State Stopped.
- का: या server वर तीन services सतत चालतात. Stop केल्याने free-tier hours वाचतात; database disk वर राहतो.
14. पूर्ण class एका page वर
- GET काहीतरी मागतो आणि data URL मधून नेतो; POST server ला data request च्या body मधून देतो.
- Form ला
action="signup.php"(data घेणारी file),method="POST", आणि प्रत्येक input वरnameलागतं. $_POSTहा array आहे:$_POST["email"]म्हणजेemailनावाच्या input ची value.- Stack
sudo service nginx|mariadb|php-fpm startने सुरू करा; Amazon Linux वर nginx/usr/share/nginx/htmlserve करतो. - MariaDB शी बोलायला PHP ला
php-mysqlndलागतो; install केल्यावर फक्त php-fpm restart करा. users(id, name, email UNIQUE, password VARCHAR(255)), आणिGRANT SELECT, INSERT ON insta.usersअसलेलाappuser, root कधीच नाही.- Connection च्या चार values:
localhost(127.0.0.1), user, password, database. - Prepared statement:
prepare("... VALUES (?, ?, ?)"),bind_param("sss", ...),execute(). - Store करताना
password_hash(), login करतानाpassword_verify(). SELECT * FROM users;ने तपासा. Duplicate email error 1062 देतो आणि एक id वापरतो.- AI assistants: पूर्ण prompts, मग placeholders, names आणि action दुरुस्त करा; खरे passwords कधीच paste करू नका.
- बिघडलेला form: folder, action, method, file चं नाव, driver, connection values, table आणि column names, मग logs.
15. Try at home
Try at home
Task 1: stack
- nginx, MariaDB आणि php-fpm सुरू करा, आणि
/usr/share/nginx/htmlमधून एकindex.htmlआणि एकindex.phpउघडा. php-mysqlndinstall करा, php-fpm restart करा, आणिphp -mनेmysqliआहे का ते बघा.
Task 2: registration
insta.usersआणि फक्तSELECTआणिINSERTअसलेलाappuserबनवा.register.htmlआणिsignup.phpबनवा, दोन users register करा, आणिSELECTने hashes बघा.- तोच email दोनदा register करा आणि पुढच्या नवीन user चा id लक्षात घ्या.
Task 3: मुद्दाम बिघडवा
- Form मधून
method="POST"काढा आणि register करा: password कुठे गेला? actionकाढा, मगsignup.phpचं नावSignup.phpकरा. प्रत्येक error लिहून ठेवा.$passwordमध्ये चुकीचा password टाका आणि/var/log/php-fpm/www-error.logमध्ये message शोधा.
Task 4: login आणि एक जास्तीचं field
password_verify()सहlogin.htmlआणिlogin.phpबनवा, आणि बरोबर आणि चुकीचा password test करा.- AI assistant ला form आणि
signup.phpदोन्हींमध्येphonefield जोडायला सांगा.ALTER TABLEने column जोडा, प्रत्येक placeholder दुरुस्त करा, आणि test करा.
Recap
थोडक्यात
- GET server कडे काहीतरी मागतो; POST data request च्या body मधून पाठवतो, म्हणून password असलेला form नेहमी
method="POST"वापरतो. - Form चा
actiondata घेणाऱ्या PHP file चं नाव सांगतो, आणि प्रत्येक input चंname$_POSTarray मध्ये key बनतं. - nginx
/usr/share/nginx/htmlserve करतो आणि.phpphp-fpm कडे देतो;php-mysqlndमुळे PHP MariaDB पर्यंत पोहोचतो, आणि तो install केल्यावर फक्त php-fpm restart लागतो. - PHP चार values ने connect होतो:
localhost(127.0.0.1), फक्त app साठीचा user, त्याचा password आणिinstadatabase. signup.phpprepared statement आणिpassword_hash()वापरतो;login.phpemail वरून row शोधतो आणिpassword_verify()ने तपासतो.SELECT * FROM users;ने test करा आणि duplicate email करून बघा.- AI assistant ला पूर्ण prompts द्या, मग त्याचे placeholders बदला आणि प्रत्येक name तपासा.
- बिघडलेला form बहुतेक folder, action, method, file चं नाव, driver, connection value किंवा column name मुळे असतो; nginx आणि php-fpm चे logs कोणतं ते सांगतात.
सराव Tasks
Pune Fintech Labs हा पुणे मधला वित्त व्यवसाय आहे. Rohan Kulkarni त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे INR मध्ये मोजले जातात आणि AWS resources ap-south-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.
0 / 12
सोपं बदलानंतर service restart करा
का: Config बदल service restart/reload नंतरच लागू होतात.
काय करायचं: nginx service restart करा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
सोपं Service चालू आहे का ते पाहा
का: Site बंद असेल तर आधी web server चालू आहे का ते पाहा.
काय करायचं: httpd service चं status दाखवा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
सोपं Ubuntu वर package install करा
का: Ubuntu apt वापरतं. Package नावं वेगळी: Ubuntu वर Apache म्हणजे apache2.
काय करायचं: Ubuntu वर apache2 package confirm न विचारता install करा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
सोपं Amazon Linux वर package install करा
का: Amazon Linux 2023 वर dnf हा package manager. -y आपोआप yes देतो.
काय करायचं: Amazon Linux 2023 वर httpd package confirm न विचारता install करा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
सोपं मोठ्या orders आधी
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Order id व amount, मोठी amount आधी.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
सोपं City नुसार customers
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Pune मधल्या customers ची नावं.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
मध्यम nginx config test करा
का: Restart मुळे site बंद पडण्याआधी test चुका पकडतो.
काय करायचं: nginx configuration files मधल्या चुका तपासा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
मध्यम Service आत्ता व boot ला सुरू करा
का: enable reboot नंतर सुरू करतो; --now आत्ताच सुरू करतो.
काय करायचं: nginx service enable करा व लगेच सुरू करा, एका command ने.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
मध्यम Port 80 सगळ्यांसाठी उघडा
का: Security group HTTP allow करत असेल तरच visitors website पाहू शकतात.
काय करायचं: Security group sg-00542045bb534c3b2 वर 0.0.0.0/0 कडून inbound TCP port 80 allow करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम एकूण sales
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: सगळ्या order amounts ची बेरीज.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
मध्यम Customer नावांसह orders
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: प्रत्येक customer नाव व order amount.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
अवघड Customer नुसार sales
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Customer नुसार total, फक्त 1000 पेक्षा जास्त.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
उजळणी, तुलना आणि मुलाखत cards
हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.

![उजळणी card: PHP मध्ये $_POST. User ने form मध्ये type केलेलं PHP ला वाचता यायला हवं. $_POST म्हणजे submit केलेल्या values चा array, प्रत्येक input च्या name ने. प्रत्येक input ला name द्या, मग $_POST['name'] वाचा. Input आणि PHP:](../../../aws/ravi-sirs-cards/cards/mr/rev-f-post-array.webp)







अजून cards: Ravi Sir's Cards.