Simple PHP MySQL Rest API Sample Example Tutorial

By | February 5, 2016

In this article, we will look at a very basic rest api implementation using PHP.

If you are to build server infrastructure for any of your new website or app, I would recommend to use rest implementation for your server database access.

Rest APIs are really useful when you have to make several different calls to MySQL database or when making several GET, POST requests on server. For example for saving data, reading, updating etc.
Lets begin with a simple implementation:

STEP-1) Create a new directory named MY_API.

STEP-2) Now create a new file named .htaccess (Please note that file has an extention of .htaccess) and copy the code below:

<IfModule mod_rewrite.c>
    RewriteEngine On

	RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-s
	RewriteRule ^(.*)$ api.php?rquest=$1 [QSA,NC,L]

	RewriteCond %{REQUEST_FILENAME} -d
	RewriteRule ^(.*)$ api.php [QSA,NC,L]

	RewriteCond %{REQUEST_FILENAME} -s
	RewriteRule ^(.*)$ api.php [QSA,NC,L]	
</IfModule>

STEP-3) Now create another file in the same directory with the name, Rest.inc.php and copy the below content:

<?php
	/* File : Rest.inc.php
	*/
	class REST {
		
		public $_allow = array();
		public $_content_type = "application/json";
		public $_request = array();
		
		private $_method = "";		
		private $_code = 200;
		
		public function __construct(){
			$this->inputs();
		}
		
		public function get_referer(){
			return $_SERVER['HTTP_REFERER'];
		}
		
		public function response($data,$status){
			$this->_code = ($status)?$status:200;
			$this->set_headers();
			echo $data;
			exit;
		}
		
		private function get_status_message(){
			$status = array(
						100 => 'Continue',  
						101 => 'Switching Protocols',  
						200 => 'OK',
						201 => 'Created',  
						202 => 'Accepted',  
						203 => 'Non-Authoritative Information',  
						204 => 'No Content',  
						205 => 'Reset Content',  
						206 => 'Partial Content',  
						300 => 'Multiple Choices',  
						301 => 'Moved Permanently',  
						302 => 'Found',  
						303 => 'See Other',  
						304 => 'Not Modified',  
						305 => 'Use Proxy',  
						306 => '(Unused)',  
						307 => 'Temporary Redirect',  
						400 => 'Bad Request',  
						401 => 'Unauthorized',  
						402 => 'Payment Required',  
						403 => 'Forbidden',  
						404 => 'Not Found',  
						405 => 'Method Not Allowed',  
						406 => 'Not Acceptable',  
						407 => 'Proxy Authentication Required',  
						408 => 'Request Timeout',  
						409 => 'Conflict',  
						410 => 'Gone',  
						411 => 'Length Required',  
						412 => 'Precondition Failed',  
						413 => 'Request Entity Too Large',  
						414 => 'Request-URI Too Long',  
						415 => 'Unsupported Media Type',  
						416 => 'Requested Range Not Satisfiable',  
						417 => 'Expectation Failed',  
						500 => 'Internal Server Error',  
						501 => 'Not Implemented',  
						502 => 'Bad Gateway',  
						503 => 'Service Unavailable',  
						504 => 'Gateway Timeout',  
						505 => 'HTTP Version Not Supported');
			return ($status[$this->_code])?$status[$this->_code]:$status[500];
		}
		
		public function get_request_method(){
			return $_SERVER['REQUEST_METHOD'];
		}
		
		private function inputs(){
			switch($this->get_request_method()){
				case "POST":
					$this->_request = $this->cleanInputs($_POST);
					break;
				case "GET":
				case "DELETE":
					$this->_request = $this->cleanInputs($_GET);
					break;
				case "PUT":
					parse_str(file_get_contents("php://input"),$this->_request);
					$this->_request = $this->cleanInputs($this->_request);
					break;
				default:
					$this->response('',406);
					break;
			}
		}		
		
		private function cleanInputs($data){
			$clean_input = array();
			if(is_array($data)){
				foreach($data as $k => $v){
					$clean_input[$k] = $this->cleanInputs($v);
				}
			}else{
				if(get_magic_quotes_gpc()){
					$data = trim(stripslashes($data));
				}
				$data = strip_tags($data);
				$clean_input = trim($data);
			}
			return $clean_input;
		}		
		
		private function set_headers(){
			header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
			header("Content-Type:".$this->_content_type);
		}
	}	
?>

The above two files were simply necessary like any other library files. Lets create a working php script which will be used as your main file to write server scripts.

STEP-4) Create another file named api.php and copy the below code:


<?php
    
require_once("Rest.inc.php");
	
class API extends REST {
	
	public $data = "";
	//Enter details of your database
	const DB_SERVER = "localhost";
	const DB_USER = "user";
	const DB_PASSWORD = "db_password";
	const DB = "my_db";
	
	private $db = NULL;

	public function __construct(){
		parent::__construct();				// Init parent contructor
		$this->dbConnect();			       // Initiate Database connection
}
	
private function dbConnect(){
		$this->db = mysql_connect(self::DB_SERVER,self::DB_USER,self::DB_PASSWORD);
		if($this->db)
			mysql_select_db(self::DB,$this->db);
}
	
	/*
	 * Public method for access api.
	 * This method dynmically call the method based on the query string
	 *
	 */
public function processApi(){
		$func = strtolower(trim(str_replace("/","",$_REQUEST['rquest'])));
		if((int)method_exists($this,$func) > 0)
			$this->$func();
		else
			$this->response('Error code 404, Page not found',404);	// If the method not exist with in this class, response would be "Page not found".
}
private function hello(){
	echo str_replace("this","that","HELLO WORLD!!");

}
	

private function test(){	
	// Cross validation if the request method is GET else it will return "Not Acceptable" status
	if($this->get_request_method() != "GET"){
		$this->response('',406);
	}
	$myDatabase= $this->db;// variable to access your database
	$param=$this->_request['var'];
	// If success everythig is good send header as "OK" return param
	$this->response($param, 200);	
}

	
	/*
	 *	Encode array into JSON
	*/
	private function json($data){
		if(is_array($data)){
			return json_encode($data);
		}
	}
}

	// Initiiate Library
	
	$api = new API;
	$api->processApi();
?>

In the file api.php, provide your MySQL database details in the variables as shown below:

const DB_SERVER = “localhost”;
const DB_USER = “user”;
const DB_PASSWORD = “db_password”;
const DB = “my_db”;

There are two functions defined in api.php,
1) test(){} – For testing GET METHOD
2) hello({} – For simply printing hello world.

Our Rest API Implementation is finished. You can simply call the above two functions using the urls as follows:

http://yourweb.com/MY_API/hello
Output: HELLO WORLD

http://yourweb.com/MY_API/test?var=testing_get_method
Output: testing_get_method

Similarly you can create your own methods in the api.php with any definition and access the methods in the manner shown above.

Thank you for reading this article, I hope it helps somebody.

11,381 total views, 123 views today

(Visited 9,500 times, 9 visits today)
  • Didi

    public function processApi(){
    [1] $func = strtolower(trim(str_replace(“/”,””,$_REQUEST[‘rquest’])));
    if((int)method_exists($this,$func) > 0)
    $this->$func();
    else
    $this->response(‘Error code 404, Page not found’,404); // If the method not exist with in this class, response would be “Page not found”.
    }
    “Notice: Undefined index:”

    [1] $name = “NULL”;
    if (isset($_REQUEST[‘rquest’])) {
    $name = $_REQUEST[‘rquest’];
    }
    $func = strtolower(trim(str_replace(“/”,””, $name)));

    • Raúl

      public function processApi(){
      if (isset($_REQUEST[‘rquest’])) {
      $func = strtolower(trim(str_replace(“/”,””,$_REQUEST[‘rquest’])));
      } else {
      $func = ”;
      }

  • NonZero

    there is some error.

    • Raúl

      The error occurs because not defined “request” in the Array _REQUEST.
      The ideal is to assess the value of the _REQUEST Variable

      public function processApi(){
      if (isset($_REQUEST[‘rquest’])) {
      $func = strtolower(trim(str_replace(“/”,””,$_REQUEST[‘rquest’])));
      } else {
      $func = ”;
      }

  • Ashutosh Parashar

    Hii when i hit the url localhost/MY_API/hello i get object not found error what is the error in the code ??