Загрузка данных
<?php
use PDO;
function taskId($uri) {
$str = str_replace("/tasks", "", $uri);
if ($str === "") {
return 0;
}
$str = str_replace("/", "", $str);
return (integer)$str;
}
function outError($code, $message) {
http_response_code($code);
header("Content-Type: application/json");
echo json_encode(['error' => $message], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
function outObject($code, $obj) {
http_response_code($code);
header("Content-Type: application/json");
echo json_encode($obj, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
function getQueryRows($pdo, $id) {
$conds =[];
$params = [];
$text = "SELECT id, title, description, status FROM tasks";
if ($id !== 0) {
$conds[] = "(id = ?)";
$params[] = $id;
}
foreach ($_GET as $key=>$value) {
if ($key === "query") {
$conds[] = "(status LIKE ? OR description LIKE ? OR title LIKE ?)";
$params[] = "%".$value."%";
$params[] = "%".$value."%";
$params[] = "%".$value."%";
}
else {
$conds[] = "($key = ?)";
$params[] = $value;
}
}
if (count($conds) !== 0) {
$text = $text." WHERE ".implode(" AND ", $conds);
}
$result = $pdo->prepare($text);
$result->execute($params);
$rows = $result->fetchAll(PDO::FETCH_OBJ);
return $rows;
}
function postUpdateQuery($pdo, $id, $obj) {
$fields =[];
$params = [];
foreach ($obj as $key=>$value) {
$fields[] = "$key = ?";
$params[] = $value;
}
$text = "UPDATE tasks SET ".implode(", ", $fields)." WHERE id = ?";
$params[] = $id;
$result = $pdo->prepare($text);
$result->execute($params);
$rows = getQueryRows($pdo, $id);
return $rows;
}
function postInsertQuery($pdo, $obj) {
$result = $pdo->query("SELECT id, title, description, status FROM tasks");
$rows = $result->fetchAll();
$nextId = count($rows) + 1;
$result = $pdo->prepare("INSERT INTO tasks (id, title, description, status) VALUES (?, ?, ?, ?)");
$result->execute([$nextId, $obj['title'], $obj['description'], $obj['status']]);
$rows = getQueryRows($pdo, $nextId);
return $rows;
}
function postDeleteQuery($pdo, $id) {
$result = $pdo->prepare("DELETE FROM tasks WHERE id = ?");
$result->execute([$id]);
}
function getTasks($pdo) {
$rows = getQueryRows($pdo, 0);
$result = [];
foreach ($rows as $row) {
$result[] = $row;
}
outObject(200, $result);
}
function getTask($pdo, $task) {
$rows = getQueryRows($pdo, $task);
if (count($rows) === 0) {
outError(404, 'Task not found');
return;
}
outObject(200, $rows[0]);
}
function doGetTasks($pdo, $uri) {
$id = taskId($uri);
if ($id === 0) {
getTasks($pdo);
return;
}
getTask($pdo, $id);
}
function doPostTasks($pdo, $uri) {
$obj = json_decode(file_get_contents('php://stdin'), true);
if (count($obj) === 0) {
outError(422, "Invalid input");
return;
}
foreach ($obj as $key=>$value) {
switch ($key) {
case "status":
if (!array_key_exists($value, ["pending"=>'', "done"=>'', "in-progress"=>'', "to-do"=>''])) {
outError(422, "Invalid status");
return;
}
if (gettype($value) !== "string") {
outError(422, "Invalid status");
return;
}
break;
case "title":
if (gettype($value) !== "string") {
outError(422, "Invalid title");
return;
}
if (strlen($value) < 5) {
outError(422, "Invalid title");
return;
}
break;
case "description":
if (gettype($value) !== "string") {
outError(422, "Invalid description");
return;
}
if (strlen($value) < 5) {
outError(422, "Invalid description");
return;
}
break;
default:
break;
}
}
$id = taskId($uri);
if ($id === 0) {
$rows = postInsertQuery($pdo, $obj);
outObject(201, $rows[0]);
return;
}
$rows = getQueryRows($pdo, $id);
if (count($rows) === 0) {
outError(404, "Task not found");
return;
}
$rows = postUpdateQuery($pdo, $id, $obj);
outObject(200, $rows[0]);
return;
}
function doDeleteTasks($pdo, $uri) {
$id = taskId($uri);
$rows = getQueryRows($pdo, $id);
if (count($rows) !== 0) {
postDeleteQuery($pdo, $id);
http_response_code(204);
header("Content-Type: application/json");
return;
}
}
function run() {
try {
$pdo = new PDO('sqlite:' . DB_NAME);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Database connection failed'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
return;
}
// Получение пути и метода запроса
$requestUri = $_SERVER['REQUEST_URI'];
$requestMethod = $_SERVER['REQUEST_METHOD'];
switch ($requestMethod) {
case "GET":
if (str_contains($requestUri, "/tasks")) {
doGetTasks($pdo, $requestUri);
}
else {
outError(404, "Not found");
// http_response_code(404);
// header("Content-Type: application/json");
// echo json_encode(['error' => 'Not found'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
break;
case "POST":
if (str_contains($requestUri, "/tasks")) {
doPostTasks($pdo, $requestUri);
}
else {
outError(404, "Not found");
}
break;
case "DELETE":
if (str_contains($requestUri, "/tasks")) {
doDeleteTasks($pdo, $requestUri);
}
else {
outError(404, "Not found");
}
break;
default:
break;
}
}
// В этой работе не удаляйте вызов функции run();
run();