সম্পূর্ণ CRUD API — POST, PUT, DELETE

লেসন ৩৭ / ৩৯

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"