Ravindra BagaleCourses & study guides English

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
  • insta database, users table, आणि फक्त 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 असते. इथे दोन महत्त्वाच्या:

  1. GET server कडे काहीतरी मागतो. URL टाइप करणं, link click करणं आणि refresh हे सगळे GET requests. Data असेल तर तो URL मध्ये ? नंतर जातो.
  2. 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.

कसं दिसतं:

  1. तुम्ही http://SERVER-IP/register.html उघडता: GET. Server form पाठवतो.
  2. Form भरून Register दाबता: signup.php ला POST, body मध्ये name=...&email=...&password=....
  3. method="POST" नसलेला तोच form GET वापरतो, आणि browser च्या address bar मध्ये signup.php?name=Asha&email=asha%40example.com&password=MySecret123 दिसतं. Screen, history किंवा log बघणारा कोणीही password वाचू शकतो.
GET server कडे काहीतरी मागतो; POST server लाdata देतो URL http://SERVER-IP/register.html Browser: Page उघडतो GET /register.html फक्त request, data नाही Server: nginx + PHP: File पाठवतो 200 OK + form चं HTML GET = server कडे काहीतरी मागणं. URL टाइप करणं, link click करणं, refresh: प्रत्येक साधी page visitGET असते. URL http://SERVER-IP/signup.php Name: Asha · Email: asha@example.com · Pass: ******** POST /signup.php body: name=Asha&email=... signup.php data वाचतो आणि save करतो Registration successful. POST = server ला data देणं. Data request च्या body मधून जातो. URL स्वच्छ राहतो. http://SERVER-IP/signup.php?name=Asha &email=asha%40example.com &password=MySecret123 GET /signup.php?name=... ...&password=MySecret123 Password आता server च्या access log मध्ये method=POST नसलेला form GET वापरतो. टाइप केलेलं सगळं, password सुद्धा, URL, browser history आणि serverlogs मध्ये जातं.

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 चालायच्या आधी तिन्ही चालू असायला हवेत.

काय:

  1. nginx port 80 वरचा web server. तो .html files स्वतः पाठवतो आणि प्रत्येक .php file php-fpm कडे देतो.
  2. php-fpm PHP code चालवतो.
  3. MariaDB port 3306 वरचा database server.

कसं:

  1. तुमच्या Amazon Linux EC2 instance ला ssh -i key.pem ec2-user@SERVER-IP ने connect करा.
  2. तिन्ही अजून install नसतील तर एकदम install करा: sudo yum install nginx mariadb105-server php -y.
  3. सुरू करा:

    sudo service nginx start
    sudo service mariadb start
    sudo service php-fpm start
    
  4. प्रत्येक command Redirecting to /bin/systemctl start nginx.service (किंवा mariadb, php-fpm) दाखवते. ते normal आहे: Amazon Linux वर service command काम systemctl कडे देते.

  5. Amazon Linux वर nginx जो folder serve करतो तिथे जा: cd /usr/share/nginx/html.
  6. दोन test pages बनवा:

    echo '<h1>HTML works</h1>' | sudo tee index.html
    echo '<?php phpinfo();' | sudo tee index.php
    
  7. 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.

Classroom line

If both pages open, it means PHP and HTML are working properly.

  1. PHP information page server ची माहिती दाखवतं, म्हणून बघून झाल्यावर ते delete करा: sudo rm /usr/share/nginx/html/index.php.
एका server वर तीन services, आणि एक driver Browser Form दाखवतो, GET आणि POST पाठवतो nginx Web server, port 80 .html स्वतः देतो, .php पुढे देतो php-fpm PHP code चालवतो. Database शी बोलायला php-mysqlnd लागतो MariaDB Database server, port 3306, insta.users ठेवतो php-mysqlnd तीन services सुरू करा sudo service nginx startsudo service mariadb startsudo service php-fpm start Driver एकदा टाका sudo yum install php-mysqlndsudo service php-fpm restartphp -m | grep -i mysql Redirecting to /bin/systemctl ... normal आहे: service तीcommand systemctl कडे देतो. PHP extensions फक्त php-fpm load करतो, म्हणून restart फक्तphp-fpm ला; nginx ला नाही.

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 जोडतो.

कसं:

  1. Install करा:

    sudo yum install php-mysqlnd -y
    
  2. नवीन extension load व्हावं म्हणून php-fpm restart करा:

    sudo service php-fpm restart
    
  3. PHP extensions फक्त php-fpm load करतो, म्हणून nginx आणि MariaDB ला काहीच करायची गरज नाही.

  4. Driver आला का ते तपासा:

    php -m | grep -i mysql
    
  5. तुम्हाला mysqli, mysqlnd आणि pdo_mysql दिसायला हवेत.

4. Database: insta, users आणि app user

का: form चा data कुठेतरी पडायला table हवा, आणि PHP code ला database login हवं. ते login root नसावं: app चा password कधी leak झालाच तर नुकसान app ला खरंच लागतं तेवढ्यापुरतंच राहिलं पाहिजे.

कसं:

  1. mysql -u root -p ने login करा.
  2. 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
    );
    
  3. प्रत्येक form field साठी एक column, आणि rows ना आपोआप number देणारा id.

  4. email UNIQUE आहे, म्हणून एक email एकदाच register होऊ शकतो.
  5. password VARCHAR(255) आहे कारण त्यात टाइप केलेला password नाही, hash (section 8) जाणार आहे. आजचा hash 60 characters चा असतो; 255 पुढच्या जास्त मजबूत hashes साठी जागा ठेवतो.
  6. फक्त app साठी user बनवा, placeholder च्या जागी तुमचा स्वतःचा password टाका:

    CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'YOUR_APP_PASSWORD';
    GRANT SELECT, INSERT ON insta.users TO 'appuser'@'localhost';
    
  7. appuser insta.users मधल्या rows वाचू आणि जोडू शकतो, बाकी काही नाही. तो table drop करू शकत नाही किंवा दुसरे databases बघू शकत नाही.

  8. SHOW GRANTS FOR 'appuser'@'localhost'; ने तपासा. appuser म्हणून login असताना DROP TABLE users; चालवून बघा, ERROR 1142 ... DROP command denied येतो.
  9. exit;

5. Connection च्या चार values

का: connection उघडायला PHP ला कळायला हवं की database कुठे आहे, login कोण करतंय, कोणत्या password ने, आणि कोणता database वापरायचा. एक value जरी चुकली तरी काहीच save होत नाही.

काय:

  1. Server name: MariaDB कुठे चालतो. इथे तो PHP च्याच EC2 server वर आहे, म्हणून localhost.
  2. User name: appuser.
  3. Password: CREATE USER मध्ये ठेवलेला.
  4. Database: insta.

Classroom line

The database is on the same server as PHP, so we call it localhost.

Classroom line

localhost is a domain name; its IP is 127.0.0.1.

कसं: PHP मध्ये चार values म्हणजे चार variables, आणि एक ओळ connection उघडते:

$servername = "localhost";
$username   = "appuser";
$password   = "YOUR_APP_PASSWORD";
$database   = "insta";
$conn = new mysqli($servername, $username, $password, $database);
  1. localhost म्हणजे नेहमी "हीच machine". त्याचा address 127.0.0.1.
  2. localhost दिलं तर mysqli MariaDB च्या local socket file मधून connect होतो. 127.0.0.1 दिलं तर TCP port 3306 वापरतो. दोन्ही त्याच database पर्यंत पोहोचतात.
  3. Database कधी स्वतःच्या वेगळ्या server वर गेला (उदा. Amazon RDS), तर फक्त $servername बदलतो, त्या server च्या address ने.
Database पर्यंत पोहोचायला PHP ला लागणाऱ्याचार values $servername = "localhost"; MariaDB कुठे चालतो. PHP च्याच server वर, म्हणून localhost (त्याचाIP 127.0.0.1). $username = "appuser"; फक्त या app साठी बनवलेला database user. root नाही. $password = "YOUR_APP_PASSWORD"; त्या user चा password. इथे placeholder: CREATE USER मध्येठेवलेला टाका. $database = "insta"; users table असलेला database. SHOW DATABASES; ने तपासा $conn = new mysqli($servername, $username, $password,$database); एक EC2 server php-fpm signup.php localhost · 127.0.0.1 MariaDB insta.users एक value चुकली तरी connection fail: Access denied for user, किंवा Unknowndatabase.

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 ठरवतात.

काय:

  1. action="signup.php": data घेणारी file. ती PHP file च्या नावाशी अगदी तंतोतंत जुळली पाहिजे, capital आणि small अक्षरांसकट.
  2. method="POST": data request च्या body मधून पाठवा.
  3. प्रत्येक 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.

कसं:

  1. 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>
    
  2. type="password" अक्षरांऐवजी dots दाखवतो. required आणि minlength="8" मुळे browser पाठवायच्या आधी fields तपासतो.

  3. http://SERVER-IP/register.html उघडा. थोडी CSS styling असलेलं version खालच्या screenshot सारखं दिसतं; महत्त्वाचे आहेत form tag आणि inputs ची names.
A Create Account form with three labelled boxes, Name (Enter your name), Email (Enter your email) and Password (Enter your password), and a blue Register button.

Whiteboard: nginx ने serve केलेला registration form: Name, Email आणि Password fields आणि Register button.

  1. कोणत्याही 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.

  1. Source मध्ये <form ...> ची ओळ शोधा आणि आधी action आणि method तपासा.
Browser source view, lines 80 to 96: body, div class register-box, h2 Create Account, then line 85 form action="signup.php" method="POST", followed by a form-group div with label for name and an input of type text, id name, name name, placeholder Enter your name, required.

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.

कसं:

  1. आपल्या form साठी $_POST मध्ये तीन entries असतात: 'name' => 'Asha', 'email' => 'asha@example.com', 'password' => 'MySecret123'.
  2. प्रत्येक value तिच्या key ने काढा:

    $name  = trim($_POST["name"] ?? "");
    $email = trim($_POST["email"] ?? "");
    $pass  = $_POST["password"] ?? "";
    
  3. Field नसेल तर ?? "" warning ऐवजी रिकामा string देतो.

  4. trim() name आणि email च्या आधी किंवा नंतर चुकून टाइप झालेले spaces काढतो.
  5. PHP मधली key HTML मधल्या name पेक्षा वेगळ्या spelling ची असेल (name="email" साठी $_POST["Email"]), तर value सरळ रिकामी येते.
प्रत्येक input चं name $_POST मध्ये key बनतं register.html मध्ये <form action="signup.php" method="POST"> <input type="text" name="name"> <input type="email" name="email"> <input type="password" name="password"> </form> Request च्या body मध्ये जातं name=Asha email=asha%40example.com password=MySecret123 signup.php ला काय मिळतं $_POST = [ 'name' => 'Asha', 'email' => 'asha@example.com', 'password' => 'MySecret123', ]; प्रत्येक value तिच्या key ने काढा $name = $_POST['name']; $email = $_POST['email']; $pass = $_POST['password']; Array म्हणजे एक variable ज्यात अनेक values असतात, प्रत्येकआपल्या key खाली. HTML मधलं name=... आणि PHP मधली key यात spelling फरक असेल तर valueरिकामी येते.

Figure 4. प्रत्येक input चं name $_POST मध्ये key बनतं: request body मधलं name=Asha signup.php मध्ये $_POST['name'] बनतं.

8. signup.php, सुरक्षित पद्धतीने

का: तुमच्या database मध्ये काय पडतं ते ही file ठरवते. दोन नियम तिला सुरक्षित करतात:

  1. Form data SQL text मध्ये कधीच चिकटवू नका. Query "... VALUES ('$name', ...)" अशी बनवली, तर name field मध्ये टाइप केलेला quote तुमचा string संपवतो आणि उरलेलं SQL म्हणून चालतं. याला SQL injection म्हणतात. Prepared statement आधी SQL पाठवतो, प्रत्येक value साठी ? ठेवून, आणि values वेगळ्या, म्हणून त्या कधीच data शिवाय दुसरं काही होऊ शकत नाहीत.
  2. Password स्वतः कधीच store करू नका. password_hash() त्याचा one-way hash बनवतो. Table, backup किंवा leak झालेली copy वाचणाऱ्याला फक्त hashes दिसतात.

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.";
    }
}

वरपासून खालपर्यंत वाचा:

  1. Section 5 मधल्या connection च्या चार values.
  2. signup.php ला आलेली GET (कोणी त्याचा URL टाइप केला तर) form कडे परत पाठवली जाते.
  3. तीन values $_POST मधून काढल्या जातात आणि तपासल्या जातात: name, valid email, किमान 8 characters चा password. Browser पण तपासतो, पण browser कोणीही टाळू शकतो, म्हणून server परत तपासतो.
  4. mysqli_report(...) मुळे database ची प्रत्येक error exception बनते, जी catch block सांभाळतो.
  5. password_hash($pass, PASSWORD_DEFAULT) hash बनवतो, $2y$ ने सुरू होणारा 60 characters चा text.
  6. prepare() तीन ? सह SQL पाठवतो. bind_param("sss", ...) तीन strings जोडतो, प्रत्येक ? साठी एक, क्रमाने. execute() तो चालवतो.
  7. Error 1062 म्हणजे UNIQUE email ची duplicate entry: user ला स्पष्ट message मिळतो.
  8. बाकी कोणतीही error तुमच्यासाठी PHP error log मध्ये जाते, आणि visitor ला साधा message दिसतो. Database चे details page वर कधीच दिसत नाहीत.
Form data SQL मध्ये कधीच चिकटवू नका: preparedstatement वापरा SQL text मध्ये चिकटवलेलं $sql = "INSERT INTO users (name, email, password)VALUES ('$name', '$email', '$pass')"; $conn->query($sql); कोणीतरी name म्हणून हे टाइप करतं: x'); DROP TABLE users; -- Quote तुमचा string संपवतो आणि उरलेलं SQL म्हणून चालतं. Passwordसुद्धा जसा टाइप केला तसाच store होतो. Prepared statement $stmt = $conn->prepare("INSERT INTO users (name, email,password) VALUES (?, ?, ?)"); $hash = password_hash($pass, PASSWORD_DEFAULT); $stmt->bind_param("sss", $name, $email, $hash); $stmt->execute(); आधी SQL ठरतो, प्रत्येक value साठी ?. Values वेगळ्या जातात, म्हणूनतेच name name column मध्ये साधा text म्हणून store होतं. sss: तीन strings, प्रत्येक ? साठी एक. तपासलं: ते name text म्हणून save झालं, आणि users table जसाच्यातसा होता.

Figure 5. चिकटवलेल्या SQL मध्ये टाइप केलेला quote command बदलू शकतो; prepared statement आधी SQL ठरवतो आणि values वेगळ्या पाठवतो, म्हणून तोच text साधं name म्हणून store होतो.

Hash store करा, password स्वतः कधीच नाही जसा टाइप केला तसा store (चुकीचं) 1 Asha asha@example.com MySecret123 Table वाचू शकणाऱ्या कोणालाही प्रत्येक password दिसतो: copy केलेला backup, leak झालेला dump, उत्सुक admin. लोक तेचpassword सगळीकडे वापरतात, म्हणून एक leak त्यांचे email आणि bankaccounts पण उघडतो. signup.php hash store करतो $hash = password_hash('MySecret123', PASSWORD_DEFAULT); // $2y$12$GscnGr53N2GXU/ebcR2WgOk... (60 characters) 1 Asha asha@example.com $2y$12$GscnGr53N2GXU/ebcR... One way: hash पासून परत password बनत नाही. तोच password दोनदा hashकेला तरी वेगळा text येतो (आत random salt असतो). ColumnVARCHAR(255) ठेवा. login.php password_verify ने तपासतो password_verify('MySecret123', $user['password']) //true -> Welcome, Asha! password_verify('wrong', $user['password']) // false ->Wrong email or password. Prepared statement ने email वरून row आणा, मग PHP लाcompare करू द्या. WHERE password = ... ने कधीच compare करू नका: store केलेला texthash आहे, password नाही. चुकीचा email आणि चुकीचा password यासाठी एकच message दाखवा.

Figure 6. Animation: जसा टाइप केला तसा store केलेला password table असणाऱ्या कोणालाही वाचता येतो; password_hash() 60 characters चा one-way hash store करतो; password_verify() login त्याच्याशी तपासतो.

9. पूर्ण flow test करा

का: "बरोबर दिसणारा" form काहीच सिद्ध करत नाही. एक registration table पर्यंत पूर्ण follow करा.

कसं:

  1. http://SERVER-IP/register.html उघडा, Asha, asha@example.com आणि 8 किंवा जास्त characters चा password भरा, आणि Register दाबा.
  2. Page Registration successful. Log in दाखवतं. Address bar मध्ये फक्त /signup.php, data नाही.
  3. मागे जा आणि तोच email परत register करा. Page An account with this email already exists. दाखवतं.
  4. mysql -u root -p ने database कडून तपासा:

    USE insta;
    SELECT id, name, email, password FROM users;
    
  5. Asha ची row आहे, आणि password column मध्ये password नाही, $2y$12$GscnGr53N2GXU/ebcR2Wg... सारखं काहीतरी आहे.

  6. दुसऱ्या व्यक्तीला register करा. तिचा id 3 आहे, 2 नाही: fail झालेल्या duplicate insert ने id 2 वापरला, AUTO_INCREMENT table मधल्या कोणत्याही fail झालेल्या insert सारखं.
  7. Name म्हणून x'); DROP TABLE users; -- टाइप करून register करा. ते साधं name म्हणून save होतं, आणि users जसाच्या तसा आहे. हेच prepared statement चं काम.
एक registration, सुरुवातीपासून शेवटपर्यंत 1. Browser nginx कडे register.html मागतो. Browser → nginx /usr/share/nginx/html nginx तो त्याच्या web root मध्ये शोधतो आणि form पाठवतो. साध्या.html files PHP पर्यंत जातच नाहीत. GET /register.html -> 200 OK, the Create Account form 2. Register: browser POST /signup.php पाठवतो. nginx → php-fpm signup.php nginx प्रत्येक .php file php-fpm कडे देतो, जो $_POST मधल्या formdata सह signup.php चालवतो. $_POST['name'] = 'Asha' $_POST['email'] ='asha@example.com' $_POST['password'] = '...' 3. signup.php connect होतो आणि prepared statement ने rowटाकतो. php-fpm → MariaDB insta.users MariaDB ती store करतो; browser ला Registration successful मिळतं. | id | name | email | password (hash) | | 1 | Asha | asha@example.com |$2y$12$GscnGr53N2GXU/ebcR... | Database कडून तपासा: SELECT * FROM users; नवीन row दाखवतो.

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.";
}
  1. Query row फक्त email वरून शोधते. WHERE password = '...' कधीच लिहू नका: column मध्ये hash आहे, password नाही.
  2. password_verify($pass, $user["password"]) टाइप केलेला password त्याच पद्धतीने hash करून compare करतो. True म्हणजे password बरोबर.
  3. चुकीचा email आणि चुकीचा password यांना एकच message मिळतो, म्हणजे कोणते emails registered आहेत ते form वापरून कोणाला शोधता येत नाही.
  4. Name मध्ये < किंवा quotes असले तरी htmlspecialchars() ते सुरक्षितपणे दाखवतो.
  5. Test: बरोबर password Welcome, Asha! देतो; चुकीचा Wrong email or password. देतो.
  6. खरं 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.

Prompts कसे लिहायचे:

  1. एका prompt ला एक file, आणि सगळ्याची नावं द्या. Form साठी: Create a registration form in HTML with name, email and password fields that sends the data with POST to signup.php.
  2. मग 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.
  3. make a signup page सारख्या अर्धवट prompt ने assistant file चं नाव, fields, database आणि table चा अंदाज लावतो, आणि ते अंदाज दुरुस्त करण्यात जास्त वेळ जातो.

Classroom line

You must learn how to prompt.

मिळालेल्या code मध्ये काय बदलायचं:

  1. Connection च्या चार values. Assistant your_username, your_database किंवा enter your password सारखे placeholders लिहितो. ते तसेच कधीच चालत नाहीत.
  2. Database, table आणि column names. ती SHOW DATABASES; आणि DESC users; मधून घ्या.
  3. Form चा action तुम्ही खरंच save करणार असलेल्या PHP file च्या नावाशी जुळला पाहिजे.
  4. Safety: code variables string मध्ये चिकटवून SQL बनवत असेल, किंवा $_POST["password"] सरळ store करत असेल, तर prepared statement आणि password_hash() मागा, किंवा स्वतः बदला.
  5. Test करा, मग SELECT * FROM users;.

Classroom line

ChatGPT doesn't give you this; it just says 'enter your password'.

Code सुरक्षित ठेवा:

  1. Web root मधली .php file चालवली जाते, दाखवली जात नाही, म्हणून तिच्यातला database password server वरच राहतो.
  2. /usr/share/nginx/html मध्ये signup.txt किंवा signup.php.bak सारखी copy कधीच ठेवू नका: nginx त्या साध्या text म्हणून पाठवतो, password सकट. Code share करायचा तर terminal मधून copy करा किंवा scp वापरा.
  3. तुमचा खरा database password AI chat मध्ये कधीच paste करू नका. Placeholder वापरा आणि server वरच तो भरा.
AI assistant वापरताना: पूर्ण prompt, मगplaceholders बदला अर्धवट prompt make a signup page Assistant file चं नाव, fields, database आणि table चा अंदाज लावतो.अर्धी माहिती, अर्धा result. पूर्ण prompts, एका वेळी एक file Create a registration form in HTML with name, email andpassword that sends the data with POST to signup.php. Create signup.php for it: PHP mysqli, database insta,table users(name, email, password), preparedstatements, password_hash(), and an error if the emailexists. मग assistant ला माहीत नसलेलं बदला 1. चार connection values 2. Database, table, column names 3. action file च्या नावाशी जुळतो 4. Test, मग SELECT * FROM users; enter your password किंवा your_database सारखे placeholders तसेच कधीचचालत नाहीत. Save करण्याआधी प्रत्येक ओळ वाचा.

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.

  1. register.html ला 404 Not Found: file चुकीच्या folder मध्ये आहे. Amazon Linux वर nginx /usr/share/nginx/html serve करतो. /var/www/html हा Apache चा folder (आणि Ubuntu वर nginx चा), म्हणून तिथली file इथे 404 देते. ls /usr/share/nginx/html ने तपासा.
  2. Register काहीच करत नाही, किंवा 405 Not Allowed: form ला action नाही. तो नसेल तर browser data परत register.html लाच पाठवतो; method="POST" असेल तर nginx साध्या .html file ला आलेली POST 405 ने नाकारतो. action="signup.php" जोडा.
  3. टाइप केलेला data, password सुद्धा, URL मध्ये दिसतो: form ला method नाही, म्हणून तो GET वापरतो. method="POST" जोडा.

Classroom line

It's sending the data in the URL; change the HTML and use method.

  1. signup.php ला 404 Not Found: file चं नाव action पेक्षा वेगळं आहे: signup.html, Signup.php, sigup.php. Linux मध्ये file names case-sensitive असतात.
  2. 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.
  3. Something went wrong, आणि log मध्ये Access denied for user 'appuser'@'localhost' किंवा Unknown database: एखादी connection value MariaDB मध्ये बनवलेल्याशी जुळत नाही.
  4. Log मध्ये Unknown column 'fullname' किंवा Table 'insta.user' doesn't exist: INSERT तुमच्या table मध्ये नसलेली names वापरतोय. ती DESC users; मधून घ्या.
  5. 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 चं नाव देऊन वाचा.
माझा form का चालत नाही? या क्रमाने तपासा register.html ला 404 Not Found कारण चुकीचा folder, उदा. /var/www/html उपाय /usr/share/nginx/html मध्ये ठेवा काहीच होत नाही, किंवा 405 Not Allowed कारण Form ला action नाही उपाय form tag वर action=signup.php Password URL मध्ये दिसतो कारण Form ला method नाही, म्हणून GET उपाय form tag वर method=POST signup.php ला 404 Not Found कारण File चं नाव action पेक्षा वेगळं उपाय तेच spelling आणि case: signup.php 500 error किंवा कोरं page कारण PHP चा MySQL driver नाही (mysqli) उपाय yum install php-mysqlnd, php-fpm restart Access denied / Unknown database कारण Connection values जुळत नाहीत उपाय MariaDB मध्ये ठेवलेल्याच values Unknown column / Table doesn't exist कारण चुकीची table किंवा column names उपाय DESC users; मधून names घ्या तरी अडकलात? Logs वाचा: /var/log/nginx/error.log आणि/var/log/php-fpm/www-error.log

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 बिघडला तर कोणती कडी तपासायची ते कळतं.

  1. तीन 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 बिघडतो.
  2. 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.
  3. 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 वाचू शकत नाही.
  4. 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 च्या प्रॉब्लेमपासून वेगळे होतात.
  5. 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 पकडतो.
  6. एक 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 मध्ये कधीच दिसत नाही.
  7. 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 होत नाहीत.
  8. Instance stop करा
    • करा: EC2 console → Instance state → Stop instance.
    • Check करा: State Stopped.
    • का: या server वर तीन services सतत चालतात. Stop केल्याने free-tier hours वाचतात; database disk वर राहतो.

14. पूर्ण class एका page वर

  1. GET काहीतरी मागतो आणि data URL मधून नेतो; POST server ला data request च्या body मधून देतो.
  2. Form ला action="signup.php" (data घेणारी file), method="POST", आणि प्रत्येक input वर name लागतं.
  3. $_POST हा array आहे: $_POST["email"] म्हणजे email नावाच्या input ची value.
  4. Stack sudo service nginx|mariadb|php-fpm start ने सुरू करा; Amazon Linux वर nginx /usr/share/nginx/html serve करतो.
  5. MariaDB शी बोलायला PHP ला php-mysqlnd लागतो; install केल्यावर फक्त php-fpm restart करा.
  6. users(id, name, email UNIQUE, password VARCHAR(255)), आणि GRANT SELECT, INSERT ON insta.users असलेला appuser, root कधीच नाही.
  7. Connection च्या चार values: localhost (127.0.0.1), user, password, database.
  8. Prepared statement: prepare("... VALUES (?, ?, ?)"), bind_param("sss", ...), execute().
  9. Store करताना password_hash(), login करताना password_verify().
  10. SELECT * FROM users; ने तपासा. Duplicate email error 1062 देतो आणि एक id वापरतो.
  11. AI assistants: पूर्ण prompts, मग placeholders, names आणि action दुरुस्त करा; खरे passwords कधीच paste करू नका.
  12. बिघडलेला form: folder, action, method, file चं नाव, driver, connection values, table आणि column names, मग logs.

15. Try at home

Try at home

Task 1: stack

  1. nginx, MariaDB आणि php-fpm सुरू करा, आणि /usr/share/nginx/html मधून एक index.html आणि एक index.php उघडा.
  2. php-mysqlnd install करा, php-fpm restart करा, आणि php -m ने mysqli आहे का ते बघा.

Task 2: registration

  1. insta.users आणि फक्त SELECT आणि INSERT असलेला appuser बनवा.
  2. register.html आणि signup.php बनवा, दोन users register करा, आणि SELECT ने hashes बघा.
  3. तोच email दोनदा register करा आणि पुढच्या नवीन user चा id लक्षात घ्या.

Task 3: मुद्दाम बिघडवा

  1. Form मधून method="POST" काढा आणि register करा: password कुठे गेला?
  2. action काढा, मग signup.php चं नाव Signup.php करा. प्रत्येक error लिहून ठेवा.
  3. $password मध्ये चुकीचा password टाका आणि /var/log/php-fpm/www-error.log मध्ये message शोधा.

Task 4: login आणि एक जास्तीचं field

  1. password_verify() सह login.html आणि login.php बनवा, आणि बरोबर आणि चुकीचा password test करा.
  2. AI assistant ला form आणि signup.php दोन्हींमध्ये phone field जोडायला सांगा. ALTER TABLE ने column जोडा, प्रत्येक placeholder दुरुस्त करा, आणि test करा.

Recap

थोडक्यात

  1. GET server कडे काहीतरी मागतो; POST data request च्या body मधून पाठवतो, म्हणून password असलेला form नेहमी method="POST" वापरतो.
  2. Form चा action data घेणाऱ्या PHP file चं नाव सांगतो, आणि प्रत्येक input चं name $_POST array मध्ये key बनतं.
  3. nginx /usr/share/nginx/html serve करतो आणि .php php-fpm कडे देतो; php-mysqlnd मुळे PHP MariaDB पर्यंत पोहोचतो, आणि तो install केल्यावर फक्त php-fpm restart लागतो.
  4. PHP चार values ने connect होतो: localhost (127.0.0.1), फक्त app साठीचा user, त्याचा password आणि insta database.
  5. signup.php prepared statement आणि password_hash() वापरतो; login.php email वरून row शोधतो आणि password_verify() ने तपासतो.
  6. SELECT * FROM users; ने test करा आणि duplicate email करून बघा.
  7. AI assistant ला पूर्ण prompts द्या, मग त्याचे placeholders बदला आणि प्रत्येक name तपासा.
  8. बिघडलेला form बहुतेक folder, action, method, file चं नाव, driver, connection value किंवा column name मुळे असतो; nginx आणि php-fpm चे logs कोणतं ते सांगतात.

सराव Tasks

या scenario बद्दल

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 करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Service चालू आहे का ते पाहा

का: Site बंद असेल तर आधी web server चालू आहे का ते पाहा.

काय करायचं: httpd service चं status दाखवा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Ubuntu वर package install करा

का: Ubuntu apt वापरतं. Package नावं वेगळी: Ubuntu वर Apache म्हणजे apache2.

काय करायचं: Ubuntu वर apache2 package confirm न विचारता install करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. 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 करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. 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).

कसं करायचं:
  1. Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
  2. SQL statement step by step लिहा: काय, कुठून, कोणते rows.
  3. Statement ; ने संपवा.
  4. 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).

कसं करायचं:
  1. Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
  2. SQL statement step by step लिहा: काय, कुठून, कोणते rows.
  3. Statement ; ने संपवा.
  4. Check answer दाबा. Query table च्या practice copy वर चालते.

मध्यम nginx config test करा

का: Restart मुळे site बंद पडण्याआधी test चुका पकडतो.

काय करायचं: nginx configuration files मधल्या चुका तपासा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम Service आत्ता व boot ला सुरू करा

का: enable reboot नंतर सुरू करतो; --now आत्ताच सुरू करतो.

काय करायचं: nginx service enable करा व लगेच सुरू करा, एका command ने.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. 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 करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम एकूण sales

का: RDS setup नंतर database query करणं रोजचं काम.

काय करायचं: सगळ्या order amounts ची बेरीज.

Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).

कसं करायचं:
  1. Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
  2. SQL statement step by step लिहा: काय, कुठून, कोणते rows.
  3. Statement ; ने संपवा.
  4. 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).

कसं करायचं:
  1. Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
  2. SQL statement step by step लिहा: काय, कुठून, कोणते rows.
  3. Statement ; ने संपवा.
  4. 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).

कसं करायचं:
  1. Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
  2. SQL statement step by step लिहा: काय, कुठून, कोणते rows.
  3. Statement ; ने संपवा.
  4. Check answer दाबा. Query table च्या practice copy वर चालते.

उजळणी, तुलना आणि मुलाखत cards

हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.

उजळणी card: Forms मध्ये GET vs POST. Sign-up form passwords पाठवतो. ते URL मध्ये दिसू नयेत. GET data URL मध्ये टाकतो. POST request body मध्ये पाठवतो. Data पाठवणाऱ्या किंवा बदलणाऱ्या forms वर method="post". Form:
उजळणी card: Forms मध्ये GET vs POST · PNG download करा
उजळणी card: PHP मध्ये $_POST. User ने form मध्ये type केलेलं PHP ला वाचता यायला हवं. $_POST म्हणजे submit केलेल्या values चा array, प्रत्येक input च्या name ने. प्रत्येक input ला name द्या, मग $_POST['name'] वाचा. Input आणि PHP:
उजळणी card: PHP मध्ये $_POST · PNG download करा
उजळणी card: Prepared statements. User input SQL मध्ये चिकटवल्यास attackers स्वतःचा SQL चालवतात (SQL injection). Prepared statement ? placeholders सोबत SQL आणि values वेगळ्या पाठवतो. prepare, bind_param, execute. SQL:
उजळणी card: Prepared statements · PNG download करा
उजळणी card: password_hash ने passwords ठेवा. Database leak झाला तर साधे passwords लगेच चोरीला. password_hash one-way hash बनवतो. password_verify login त्याच्याशी तपासतो. Sign-up ला hash, login ला verify. साधा text कधीच ठेवू नका. PHP:
उजळणी card: password_hash ने passwords ठेवा · PNG download करा
तुलना: GET vs POST. GET: Server कडे काहीतरी मागतो; data URL मध्ये. POST: Request body मध्ये server ला data पाठवतो.
तुलना: GET vs POST · PNG download करा
मुलाखत card: Login form ने GET नाही, POST का वापरावा?. GET password URL, browser history आणि server logs मध्ये टाकतो. POST body मध्ये पाठवतो, HTTPS सोबत encrypted. GET leak: /login.php?pass=Secret123.
मुलाखत card: Login form ने GET नाही, POST का वापरावा? · PNG download करा
मुलाखत card: SQL injection म्हणजे काय, कसं टाळता?. तुमचा SQL बदलणारं input, उदा. ' OR 1=1 --. Password शिवाय login किंवा पूर्ण table dump होऊ शकतं. ? placeholders सोबत prepared statements वापरा.
मुलाखत card: SQL injection म्हणजे काय, कसं टाळता? · PNG download करा
मुलाखत card: Passwords encrypt ऐवजी hash का करायचे?. Hash उलटा करता येत नाही; encryption key ने decrypt होतं. तुम्हालाही password वाचायची गरज नाही, फक्त तपासायची. PHP:
मुलाखत card: Passwords encrypt ऐवजी hash का करायचे? · PNG download करा
मुलाखत card: Form submit होतो पण काही save होत नाही. काय तपासता?. action आणि method, input names, DB credentials, php-mysqlnd, आणि PHP error log. Chain मधली प्रत्येक कडी शांतपणे fail होऊ शकते. Log:
मुलाखत card: Form submit होतो पण काही save होत नाही. काय तपासता? · PNG download करा

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