Intereting Posts
В PHP есть ли способ захватить вывод файла PHP в переменную без использования буферизации вывода? Строгая стандартная ошибка при загрузке изображения с помощью скрипта PHP Простой пример jQuery, PHP и JSONP? Вызовите функцию-член get_news () для не-объекта в C: \ xampp \ htdocs \ CodeIgniter_Practice \ application \ controllers \ news.php в строке 11 PHP Скрыть идентификатор от показа в URL-адресе href Получите ограниченную текстовую выдержку из сообщения WordPress? Как добавить параметры URL-адреса php в URL? Система входа в PHP с использованием Cookies и соленых хешей Composer не генерирует информацию автозагрузчика (autoload_namespaces.php) file_get_contents не работает? php md5, который дает тот же результат, что и c # Ошибка 500: преждевременный конец заголовков скриптов Как добавить xml-данные в xml-файл без перезаписи существующих данных с помощью php? Показывать подкатегорию вместо Root в меню Ошибка несанкционированной ошибки 401 GCM

Служба Slim Framework Rest, получающая выход дважды

Я делаю 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. Ошибка 404

Как последний, это мой .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, он будет работать лучше всего.