Repository: bradtraversy/php_rest_myblog
Branch: master
Commit: 424976f85b3d
Files: 18
Total size: 26.0 KB
Directory structure:
gitextract_ja1r27dk/
├── .gitignore
├── README.md
├── ajaxCall.html
├── ajaxCall.js
├── api/
│ ├── category/
│ │ ├── create.php
│ │ ├── delete.php
│ │ ├── read.php
│ │ ├── read_single.php
│ │ └── update.php
│ └── post/
│ ├── create.php
│ ├── delete.php
│ ├── read.php
│ ├── read_single.php
│ └── update.php
├── config/
│ └── Database.php
├── models/
│ ├── Category.php
│ └── Post.php
└── myblog.sql
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
jtest.js
================================================
FILE: README.md
================================================
# PHP REST API
> This is a simple PHP REST API from scratch with no framework.
## Quick Start
Import the myblog.sql file, change the params in the config/Database.php file to your own
## App Info
### Author
Brad Traversy
[Traversy Media](http://www.traversymedia.com)
### Version
1.0.0
### License
This project is licensed under the MIT License
================================================
FILE: ajaxCall.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" type="text/javascript"></script>
<script src="ajaxCall.js"></script>
<style>
body {
text-align: center;
font-family: "Helvetica", sans-serif;
}
h1 {
font-size: 2em;
font-weight: bold;
}
.box {
border-radius: 5px;
background-color: #eee;
padding: 20px 5px;
}
button {
color: white;
background-color: #4791d0;
border-radius: 5px;
border: 1px solid #4791d0;
padding: 5px 10px 8px 10px;
}
button:hover {
background-color: #0F5897;
border: 1px solid #0F5897;
}
</style>
</head>
<body>
<div style="float:left; width:50%;">
<h1>Data Finder</h1>
<p class="message box"> The message will go here </p>
<p><button id="getMessage"> Get Message </button></p>
</div>
<div style="float:right; width:50%;">
<h1>Data Sender</h1>
<form id="apiform">
<input type="text" name="title" placeholder="title" autocomplete="on" ><br>
<textarea name="body" id="" cols="30" rows="10" placeholder="body" autocomplete="on" ></textarea><br>
<input type="text" name="author" placeholder="author" autocomplete="on" ><br>
<input type="text" name="category_id" placeholder="category_id" autocomplete="on" ><br><br>
<button id="postMessage"> Post Message </button>
</form>
</div>
</body>
</html>
================================================
FILE: ajaxCall.js
================================================
//POST REQUEST
$(document).ready(function(){
$('#postMessage').click(function(e){
e.preventDefault();
//serialize form data
var url = $('form').serialize();
//function to turn url to an object
function getUrlVars(url) {
var hash;
var myJson = {};
var hashes = url.slice(url.indexOf('?') + 1).split('&');
for (var i = 0; i < hashes.length; i++) {
hash = hashes[i].split('=');
myJson[hash[0]] = hash[1];
}
return JSON.stringify(myJson);
}
//pass serialized data to function
var test = getUrlVars(url);
//post with ajax
$.ajax({
type:"POST",
url: "/Work folders/OOP php/RESTFUL traversy/php_rest_myblog/api/post/create.php",
data: test,
ContentType:"application/json",
success:function(){
alert('successfully posted');
},
error:function(){
alert('Could not be posted');
}
});
});
});
//GET REQUEST
document.addEventListener('DOMContentLoaded',function(){
document.getElementById('getMessage').onclick=function(){
var req;
req=new XMLHttpRequest();
req.open("GET", '/Work folders/OOP php/RESTFUL traversy/php_rest_myblog/api/post/read.php',true);
req.send();
req.onload=function(){
var json=JSON.parse(req.responseText);
//limit data called
var son = json.filter(function(val) {
return (val.id >= 4);
});
var html = "";
//loop and display data
son.forEach(function(val) {
var keys = Object.keys(val);
html += "<div class = 'cat'>";
keys.forEach(function(key) {
html += "<strong>" + key + "</strong>: " + val[key] + "<br>";
});
html += "</div><br>";
});
//append in message class
document.getElementsByClassName('message')[0].innerHTML=html;
};
};
});
================================================
FILE: api/category/create.php
================================================
<?php
// Headers
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Access-Control-Allow-Headers, Content-Type, Access-Control-Allow-Methods, Authorization,X-Requested-With');
include_once '../../config/Database.php';
include_once '../../models/Category.php';
// Instantiate DB & connect
$database = new Database();
$db = $database->connect();
// Instantiate blog post object
$category = new Category($db);
// Get raw posted data
$data = json_decode(file_get_contents("php://input"));
$category->name = $data->name;
// Create Category
if($category->create()) {
echo json_encode(
array('message' => 'Category Created')
);
} else {
echo json_encode(
array('message' => 'Category Not Created')
);
}
================================================
FILE: api/category/delete.php
================================================
<?php
// Headers
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: DELETE');
header('Access-Control-Allow-Headers: Access-Control-Allow-Headers, Content-Type, Access-Control-Allow-Methods, Authorization,X-Requested-With');
include_once '../../config/Database.php';
include_once '../../models/Category.php';
// Instantiate DB & connect
$database = new Database();
$db = $database->connect();
// Instantiate blog post object
$category = new Category($db);
// Get raw posted data
$data = json_decode(file_get_contents("php://input"));
// Set ID to UPDATE
$category->id = $data->id;
// Delete post
if($category->delete()) {
echo json_encode(
array('message' => 'Category deleted')
);
} else {
echo json_encode(
array('message' => 'Category not deleted')
);
}
================================================
FILE: api/category/read.php
================================================
<?php
// Headers
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
include_once '../../config/Database.php';
include_once '../../models/Category.php';
// Instantiate DB & connect
$database = new Database();
$db = $database->connect();
// Instantiate category object
$category = new Category($db);
// Category read query
$result = $category->read();
// Get row count
$num = $result->rowCount();
// Check if any categories
if($num > 0) {
// Cat array
$cat_arr = array();
$cat_arr['data'] = array();
while($row = $result->fetch(PDO::FETCH_ASSOC)) {
extract($row);
$cat_item = array(
'id' => $id,
'name' => $name
);
// Push to "data"
array_push($cat_arr['data'], $cat_item);
}
// Turn to JSON & output
echo json_encode($cat_arr);
} else {
// No Categories
echo json_encode(
array('message' => 'No Categories Found')
);
}
================================================
FILE: api/category/read_single.php
================================================
<?php
// Headers
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
include_once '../../config/Database.php';
include_once '../../models/Category.php';
// Instantiate DB & connect
$database = new Database();
$db = $database->connect();
// Instantiate blog category object
$category = new Category($db);
// Get ID
$category->id = isset($_GET['id']) ? $_GET['id'] : die();
// Get post
$category->read_single();
// Create array
$category_arr = array(
'id' => $category->id,
'name' => $category->name
);
// Make JSON
print_r(json_encode($category_arr));
================================================
FILE: api/category/update.php
================================================
<?php
// Headers
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: PUT');
header('Access-Control-Allow-Headers: Access-Control-Allow-Headers, Content-Type, Access-Control-Allow-Methods, Authorization,X-Requested-With');
include_once '../../config/Database.php';
include_once '../../models/Category.php';
// Instantiate DB & connect
$database = new Database();
$db = $database->connect();
// Instantiate blog post object
$category = new Category($db);
// Get raw posted data
$data = json_decode(file_get_contents("php://input"));
// Set ID to UPDATE
$category->id = $data->id;
$category->name = $data->name;
// Update post
if($category->update()) {
echo json_encode(
array('message' => 'Category Updated')
);
} else {
echo json_encode(
array('message' => 'Category not updated')
);
}
================================================
FILE: api/post/create.php
================================================
<?php
// Headers
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Access-Control-Allow-Headers,Content-Type,Access-Control-Allow-Methods, Authorization, X-Requested-With');
include_once '../../config/Database.php';
include_once '../../models/Post.php';
// Instantiate DB & connect
$database = new Database();
$db = $database->connect();
// Instantiate blog post object
$post = new Post($db);
// Get raw posted data
$data = json_decode(file_get_contents("php://input"));
$post->title = $data->title;
$post->body = $data->body;
$post->author = $data->author;
$post->category_id = $data->category_id;
// Create post
if($post->create()) {
echo json_encode(
array('message' => 'Post Created')
);
} else {
echo json_encode(
array('message' => 'Post Not Created')
);
}
================================================
FILE: api/post/delete.php
================================================
<?php
// Headers
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: DELETE');
header('Access-Control-Allow-Headers: Access-Control-Allow-Headers,Content-Type,Access-Control-Allow-Methods, Authorization, X-Requested-With');
include_once '../../config/Database.php';
include_once '../../models/Post.php';
// Instantiate DB & connect
$database = new Database();
$db = $database->connect();
// Instantiate blog post object
$post = new Post($db);
// Get raw posted data
$data = json_decode(file_get_contents("php://input"));
// Set ID to update
$post->id = $data->id;
// Delete post
if($post->delete()) {
echo json_encode(
array('message' => 'Post Deleted')
);
} else {
echo json_encode(
array('message' => 'Post Not Deleted')
);
}
================================================
FILE: api/post/read.php
================================================
<?php
// Headers
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
include_once '../../config/Database.php';
include_once '../../models/Post.php';
// Instantiate DB & connect
$database = new Database();
$db = $database->connect();
// Instantiate blog post object
$post = new Post($db);
// Blog post query
$result = $post->read();
// Get row count
$num = $result->rowCount();
// Check if any posts
if($num > 0) {
// Post array
$posts_arr = array();
// $posts_arr['data'] = array();
while($row = $result->fetch(PDO::FETCH_ASSOC)) {
extract($row);
$post_item = array(
'id' => $id,
'title' => $title,
'body' => html_entity_decode($body),
'author' => $author,
'category_id' => $category_id,
'category_name' => $category_name
);
// Push to "data"
array_push($posts_arr, $post_item);
// array_push($posts_arr['data'], $post_item);
}
// Turn to JSON & output
echo json_encode($posts_arr);
} else {
// No Posts
echo json_encode(
array('message' => 'No Posts Found')
);
}
================================================
FILE: api/post/read_single.php
================================================
<?php
// Headers
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
include_once '../../config/Database.php';
include_once '../../models/Post.php';
// Instantiate DB & connect
$database = new Database();
$db = $database->connect();
// Instantiate blog post object
$post = new Post($db);
// Get ID
$post->id = isset($_GET['id']) ? $_GET['id'] : die();
// Get post
$post->read_single();
// Create array
$post_arr = array(
'id' => $post->id,
'title' => $post->title,
'body' => $post->body,
'author' => $post->author,
'category_id' => $post->category_id,
'category_name' => $post->category_name
);
// Make JSON
print_r(json_encode($post_arr));
================================================
FILE: api/post/update.php
================================================
<?php
// Headers
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: PUT');
header('Access-Control-Allow-Headers: Access-Control-Allow-Headers,Content-Type,Access-Control-Allow-Methods, Authorization, X-Requested-With');
include_once '../../config/Database.php';
include_once '../../models/Post.php';
// Instantiate DB & connect
$database = new Database();
$db = $database->connect();
// Instantiate blog post object
$post = new Post($db);
// Get raw posted data
$data = json_decode(file_get_contents("php://input"));
// Set ID to update
$post->id = $data->id;
$post->title = $data->title;
$post->body = $data->body;
$post->author = $data->author;
$post->category_id = $data->category_id;
// Update post
if($post->update()) {
echo json_encode(
array('message' => 'Post Updated')
);
} else {
echo json_encode(
array('message' => 'Post Not Updated')
);
}
================================================
FILE: config/Database.php
================================================
<?php
class Database {
// DB Params
private $host = 'localhost';
private $db_name = 'myblog';
private $username = 'root';
private $password = '';
private $conn;
// DB Connect
public function connect() {
$this->conn = null;
try {
$this->conn = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->db_name, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo 'Connection Error: ' . $e->getMessage();
}
return $this->conn;
}
}
================================================
FILE: models/Category.php
================================================
<?php
class Category {
// DB Stuff
private $conn;
private $table = 'categories';
// Properties
public $id;
public $name;
public $created_at;
// Constructor with DB
public function __construct($db) {
$this->conn = $db;
}
// Get categories
public function read() {
// Create query
$query = 'SELECT
id,
name,
created_at
FROM
' . $this->table . '
ORDER BY
created_at DESC';
// Prepare statement
$stmt = $this->conn->prepare($query);
// Execute query
$stmt->execute();
return $stmt;
}
// Get Single Category
public function read_single(){
// Create query
$query = 'SELECT
id,
name
FROM
' . $this->table . '
WHERE id = ?
LIMIT 0,1';
//Prepare statement
$stmt = $this->conn->prepare($query);
// Bind ID
$stmt->bindParam(1, $this->id);
// Execute query
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// set properties
$this->id = $row['id'];
$this->name = $row['name'];
}
// Create Category
public function create() {
// Create Query
$query = 'INSERT INTO ' .
$this->table . '
SET
name = :name';
// Prepare Statement
$stmt = $this->conn->prepare($query);
// Clean data
$this->name = htmlspecialchars(strip_tags($this->name));
// Bind data
$stmt-> bindParam(':name', $this->name);
// Execute query
if($stmt->execute()) {
return true;
}
// Print error if something goes wrong
printf("Error: $s.\n", $stmt->error);
return false;
}
// Update Category
public function update() {
// Create Query
$query = 'UPDATE ' .
$this->table . '
SET
name = :name
WHERE
id = :id';
// Prepare Statement
$stmt = $this->conn->prepare($query);
// Clean data
$this->name = htmlspecialchars(strip_tags($this->name));
$this->id = htmlspecialchars(strip_tags($this->id));
// Bind data
$stmt-> bindParam(':name', $this->name);
$stmt-> bindParam(':id', $this->id);
// Execute query
if($stmt->execute()) {
return true;
}
// Print error if something goes wrong
printf("Error: $s.\n", $stmt->error);
return false;
}
// Delete Category
public function delete() {
// Create query
$query = 'DELETE FROM ' . $this->table . ' WHERE id = :id';
// Prepare Statement
$stmt = $this->conn->prepare($query);
// clean data
$this->id = htmlspecialchars(strip_tags($this->id));
// Bind Data
$stmt-> bindParam(':id', $this->id);
// Execute query
if($stmt->execute()) {
return true;
}
// Print error if something goes wrong
printf("Error: $s.\n", $stmt->error);
return false;
}
}
================================================
FILE: models/Post.php
================================================
<?php
class Post {
// DB stuff
private $conn;
private $table = 'posts';
// Post Properties
public $id;
public $category_id;
public $category_name;
public $title;
public $body;
public $author;
public $created_at;
// Constructor with DB
public function __construct($db) {
$this->conn = $db;
}
// Get Posts
public function read() {
// Create query
$query = 'SELECT c.name as category_name, p.id, p.category_id, p.title, p.body, p.author, p.created_at
FROM ' . $this->table . ' p
LEFT JOIN
categories c ON p.category_id = c.id
ORDER BY
p.created_at DESC';
// Prepare statement
$stmt = $this->conn->prepare($query);
// Execute query
$stmt->execute();
return $stmt;
}
// Get Single Post
public function read_single() {
// Create query
$query = 'SELECT c.name as category_name, p.id, p.category_id, p.title, p.body, p.author, p.created_at
FROM ' . $this->table . ' p
LEFT JOIN
categories c ON p.category_id = c.id
WHERE
p.id = ?
LIMIT 0,1';
// Prepare statement
$stmt = $this->conn->prepare($query);
// Bind ID
$stmt->bindParam(1, $this->id);
// Execute query
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// Set properties
$this->title = $row['title'];
$this->body = $row['body'];
$this->author = $row['author'];
$this->category_id = $row['category_id'];
$this->category_name = $row['category_name'];
}
// Create Post
public function create() {
// Create query
$query = 'INSERT INTO ' . $this->table . ' SET title = :title, body = :body, author = :author, category_id = :category_id';
// Prepare statement
$stmt = $this->conn->prepare($query);
// Clean data
$this->title = htmlspecialchars(strip_tags($this->title));
$this->body = htmlspecialchars(strip_tags($this->body));
$this->author = htmlspecialchars(strip_tags($this->author));
$this->category_id = htmlspecialchars(strip_tags($this->category_id));
// Bind data
$stmt->bindParam(':title', $this->title);
$stmt->bindParam(':body', $this->body);
$stmt->bindParam(':author', $this->author);
$stmt->bindParam(':category_id', $this->category_id);
// Execute query
if($stmt->execute()) {
return true;
}
// Print error if something goes wrong
printf("Error: %s.\n", $stmt->error);
return false;
}
// Update Post
public function update() {
// Create query
$query = 'UPDATE ' . $this->table . '
SET title = :title, body = :body, author = :author, category_id = :category_id
WHERE id = :id';
// Prepare statement
$stmt = $this->conn->prepare($query);
// Clean data
$this->title = htmlspecialchars(strip_tags($this->title));
$this->body = htmlspecialchars(strip_tags($this->body));
$this->author = htmlspecialchars(strip_tags($this->author));
$this->category_id = htmlspecialchars(strip_tags($this->category_id));
$this->id = htmlspecialchars(strip_tags($this->id));
// Bind data
$stmt->bindParam(':title', $this->title);
$stmt->bindParam(':body', $this->body);
$stmt->bindParam(':author', $this->author);
$stmt->bindParam(':category_id', $this->category_id);
$stmt->bindParam(':id', $this->id);
// Execute query
if($stmt->execute()) {
return true;
}
// Print error if something goes wrong
printf("Error: %s.\n", $stmt->error);
return false;
}
// Delete Post
public function delete() {
// Create query
$query = 'DELETE FROM ' . $this->table . ' WHERE id = :id';
// Prepare statement
$stmt = $this->conn->prepare($query);
// Clean data
$this->id = htmlspecialchars(strip_tags($this->id));
// Bind data
$stmt->bindParam(':id', $this->id);
// Execute query
if($stmt->execute()) {
return true;
}
// Print error if something goes wrong
printf("Error: %s.\n", $stmt->error);
return false;
}
}
================================================
FILE: myblog.sql
================================================
CREATE TABLE `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
INSERT INTO `categories` (`id`, `name`) VALUES
(1, 'Technology'),
(2, 'Gaming'),
(3, 'Auto'),
(4, 'Entertainment'),
(5, 'Books');
CREATE TABLE `posts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) NOT NULL,
`title` varchar(255) NOT NULL,
`body` text NOT NULL,
`author` varchar(255) NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
INSERT INTO `posts` (`id`, `category_id`, `title`, `body`, `author`) VALUES
(1, 1, 'Technology Post One', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut interdum est nec lorem mattis interdum. Cras augue est, interdum eu consectetur et, faucibus vel turpis. Etiam pulvinar, enim quis elementum iaculis, tortor sapien eleifend eros, vitae rutrum augue quam sed leo. Vivamus fringilla, diam sit amet vestibulum vulputate, urna risus hendrerit arcu, vitae fringilla odio justo vulputate neque. Nulla a massa sed est vehicula rhoncus sit amet quis libero. Integer euismod est quis turpis hendrerit, in feugiat mauris laoreet. Vivamus nec laoreet neque. Cras condimentum aliquam nunc nec maximus. Cras facilisis eros quis leo euismod pharetra sed cursus orci.','Sam Smith'),
(2, 2, 'Gaming Post One', 'Adipiscing elit. Ut interdum est nec lorem mattis interdum. Cras augue est, interdum eu consectetur et, faucibus vel turpis. Etiam pulvinar, enim quis elementum iaculis, tortor sapien eleifend eros, vitae rutrum augue quam sed leo. Vivamus fringilla, diam sit amet vestibulum vulputate, urna risus hendrerit arcu, vitae fringilla odio justo vulputate neque. Nulla a massa sed est vehicula rhoncus sit amet quis libero. Integer euismod est quis turpis hendrerit, in feugiat mauris laoreet. Vivamus nec laoreet neque.','Kevin Williams'),
(3, 1, 'Technology Post Two', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut interdum est nec lorem mattis interdum. Cras augue est, interdum eu consectetur et, faucibus vel turpis. Etiam pulvinar, enim quis elementum iaculis, tortor sapien eleifend eros, vitae rutrum augue quam sed leo. Vivamus fringilla, diam sit amet vestibulum vulputate, urna risus hendrerit arcu, vitae fringilla odio justo vulputate neque. Nulla a massa sed est vehicula rhoncus sit amet quis libero. Integer euismod est quis turpis hendrerit, in feugiat mauris laoreet. Vivamus nec laoreet neque. Cras condimentum aliquam nunc nec maximus. Cras facilisis eros quis leo euismod pharetra sed cursus orci.','Sam Smith'),
(4, 4, 'Entertainment Post One', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut interdum est nec lorem mattis interdum. Cras augue est, interdum eu consectetur et, faucibus vel turpis. Etiam pulvinar, enim quis elementum iaculis, tortor sapien eleifend eros, vitae rutrum augue quam sed leo. Vivamus fringilla, diam sit amet vestibulum vulputate, urna risus hendrerit arcu, vitae fringilla odio justo vulputate neque. Nulla a massa sed est vehicula rhoncus sit amet quis libero. Integer euismod est quis turpis hendrerit, in feugiat mauris laoreet. Vivamus nec laoreet neque. Cras condimentum aliquam nunc nec maximus. Cras facilisis eros quis leo euismod pharetra sed cursus orci.','Mary Jackson'),
(5, 4, 'Entertainment Post Two', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut interdum est nec lorem mattis interdum. Cras augue est, interdum eu consectetur et, faucibus vel turpis. Etiam pulvinar, enim quis elementum iaculis, tortor sapien eleifend eros, vitae rutrum augue quam sed leo. Vivamus fringilla, diam sit amet vestibulum vulputate, urna risus hendrerit arcu, vitae fringilla odio justo vulputate neque. Nulla a massa sed est vehicula rhoncus sit amet quis libero. Integer euismod est quis turpis hendrerit, in feugiat mauris laoreet. Vivamus nec laoreet neque. Cras condimentum aliquam nunc nec maximus. Cras facilisis eros quis leo euismod pharetra sed cursus orci.','Mary Jackson'),
(6, 1, 'Technology Post Three', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut interdum est nec lorem mattis interdum. Cras augue est, interdum eu consectetur et, faucibus vel turpis. Etiam pulvinar, enim quis elementum iaculis, tortor sapien eleifend eros, vitae rutrum augue quam sed leo. Vivamus fringilla, diam sit amet vestibulum vulputate, urna risus hendrerit arcu, vitae fringilla odio justo vulputate neque. Nulla a massa sed est vehicula rhoncus sit amet quis libero. Integer euismod est quis turpis hendrerit, in feugiat mauris laoreet. Vivamus nec laoreet neque. Cras condimentum aliquam nunc nec maximus. Cras facilisis eros quis leo euismod pharetra sed cursus orci.','Sam Smith');
gitextract_ja1r27dk/ ├── .gitignore ├── README.md ├── ajaxCall.html ├── ajaxCall.js ├── api/ │ ├── category/ │ │ ├── create.php │ │ ├── delete.php │ │ ├── read.php │ │ ├── read_single.php │ │ └── update.php │ └── post/ │ ├── create.php │ ├── delete.php │ ├── read.php │ ├── read_single.php │ └── update.php ├── config/ │ └── Database.php ├── models/ │ ├── Category.php │ └── Post.php └── myblog.sql
SYMBOL INDEX (19 symbols across 5 files)
FILE: ajaxCall.js
function getUrlVars (line 12) | function getUrlVars(url) {
FILE: config/Database.php
class Database (line 2) | class Database {
method connect (line 11) | public function connect() {
FILE: models/Category.php
class Category (line 2) | class Category {
method __construct (line 13) | public function __construct($db) {
method read (line 18) | public function read() {
method read_single (line 39) | public function read_single(){
method create (line 66) | public function create() {
method update (line 94) | public function update() {
method delete (line 126) | public function delete() {
FILE: models/Post.php
class Post (line 2) | class Post {
method __construct (line 17) | public function __construct($db) {
method read (line 22) | public function read() {
method read_single (line 41) | public function read_single() {
method create (line 71) | public function create() {
method update (line 102) | public function update() {
method delete (line 137) | public function delete() {
FILE: myblog.sql
type `categories` (line 1) | CREATE TABLE `categories` (
type `posts` (line 15) | CREATE TABLE `posts` (
Condensed preview — 18 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (28K chars).
[
{
"path": ".gitignore",
"chars": 8,
"preview": "jtest.js"
},
{
"path": "README.md",
"chars": 355,
"preview": "# PHP REST API\n\n> This is a simple PHP REST API from scratch with no framework.\n\n## Quick Start\n\nImport the myblog.sql f"
},
{
"path": "ajaxCall.html",
"chars": 1749,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width"
},
{
"path": "ajaxCall.js",
"chars": 2128,
"preview": "\n//POST REQUEST\n\n$(document).ready(function(){\n $('#postMessage').click(function(e){\n e.preventDefault();\n\n "
},
{
"path": "api/category/create.php",
"chars": 884,
"preview": "<?php\n // Headers\n header('Access-Control-Allow-Origin: *');\n header('Content-Type: application/json');\n header('Acc"
},
{
"path": "api/category/delete.php",
"chars": 900,
"preview": "<?php\n // Headers\n header('Access-Control-Allow-Origin: *');\n header('Content-Type: application/json');\n header('Acc"
},
{
"path": "api/category/read.php",
"chars": 1065,
"preview": "<?php \n // Headers\n header('Access-Control-Allow-Origin: *');\n header('Content-Type: application/json');\n\n include_o"
},
{
"path": "api/category/read_single.php",
"chars": 635,
"preview": "<?php\n\n // Headers\n header('Access-Control-Allow-Origin: *');\n header('Content-Type: application/json');\n\n include_o"
},
{
"path": "api/category/update.php",
"chars": 931,
"preview": "<?php\n // Headers\n header('Access-Control-Allow-Origin: *');\n header('Content-Type: application/json');\n header('Acc"
},
{
"path": "api/post/create.php",
"chars": 961,
"preview": "<?php \n // Headers\n header('Access-Control-Allow-Origin: *');\n header('Content-Type: application/json');\n header('Ac"
},
{
"path": "api/post/delete.php",
"chars": 874,
"preview": "<?php \n // Headers\n header('Access-Control-Allow-Origin: *');\n header('Content-Type: application/json');\n header('Ac"
},
{
"path": "api/post/read.php",
"chars": 1173,
"preview": "<?php \n // Headers\n header('Access-Control-Allow-Origin: *');\n header('Content-Type: application/json');\n\n include_o"
},
{
"path": "api/post/read_single.php",
"chars": 742,
"preview": "<?php \n // Headers\n header('Access-Control-Allow-Origin: *');\n header('Content-Type: application/json');\n\n include_o"
},
{
"path": "api/post/update.php",
"chars": 1008,
"preview": "<?php \n // Headers\n header('Access-Control-Allow-Origin: *');\n header('Content-Type: application/json');\n header('Ac"
},
{
"path": "config/Database.php",
"chars": 612,
"preview": "<?php \n class Database {\n // DB Params\n private $host = 'localhost';\n private $db_name = 'myblog';\n private"
},
{
"path": "models/Category.php",
"chars": 2851,
"preview": "<?php\n class Category {\n // DB Stuff\n private $conn;\n private $table = 'categories';\n\n // Properties\n pu"
},
{
"path": "models/Post.php",
"chars": 4928,
"preview": "<?php \n class Post {\n // DB stuff\n private $conn;\n private $table = 'posts';\n\n // Post Properties\n publi"
},
{
"path": "myblog.sql",
"chars": 4781,
"preview": "CREATE TABLE `categories` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `name` varchar(255) NOT NULL,\n `created_at` datet"
}
]
About this extraction
This page contains the full source code of the bradtraversy/php_rest_myblog GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 18 files (26.0 KB), approximately 7.0k tokens, and a symbol index with 19 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.