My first API using native PHP
Ahmed AbdElLatif
Posted on April 9, 2021
I tried to create my first API while exercising OOP using php, and here what I achieved, take live look here!
First things First!
I created env.php which includes class Environment
to parse my own .env file through public function getDatabaseVariables()
in order to capture database variables
#Database#
HOST = "localhost"
DATABASE_SERVICE = "mysql"
DATABASE_NAME = "example_db"
DATABASE_USERNAME = "example_user"
DATABASE_PASSWORD = "example_password"
I followed the below approach to parse .env file using preg_match to detect the first line.
$validate_line_from_env_file = preg_match('~^[a-zA-Z]~',$line);
then make use of explode
and strpos
to catch variable in an associative array as following:
$env_file_text = explode('= "',$line);
$env_variable_key_length = strpos($env_file_text[0]," ");
$env_variable_key = substr($env_file_text[0],0,$env_variable_key_length);
$env_variable_value_length = strpos($env_file_text[1],"\"");
$env_variable_value = substr($env_file_text[1],0,$env_variable_value_length);
if ($env_variable_value == true)
{
$this->variables += [$env_variable_key => $env_variable_value];
}
else if ($env_variable_value === "")
{
$this->variables += [$env_variable_key => ""];
}
Then those variables are passed to class Database
that extends class Environment
where the __construct()
function store the required variables, after that a database connection will be created using PDO
.
Query the items
The database connection function is being called through __construct()
function of class Museum
, where the query statement exists
public function getMuseums()
{
$sqlQuery = "SELECT id, mname, arabic_name, city, type, est_year, website, coordinates, wikipedia_url FROM " . $this->db_table;
$statement = $this->conn->prepare($sqlQuery);
$statement->execute();
return $statement;
}
Finally!
query is being executed in read.php which present api result in json format.
$statement = $items->getMuseums();
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
$itemCount = $statement->rowCount();
//prepare array for json format
if ($itemCount > 0){
$museumArray = array();
$museumArray["itemCount"] = $itemCount;
$museumArray["body"] = $result;
echo json_encode($museumArray);
}
else
{
http_response_code(404);
echo json_encode(
array("message" => "No record found.")
);
last piece: I added the following .htaccess code to prevent accessing other routes except .api/read.php
Order deny,allow
Deny from all
<Files "read.php">
Allow from all
</Files>
Output sample
You can check this api
on github
or visit the live version
Thanks for your time reading my article!
Posted on April 9, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.