Conversation

Your input fuels progress! Share your tips or experiences on prioritizing mental wellness at work. Let's inspire change together!

Join the discussion and share your insights now!

Comments: 0

Sharpen your coding skills—try JavaScript challenges on TOOLX now!

advertisement

How to Create REST APIs in Pure PHP Without Any Framework

How to Create REST APIs in Pure PHP Without Any Framework

When people think of building REST APIs, they often imagine Laravel, CodeIgniter, Lumen, or Symfony. But what if you need something lightweight, fast, and without dependencies?

In this guide, we’ll show you how to create RESTful APIs using only core PHP — no frameworks, no Composer packages — just raw, powerful control.

What is a REST API?

A REST API (Representational State Transfer) is a way to access and manipulate resources (like users, posts, or products) using standard HTTP methods:

  • GET: Fetch data
  • POST: Create new data
  • PUT or PATCH: Update existing data
  • DELETE: Remove data

🗂️ Folder Structure

/restapi
  ├── index.php
  ├── db.php
  ├── .htaccess
  └── UserController.php


Step 1: Create the Database - restapi

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE
);


Step 2: Database Connection – db.php

<?php
function connectDB() {
    $host = 'localhost';
    $db = 'restapi';
    $user = 'root';
    $pass = '';
    $charset = 'utf8mb4';

    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    try {
        return new PDO($dsn, $user, $pass, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]);
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(['error' => 'Database connection failed']);
        exit;
    }
}
?>


Step 3: Handle Routes – index.php

<?php
header("Content-Type: application/json");
require_once 'db.php';
require_once 'UserController.php';
// require_once 'EmployeeController.php'; use for multiple apis

$method = $_SERVER['REQUEST_METHOD'];

$basePath = str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME']));
$requestUri = str_replace($basePath, '', $_SERVER['REQUEST_URI']);
$uri = explode('/', trim($requestUri, '/'));
if (!isset($uri[0])) {
    http_response_code(404);
    echo json_encode(['error' => 'No resource specified']);
    exit;
}

$resource = $uri[0];
$id = $uri[1] ?? null;
$db = connectDB();

// Dispatch based on resource
switch ($resource) {
    case 'users':
        $controller = new UserController($db);
        break;
    case 'employees':
        $controller = new EmployeeController($db);
        break;
    default:
        http_response_code(404);
        echo json_encode(['error' => 'Invalid resource']);
        exit;
}

// Handle methods
switch ($method) {
    case 'GET':
        echo $id ? $controller->{"get" . ucfirst(rtrim($resource, 's'))}($id)
                 : $controller->{"getAll" . ucfirst($resource)}();
        break;

    case 'POST':
        $data = json_decode(file_get_contents("php://input"), true);
        echo $controller->{"create" . ucfirst(rtrim($resource, 's'))}($data);
        break;

    case 'PUT':
        $data = json_decode(file_get_contents("php://input"), true);
        echo $controller->{"update" . ucfirst(rtrim($resource, 's'))}($id, $data);
        break;

    case 'DELETE':
        echo $controller->{"delete" . ucfirst(rtrim($resource, 's'))}($id);
        break;

    default:
        http_response_code(405);
        echo json_encode(['error' => 'Method not allowed']);
}


Step 4: Controller Logic – UserController.php

<?php
class UserController {
    private $db;

    public function __construct($db) {
        $this->db = $db;
    }

    public function getAllUsers() {
        $stmt = $this->db->query("SELECT * FROM users");
        return json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));
    }

    public function getUser($id) {
        $stmt = $this->db->prepare("SELECT * FROM users WHERE id = ?");
        $stmt->execute([$id]);
        $user = $stmt->fetch(PDO::FETCH_ASSOC);
        return $user ? json_encode($user) : json_encode(['error' => 'User not found']);
    }

    public function createUser($data) {
        if (!isset($data['name'], $data['email'])) {
            http_response_code(400);
            return json_encode(['error' => 'Name and Email required']);
        }
        $stmt = $this->db->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
        $stmt->execute([$data['name'], $data['email']]);
        return json_encode(['success' => 'User created']);
    }

    public function updateUser($id, $data) {
        $stmt = $this->db->prepare("UPDATE users SET name = ?, email = ? WHERE id = ?");
        $stmt->execute([$data['name'], $data['email'], $id]);
        return json_encode(['success' => 'User updated']);
    }

    public function deleteUser($id) {
        $stmt = $this->db->prepare("DELETE FROM users WHERE id = ?");
        $stmt->execute([$id]);
        return json_encode(['success' => 'User deleted']);
    }
}
?>


Step 5: .htaccess (inside /restapi)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]


✅ Sample URLs to Test in Postman:

🟢 Get All Users:
GET http://localhost/restapi/users


🟢 Get Single User:
GET http://localhost/restapi/users/1


🟢 Create User:
POST http://localhost/restapi/users
Body (raw JSON):
{
  "name": "Zia",
  "email": "zia@texvn.com"
}


🟢 Update User:
PUT http://localhost/restapi/users/1
Body (raw JSON):
{
  "name": "Zia Fida",
  "email": "ziafida@toolx.com"
}


🔴 Delete User:
DELETE http://localhost/restapi/users/1


Final Thoughts

You don’t need a big framework to build powerful APIs. Using pure PHP, you can create lightweight, fast, and scalable REST APIs — perfect for internal tools, microservices, or when you're just starting out.


php PHP API without composer PHP CRUD API PHP API routing without framework REST API PHP MySQL PHP API using POSTMAN how to make REST API in PHP REST API with core PHP

advertisement