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!
Top comments (0)