Je suis actuellement en train de créer une API REST PHP/SQL afin d'alimenter une APP en react native.
Je travail sur le modèle CRUD. La méthode Create me pose pbm car je ne vois pas d'erreur dans le code depuis deux jours mais je n'arrive pas à créer une donnée (nouvel aliment) en passant par l'API
Cela étant en faisant des tests sur php Myadmin je remarque que ma requète SQL est bonne.
Je vous laisse le code dessous et aimerai que l'on m'aide car je bloque et je ne comprends vraiment pas
//premier fichier contenant les règles générales pour faire la création sql
class Aliment{ // Connexion private $connexion; private $table = "aliment"; private $table2 = "unite_de_mesure";
// object properties public $id_aliment; public $designation_aliment; public $abreviation_unite; public $id_unite;
/** * Constructeur avec $db pour la connexion à la base de données * * @param $db */ public function __construct($db){ $this->connexion = $db; }
/**
* Créer un aliment
*
* @return void
*/
public function creer(){
// Ecriture de la requête SQL en y insérant le nom de la table
$sql = "INSERT INTO " . $this->table . " SET designation_aliment=:designation_aliment, id_unite=:id_unite";
// Préparation de la requête
$query = $this->connexion->prepare($sql);
// Protection contre les injections
$this->designation_aliment=htmlspecialchars(strip_tags($this->designation_aliment));
$this->id_unite=htmlspecialchars(strip_tags($this->id_unite));
// Ajout des données protégées
$query->bindParam(":designation_aliment", $this->designation_aliment);
$query->bindParam(":id_unite", $this->id_unite);
// Exécution de la requête
if($query->execute()){
return true;
}
return false;
}
//deuxieme fichier contenant la requète : creer.php
<?php
// Headers requis
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 7600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
// On vérifie la méthode
if($_SERVER['REQUEST_METHOD'] == 'POST'){
// On inclut les fichiers de configuration et d'accès aux données
include_once '../config/Database.php';
include_once '../models/Aliment.php';
// On instancie la base de données
$database = new Database();
$db = $database->getConnection();
// On instancie les aliments
$aliment = new Aliment($db);
// On récupère les informations envoyées
$donnees = json_decode(file_get_contents("php://input"));
if(!empty($donnees->designation_aliment) && !empty($donnees->id_unite)){
// Ici on a reçu les données
// On hydrate notre objet
$aliment->designation_aliment = $donnees->designation_aliment;
$aliment->id_unite = $donnees->id_unite;
if($aliment->creer()){
// Ici la création a fonctionné
// On envoie un code 201
http_response_code(201);
echo json_encode(["message" => "L'ajout de l'aliment a été effectué"]);
}else{
// Ici la création n'a pas fonctionné
// On envoie un code 503
http_response_code(503);
echo json_encode(["message" => "L'ajout de l'aliment n'a pas été effectué"]);
}
}
}else{
// On gère l'erreur
http_response_code(405);
echo json_encode(["message" => "La méthode n'est pas autorisée"]);
}
En vous souhaitant une bonne journée
Gaël
- Edité par glemeunier 14 novembre 2019 à 10:56:26
D'entrée de jeu je vais te dire de retirer tes htmlspecialchars() lors de l'insertion en base avant de te faire taper sur les doigts xD. On utilise ça lors de l'affichage et non lors de l'insertion
Je te conseille de travailler avec l'inspecteur ouvert (f12 sur chrome et mozilla) et avec l'onglet réseau. Tu pourras voir si tu as des erreurs :p.
fais un echo de ta requête pour être sûr que c'est bien ce que tu veux.
Comme tu es dans la classe Aliment, forcément la table s'appelle aliment => pas besoin de faire une concaténation de $this->table à moins d'être dans un générateur,
As-tu activé les exceptions (si tu bosses sous PDO) ou comment gères-tu les erreurs si tu es sous MySQLi ?
et ensuite l'url "php://input" c'est quoi au juste ??
Je viens d'enlever les charts (Mea Culpa et merci car ... ne me tapez pas ... mais je ne savais pas !) et le soucis avec mon F12 National c'est que la requête ne renvoie pas d'erreur (code 200), mais n'enregistre pas en base non plus, et me laisse une page blanche (alors que j'ai prévu des messages permettant de voir si la requête est OK ou non, si la connexion en base est good et si on n'emploie pas la bonne methode)
Je fais mes tests avec POSTMAN et Firefox mais aucun warning ne clignote ... )
A noter : J'ai bien un retour code 200 donc la Base est bien connectée et la requete passe.
Pour <var class="filename">"php://input",</var> c'est un flux en lecture seule qui permet de lire des données brutes depuis le corps de la requête
Pour information et pensant que j'irai un peu plus vite, je me suis inspiré de cet API : https://github.com/NouvelleTechno/api-rest (au final je ne sais pas si j'ai gagné du temps )
- Edité par glemeunier 14 novembre 2019 à 18:31:00
Non là tu n'as rien activé du tout, tu as seulement trappé une erreur de connexion => voir le lien dans ma signature.
Ensuite pour le dév correct il faut débug => des echo un peu partout dans le chemin critique pour savoir où il plante, en gros là tu dév avec un bandeau sur les yeux.
Et HTTP200 veut seulement dire que la page a été chargée correctement, rien à voir avec PHP
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales