Я делаю REST-сервис с php, используя тонкую структуру. все работает, но есть что-то странное. Я всегда получаю двойные или тройные данные. Вот мой index.php:
<?php require 'Slim/Slim.php'; \Slim\Slim::registerAutoloader(); $app = new \Slim\Slim(); if($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { header( "HTTP/1.1 200 OK" ); exit(); } function getConnection() { try { $db_username = "root"; $db_password="admin"; $conn = new PDO('mysql:host=localhost;dbname=dats24', $db_username); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { echo 'ERROR: ' . $e->getMessage(); } return $conn; } $app->get('/problem/find/:id/','getProblem'); // Using Get HTTP Method and process getUser function $app->get('/problem/find-all/','getProblems'); // Using Get HTTP Method and process getUsers function $app->post('/problem/add/', 'addProblem'); // Using Post HTTP Method and process addUser function $app->delete('/problem/delete/:id','deleteProblem'); // Using Delete HTTP Method and process deleteUser function $app->run(); function getProblems() { $sql_query = "select * FROM problems ORDER BY Station"; try { $dbCon = getConnection(); $stmt = $dbCon->query($sql_query); $problems = $stmt->fetchAll(PDO::FETCH_OBJ); $dbCon = null; echo '{"probfems": ' . json_encode($problems) . '}'; } catch(PDOException $e) { echo '{"error":{"text":'. $e->getMessage() .'}}'; } } function getProblem($id) { $sql = "SELECT * FROM problems WHERE idproblems=:id"; try { $dbCon = getConnection(); $stmt = $dbCon->prepare($sql); $stmt->bindParam("id", $id); $stmt->execute(); $problem = $stmt->fetchObject(); $dbCon = null; echo json_encode($problem); } catch(PDOException $e) { echo '{"error":{"text":'. $e->getMessage() .'}}'; } } function addProblem() { global $app; $postdata = file_get_contents("php://input"); echo $postdata; $req = json_decode($postdata);; // Getting parameter with names $paramName = $req->station; // Getting parameter with names $paramAdres = $req->address; // Getting parameter with names $paramCity = $req->city;// Getting parameter with names $parampostal = $req->postalcode; $parampic = $req->pictureOfDamage; $paramdescrip= $req->description; $sql = "INSERT INTO problems (Station,Address,Postalcode,City,PictureOfDamage,Description) VALUES (:station,:address,:postalcode,:city,:pictureOfDamage,:description)"; try { $dbCon = getConnection(); $stmt = $dbCon->prepare($sql); $stmt->bindParam(':station', $paramName); $stmt->bindParam(':address', $paramAdres); $stmt->bindParam(':city', $paramCity); $stmt->bindParam(':postalcode', $parampostal); $stmt->bindParam(':pictureOfDamage', $parampic); $stmt->bindParam(':description', $paramdescrip); $stmt->execute(); $dbCon = null; echo json_encode("toegevoegd "); } catch(PDOException $e) { echo '{"error":{"text":'. $e->getMessage() .'}}'; } } function deleteProblem($id) { $sql = "DELETE FROM problems WHERE idproblems=:id"; try { $dbCon = getConnection(); $stmt = $dbCon->prepare($sql); $stmt->bindParam("id", $id); $stmt->execute(); $dbCon = null; } catch(PDOException $e) { echo '{"error":{"text":'. $e->getMessage() .'}}'; } } $app->run();
Не имеет значения, какой метод я выбираю, как / find-all, дает это как вывод (база данных в настоящее время пуста):
{"problems": []}{"problems": []}{"problems": []}
И если я заготовлю POST, он добавляет его дважды в базу данных. Чтобы сделать его более страшным, я получаю двойную ошибку 404, когда я ввожу неправильный URL.
Как последний, это мой .htaccess файл
RewriteEngine On RewriteBase /Dats24/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L] Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" Header always set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Access-Control-Allow-Origin"
метод не вызывается больше, чем один раз, когда я его проверил. Я действительно не знаю, в чем проблема. Заранее спасибо за помощь 🙂
Это потому, что у вас несколько строк:
$app->run();
Каждый из них выполняет всю логику вашего приложения и обеспечивает весь вывод.
Метод запуска должен выполняться всегда только один раз, после настройки маршрутов, промежуточного программного обеспечения и т. Д.
Как ни странно, я не могу найти эту информацию (или что-нибудь о методе запуска класса Slim) в Slim docs …
Функция всегда должна что-то возвращать. Я также столкнулся с такой ситуацией. Но я решил это. В любой функции без эха вы должны попробовать return.Sure, он будет работать лучше всего.