Partage
  • Partager sur Facebook
  • Partager sur Twitter

PBM de méthode POST

Création d'API REST PHP SQL

    14 novembre 2019 à 10:54:42

    Bonjour,

    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

    • Partager sur Facebook
    • Partager sur Twitter
      14 novembre 2019 à 11:03:12

      Salut

      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. 

      • Partager sur Facebook
      • Partager sur Twitter
        14 novembre 2019 à 11:16:27

        Salut,

        d'autres remarques:

        • 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 ??

        • Partager sur Facebook
        • Partager sur Twitter
          14 novembre 2019 à 18:29:21

          Merci pour votre réactivité

          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 ... :) )

          Concernant PDO j'ai activé oui :

          ------------------

          public function getConnection(){

                  $this->connexion = null;

                  try{
                      $this->connexion = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
                      $this->connexion->exec("set names utf8");
                  }catch(PDOException $exception){
                      echo "Erreur de connexion : " . $exception->getMessage();
                  }

                  return $this->connexion;
              }

          --------------

          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

          • Partager sur Facebook
          • Partager sur Twitter
            14 novembre 2019 à 19:14:34

            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

            • Partager sur Facebook
            • Partager sur Twitter

            PBM de méthode POST

            × 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.
            • Editeur
            • Markdown