PHP ও MySQL: সিনট্যাক্স, ফর্ম ডেটা, SQL CRUD ও নিরাপদ কুয়েরি
সংক্ষেপে মনে রাখুন
দ্রুত রিভিশনের জন্য মূল কথা
- PHP-র মৌলিক সিনট্যাক্স, Superglobal ও include/require-এর পার্থক্য বলতে পারা
- CREATE, INSERT, SELECT, UPDATE, DELETE কুয়েরি সঠিকভাবে লিখতে পারা
- mysqli ও Prepared statement দিয়ে ফর্মের ডেটা ডেটাবেসে নিরাপদে রাখতে পারা
ফর্মের method যা, superglobal-ও তাই: method="get" হলে $_GET, method="post" হলে $_POST। PHP-তে variable $ দিয়ে…
UPDATE বা DELETE-এ WHERE না দিলে টেবিলের সব row বদলে বা মুছে যায়। DELETE সব row মুছলেও টেবিল থাকে, DROP TABLE টেবিলটিই মুছে দেয়। ইনপুট সরাসরি query-তে জুড়লে SQL injection হয়, তাই prepared statement ব্যবহার করুন।
PHP কী
PHP (PHP: Hypertext Preprocessor) একটি Server-side scripting ভাষা। কোড সার্ভারে চলে, ব্রাউজারে যায় শুধু ফলাফল (HTML)। তৈরি করেন Rasmus Lerdorf।
- ফাইল .php; কোড থাকে
<?php ... ?>-এর ভেতরে। - প্রতিটি স্টেটমেন্ট শেষ হয় সেমিকোলন (;) দিয়ে।
- ভ্যারিয়েবল শুরু হয় $ দিয়ে:
$name। ভ্যারিয়েবলের নাম case-sensitive ($Nameও$nameআলাদা)। - আউটপুট:
echoবাprint।
স্থানীয়ভাবে চালানো: XAMPP
- XAMPP = X (cross-platform) + Apache + MariaDB/MySQL + PHP + Perl।
- ফাইল রাখতে হয়
htdocsফোল্ডারে, ব্রাউজারে খুলতে হয়http://localhost/ফাইলের-নাম.php। - ডেটাবেস ম্যানেজ করার ওয়েব টুল phpMyAdmin।
- ডিফল্ট পোর্ট: Apache 80, MySQL 3306।
- Windows-এ WAMP, Linux-এ LAMP একই ধরনের স্ট্যাক।
স্ট্রিং, অ্যারে ও লুপ
<?php
$name = "Karim";
echo "Hello $name"; // Hello Karim (ডাবল কোটে ভ্যারিয়েবলের মান বসে)
echo 'Hello $name'; // Hello $name (সিঙ্গেল কোটে বসে না)
echo "Hello " . $name; // জোড়া লাগাতে ডট (.)
$fruits = ["আম", "জাম", "কাঁঠাল"]; // indexed array
$age = ["Rahim" => 25, "Karim" => 30]; // associative array
echo count($fruits); // 3
foreach ($age as $person => $years) {
echo "$person: $years<br>";
}
?>ফর্মের ডেটা ও Superglobal
| Superglobal | কী থাকে |
|---|---|
$_GET | URL-এর query string থেকে আসা ডেটা |
$_POST | POST method-এ পাঠানো ফর্ম ডেটা |
$_REQUEST | GET, POST ও COOKIE একসাথে |
$_SESSION | এক ব্যবহারকারীর জন্য সার্ভারে রাখা ডেটা (session_start() লাগে) |
$_COOKIE | ব্রাউজারে রাখা কুকি |
$_FILES | আপলোড করা ফাইল |
$_SERVER | সার্ভার ও রিকোয়েস্টের তথ্য |
ফর্মে <input name="email"> থাকলে POST-এ মান পাওয়া যাবে $_POST['email']-এ।
include বনাম require
include: ফাইল না পেলে Warning দেয়, স্ক্রিপ্ট চলতে থাকে।require: ফাইল না পেলে Fatal error, স্ক্রিপ্ট থেমে যায়।include_once/require_once: একই ফাইল একবারের বেশি যুক্ত করে না।
MySQL ও SQL
MySQL একটি RDBMS: ডেটা থাকে টেবিলে, সারি (row/record) ও কলাম (field) আকারে।
CREATE DATABASE office;
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
salary DECIMAL(10,2),
joined DATE
);
INSERT INTO employees (name, salary, joined)
VALUES ('Rahim', 25000, '2025-01-15');
SELECT name, salary FROM employees
WHERE salary >= 20000
ORDER BY salary DESC
LIMIT 5;
UPDATE employees SET salary = 27000 WHERE id = 1;
DELETE FROM employees WHERE id = 1;- DDL (কাঠামো): CREATE, ALTER, DROP, TRUNCATE।
- DML (ডেটা): INSERT, UPDATE, DELETE; SELECT দিয়ে ডেটা পড়া হয়।
- PRIMARY KEY: প্রতিটি সারিকে আলাদা করে চেনায়; NULL বা ডুপ্লিকেট হতে পারে না।
- AUTO_INCREMENT: নতুন সারিতে নিজে থেকেই পরের নম্বর বসে।
- সংখ্যা ছোট থেকে বড়
ORDER BY ... ASC(ডিফল্ট), বড় থেকে ছোটDESC।
PHP থেকে MySQL: নিরাপদ উপায়
<?php
$conn = mysqli_connect("localhost", "root", "", "office");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// Prepared statement: ইনপুট আলাদাভাবে পাঠানো হয়, তাই SQL Injection হয় না
$stmt = $conn->prepare("INSERT INTO employees (name, salary) VALUES (?, ?)");
$stmt->bind_param("sd", $_POST['name'], $_POST['salary']); // s = string, d = double
$stmt->execute();
$result = $conn->query("SELECT name, salary FROM employees");
while ($row = $result->fetch_assoc()) {
echo $row['name'] . " - " . $row['salary'] . "<br>";
}
?>- XAMPP-এ ডিফল্ট ব্যবহারকারী
root, পাসওয়ার্ড ফাঁকা; বাস্তব সার্ভারে অবশ্যই শক্ত পাসওয়ার্ড দিতে হয়। - পুরনো
mysql_*ফাংশন PHP 7-এ সরিয়ে দেওয়া হয়েছে; এখন mysqli বা PDO। - ব্যবহারকারীর পাসওয়ার্ড সরাসরি না রেখে
password_hash()দিয়ে রাখতে হয়, লগইনে মেলাতেpassword_verify()।
SQL Injection কেন হয়
"SELECT * FROM users WHERE user = '" . $_POST['user'] . "'" লিখলে কেউ ইনপুটে ' OR '1'='1 দিলে শর্ত সবসময় সত্য হয়ে যায়। Prepared statement-এ ইনপুট শুধু মান হিসেবে যায়, কুয়েরির অংশ হয় না।
পরীক্ষায় যা আসে
- PHP server-side; ভ্যারিয়েবল শুরু $ দিয়ে; স্ট্রিং জোড়া ডট (.)।
- ফাইল না পেলে require স্ক্রিপ্ট থামায়, include থামায় না।
- MySQL-এর ডিফল্ট পোর্ট 3306।
- টেবিলের সব ডেটা পড়া:
SELECT * FROM table_name;। - SQL Injection ঠেকাতে Prepared statement।
পরীক্ষার ফাঁদ
UPDATEবাDELETE-এ WHERE না দিলে টেবিলের সব সারি বদলে বা মুছে যায়।DELETEসারি মোছে কিন্তু টেবিল থাকে;DROP TABLEপুরো টেবিলই মুছে দেয়;TRUNCATEসব সারি একবারে খালি করে।- PHP-তে জোড়া লাগাতে
+নয়, `.`। - সিঙ্গেল কোটের ভেতরে
$nameলিখলে মান বসে না।
পরের ধাপ
এই টপিকে ৫টি প্রশ্ন অনুশীলন করুন
পড়া মনে আছে কি না, ছোট একটি সেটে দেখে নিন। প্রতিটি উত্তরের সাথে ব্যাখ্যা থাকবে, আর ভুল প্রশ্নগুলো রিভিশনের তালিকায় যাবে