Input Helper
function getInput(): array {
$raw = file_get_contents("php://input");
return json_decode($raw, true) ?: [];
}
function respond(int $code, array $data): void {
http_response_code($code);
echo json_encode($data, JSON_UNESCAPED_UNICODE);
exit;
}
Method Routing
<?php
header("Content-Type: application/json; charset=utf-8");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
if ($_SERVER["REQUEST_METHOD"] === "OPTIONS") exit;
require "config/db.php";
$conn = DB::get();
$method = $_SERVER["REQUEST_METHOD"];
$id = (int)($_GET["id"] ?? 0);
switch ($method) {
case "GET": $id ? getOne($conn, $id) : getAll($conn); break;
case "POST": createProduct($conn); break;
case "PUT": if (!$id) respond(400, ["error"=>"ID দরকার"]); updateProduct($conn, $id); break;
case "DELETE": if (!$id) respond(400, ["error"=>"ID দরকার"]); deleteProduct($conn, $id); break;
default: respond(405, ["error"=>"Method allowed না"]);
}
GET Functions
function getAll(mysqli $conn): void {
$limit = min(100, max(1, (int)($_GET["limit"] ?? 20)));
$offset = max(0, (int)($_GET["offset"] ?? 0));
$total = $conn->query("SELECT COUNT(*) c FROM products")->fetch_assoc()["c"];
$stmt = $conn->prepare("SELECT * FROM products ORDER BY id DESC LIMIT ? OFFSET ?");
$stmt->bind_param("ii", $limit, $offset);
$stmt->execute();
$rows = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
respond(200, [
"success" => true,
"data" => $rows,
"meta" => ["total" => (int)$total, "limit" => $limit, "offset" => $offset]
]);
}
function getOne(mysqli $conn, int $id): void {
$stmt = $conn->prepare("SELECT * FROM products WHERE id=?");
$stmt->bind_param("i", $id);
$stmt->execute();
$p = $stmt->get_result()->fetch_assoc();
if (!$p) respond(404, ["success"=>false, "error"=>"পাওয়া যায়নি"]);
respond(200, ["success"=>true, "data"=>$p]);
}
POST — Create
function createProduct(mysqli $conn): void {
$data = getInput();
$errors = [];
if (empty($data["name"])) $errors["name"] = "নাম দিন";
if (!isset($data["price"]) || $data["price"] < 0) $errors["price"] = "সঠিক দাম দিন";
if ($errors) respond(422, ["success"=>false, "fields"=>$errors]);
$name = trim($data["name"]);
$price = (float)$data["price"];
$stock = (int)($data["stock"] ?? 0);
$desc = $data["description"] ?? "";
$stmt = $conn->prepare("INSERT INTO products (name, price, stock, description) VALUES (?,?,?,?)");
$stmt->bind_param("sdis", $name, $price, $stock, $desc);
if (!$stmt->execute()) respond(500, ["error"=>"DB ভুল"]);
$newId = $conn->insert_id;
$new = $conn->query("SELECT * FROM products WHERE id=$newId")->fetch_assoc();
respond(201, ["success"=>true, "data"=>$new, "message"=>"তৈরি হয়েছে"]);
}
PUT — Update
function updateProduct(mysqli $conn, int $id): void {
$data = getInput();
$stmt = $conn->prepare("SELECT id FROM products WHERE id=?");
$stmt->bind_param("i", $id);
$stmt->execute();
if (!$stmt->get_result()->fetch_assoc()) respond(404, ["error"=>"পাওয়া যায়নি"]);
if (empty($data["name"]) || !isset($data["price"])) {
respond(422, ["error"=>"name ও price আবশ্যক"]);
}
$name = trim($data["name"]);
$price = (float)$data["price"];
$stock = (int)($data["stock"] ?? 0);
$desc = $data["description"] ?? "";
$stmt = $conn->prepare("UPDATE products SET name=?, price=?, stock=?, description=? WHERE id=?");
$stmt->bind_param("sdisi", $name, $price, $stock, $desc, $id);
$stmt->execute();
$updated = $conn->query("SELECT * FROM products WHERE id=$id")->fetch_assoc();
respond(200, ["success"=>true, "data"=>$updated, "message"=>"Update হয়েছে"]);
}
DELETE
function deleteProduct(mysqli $conn, int $id): void {
$stmt = $conn->prepare("DELETE FROM products WHERE id=?");
$stmt->bind_param("i", $id);
$stmt->execute();
if ($stmt->affected_rows === 0) respond(404, ["error"=>"পাওয়া যায়নি"]);
respond(200, ["success"=>true, "message"=>"মুছে গেছে", "id"=>$id]);
}
Test (curl)
# GET সব
curl http://localhost/api/products.php
# GET একটি
curl "http://localhost/api/products.php?id=1"
# POST
curl -X POST http://localhost/api/products.php \
-H "Content-Type: application/json" \
-d '{"name":"কলম","price":50,"stock":100}'
# PUT
curl -X PUT "http://localhost/api/products.php?id=1" \
-H "Content-Type: application/json" \
-d '{"name":"নতুন","price":60}'
# DELETE
curl -X DELETE "http://localhost/api/products.php?id=5"