IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

requête ajax pour un insert dans une DB, renvoie "empty String"


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut requête ajax pour un insert dans une DB, renvoie "empty String"
    Bonjour,

    je fais une todo list, avec comme technologie, ajax, jQuery, PHP.

    J'ai un formulaire pour rentrer une tâche:
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    <!-- Ajout nouvel tâche fenêtre Modal -->
            <div class="modal fade" id="addTaskModal">
                <div class="modal-dialog modal-dialog-centered">
                    <div class="modal-content">
     
                        <!-- Modal Header -->
                        <div class="modal-header">
                            <h4 class="modal-title">Ajout nouvelle tâche</h4>
                            <button type="button" class="close" data-dismiss="modal">&times;</button>
                        </div>
     
                        <!-- Modal body -->
                        <div class="modal-body px-4">
                            <form action="" method="POST" id="form-data">
                                <div class="form-group">
                                    <input type="text" name="title" placeholder="Titre" required>
                                    <label for="title">Titre de votre tâche</label>
                                </div>
                                <div class="form-group">
                                    <textarea rows="4" cols="45" name="description" placeholder="Description">Description de votre tâche</textarea>
                                </div>
                                <div class="form-group">
                                    <input type="color" name="importance" >
                                    <label for="importance">Choisissez une couleur</label>
                                </div>
                                <div class="form-group"> 
                                    <input type="date" name="due_date" placeholder="Date d'échéance">
                                    <label for="due_date">Date d'échéance</label>
                                </div>
                                <div class="form-group">  
                                    <input type="date" name="start_date" placeholder="Débute le" required>
                                    <label for="start_date">Date de départ</label>
                                </div>
                                <div class="form-group">
                                    <input type="text" name="parent" placeholder="Tâche parent">
                                    <label for="parent">Tâche parent</label>
                                </div>
                                <div class="form-group">                               
                                    <span>
                                        <select name="status" class="form-control">
                                            <option value="a_faire">à faire</option>
                                            <option value="en_cours">en cours</option>
                                            <option value="achevee">achevée</option>
                                            <option value="un_jour_peut_etre">un jour peut-être</option>
                                        </select>
                                    </span>
                                </div>
                                <div class="form-group">
                                    <input type="text" name="category" placeholder="Catégorie">
                                    <label for="category">Catégorie</label>
                                </div>                          
                                <div class="form-group">
                                    <input type="text" name="prerequisite" placeholder="Prérequis">
                                    <label for="prerequisite">Prérequis</label>
                                </div>
                                <div class="form-group">  
                                    <input type="date" name="created_at" placeholder="Créé le" required>
                                    <label for="created_at">Date de création</label>
                                </div>
                                <div class="form-group">
                                    <input type="date" name="updated_at" placeholder="Mis à jour le">
                                    <label for="updated_at">Date de mise à jour</label>
                                </div>
                                <div class="form-group">
                                    <input type="date" name="end_date" placeholder="Date de fin">
                                    <label for="end_date">Date de fin</label>
                                </div>
                                <div class="form-group">
                                    <input type="time" name="estimated_time" placeholder="Temps estimé">
                                    <label for="estimated_time">temps estimé</label>
                                </div>
                                <div class="form-group">
                                    <input type="number" name="display_order" placeholder="position d'affichage">
                                    <label for="display_order">ordre d'affichage</label>
                                </div>
                                <div class="form-group">
                                    <input type="submit" name="insert" id="insert" value="Ajout tâche" class="btn btn-primary btn-block">
                                </div>
                            </form>
                        </div>
     
                    </div>
                </div>
            </div>

    Ma requête ajax:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //requête ajax pour l'insert d'une tâche lors d'un clic sur le boutton "Ajouter une tâche"
                    $("#insert").click(function (e) {
                        if ($("#form-data")[0].checkValidity()) {
                            e.preventDefault();
                            $.ajax({
                                url: "controller.php",
                                type: "POST",
                                data: $("#form-data").serialize() + "& action=insert",
                                success: function (data) {
                                    console.log(data);
                                    alert('success');
                                },
                                error: function () {
                                    alert('error');
                                }
                            });
                        }
                    });
    j'ai bien la fenêtre success qui s'ouvre, mais ça me renvoi empty String et aucune nouvelle entrée dans ma DB.


    Mon controller:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    if(isset($_POST['action']) && $_POST['action'] == "insert"){
        //$id = uniqid($prefix = "id", $more_entropy = true);//génération UUID comme id d'une tâche.
        $title = $_POST['title'];
        $description = $_POST['description'];
        $importance = $_POST['importance'];
        $due_date = $_POST['due_date'];
        $start_date = $_POST['start_date'];
        $parent = $_POST['parent'];
        $status = $_POST['status'];
        $category = $_POST['category'];
        $prerequisite = $_POST['prerequisite'];
        $created_at = $_POST['created_at'];
        $updated_at = $_POST['updated_at'];
        $end_date = $_POST['end_date'];
        $estimated_time = $_POST['estimated_time'];
        $display_order = $_POST['display_order'];
     
        $db->insert($title, $description, $importance, $due_date, $start_date, $parent, $status, 
                $category, $prerequisite, $created_at, $updated_at, $end_date, $estimated_time, $display_order);
    }


    et enfin mon model avec la fonction insert:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    private $db = "mysql:host=localhost;dbname=todo_list";
        private $user = "root";
        private $psw = "password";
        public $conn;
     
        //Constructeur
        public function __construct() {
            try {
                $this->conn = new PDO($this->db, $this->user, $this->psw);
                //echo 'Connexion réussie!';
            } catch (PDOException $e) {
                echo $e->getMessage();
            }
        }
     
        //Fonction qui insert une tâche dans la DB
        public function insert($title, $description, $importance, $due_date, $start_date,
                $parent, $status, $category, $prerequisite, $created_at, $updated_at, $end_date, $estimated_time, $display_order) {
            $sql = "INSERT INTO tasks (title, description, importance, due_date, start_date, 
                parent, status, category, prerequisite, created_at, updated_at, end_date, estimated_time, display_order) 
                VALUES (:title, :description, :importance, :due_date, :start_date, :parent, :status, :category, 
                :prerequisite, :created_at, :updated_at, :end_date, :estimated_time, :display_order)";
            $stmt = $this->conn->prepare($sql);
            $stmt->execute(['title' => $title, 'description' => $description, 'importance' => $importance, 'due_date' => $due_date, 'start_date' => $start_date,
                'parent' => $parent, 'status' => $status, 'category' => $category, 'prerequisite' => $prerequisite, 'created_at' => $created_at,
                'updated_at' => $updated_at, 'end_date' => $end_date, 'estimated_time' => $estimated_time, 'display_order' => $display_order]);
            return true;
        }

    J'ai essayé avec et sans id, au début, je générais un UUID en PHP, j'ai retirer ça et essayé avec un id autoIncrement, mais j'ai toujours le même résultat.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          data: $("#form-data").serialize() + "& action=insert",
    Espace en trop avant action.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    bonsoir et merci de répondre aussi vite.

    ça ne m'affiche plus empty String, mais je n'ai toujours pas de nouvelle entrée dans ma DB.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il va falloir apprendre à déboguer toi-même...

    1- requête ajax:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                                success: function (data) {
                                    console.log(data);
                                },
    Si tu veux pouvoir récupérer quelque chose dans data, il faut faire un echo dans le fichier PHP.

    2- controller:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(isset($_POST['action']) && $_POST['action'] == "insert"){
    ...
        echo 'INSERT EN COURS... : ';
        echo $db->insert($title, $description, $importance, $due_date, $start_date, $parent, $status, 
                $category, $prerequisite, $created_at, $updated_at, $end_date, $estimated_time, $display_order);
    }

    3- fonction insert:
    Généralement pour un INSERT en BDD, on récupère le "lastInsertId" (plutôt que true)
    Et pour gérer les erreurs PDO, on utilise try catch (voir : PDO une soupe et au lit !)

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public function insert(...............) {
       try{
    ...
            return $db->lastInsertId();
       catch(Exception $e){
            return "Erreur ! " . $e->getMessage() . "<br/>";
       }
    }

    Avec ça, tu devrais avoir des infos utiles.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    Bonjour, et merci pour vos réponses.

    En général, j'essaie de débogger moi-même, avant de demander de l'aide, mais là, je dois dire, que je n'ai aucune info sur le pourquoi mon insert ne se fait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    success: function (response) {
                                    console.log(response);
                                },
    me renvoi 1. et j'ai bien mis un echo $response dans mon PHP.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $db->insert($title, $description, $importance, $due_date, $start_date, $parent, $status, 
                $category, $prerequisite, $created_at, $updated_at, $end_date, $estimated_time, $display_order);
    l'echo de l'insert en cours, ne me renvoi rien du tout.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      public function insert(...............) {
       try{
    ...
            return $db->lastInsertId();
       catch(Exception $e){
            return "Erreur ! " . $e->getMessage() . "<br/>";
       }
    }
    même avec le try catch, tout ce passe correctement, du coup il ne passe pas dans le catch.

    Entre temps, j'ai testé les variables qui viennent de mon formulaire et tout est normal de ce côté.
    J'ai aussi essayé en hardcodant les variables, mais ça ne va pas mieux.
    J'ai aussi été voir les MySQL log, mais ils ne m'affichent aucunes erreurs.

    Donc mon plus gros problème est l'absence d'indices, qui pourrait me mettre sur la voie.

    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          data: $("#form-data").serialize() + "& action=insert",
    Espace en trop avant action.
    Sans l'espace, ça ne change rien.

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 446
    Points : 4 959
    Points
    4 959
    Par défaut
    Citation Envoyé par Cisman Voir le message
    me renvoi 1. et j'ai bien mis un echo $response dans mon PHP.
    Puis après

    Citation Envoyé par Cisman Voir le message
    l'echo de l'insert en cours, ne me renvoi rien du tout.


    Déjà il faut ajouter les deux points ( : ) avant les indexes du tableau de $stmt->execute() :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $stmt->execute([':title' => $title, ':description' => $description, ':importance' => $importance, ':due_date' => $due_date, ':start_date' => $start_date,
                ':parent' => $parent, ':status' => $status, ':category' => $category, ':prerequisite' => $prerequisite, ':created_at' => $created_at,
                ':updated_at' => $updated_at, ':end_date' => $end_date, ':estimated_time' => $estimated_time, ':display_order' => $display_order]);

    Tu n'as pas un champ dans la table NOT NULL que tu ne met pas dans la requête ?

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    tous les champs NOT NULL sont dans ma requête.

    Nom : db.JPG
Affichages : 543
Taille : 160,4 Ko

  8. #8
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 446
    Points : 4 959
    Points
    4 959
    Par défaut
    Bon je viens de tester en locale et l'insertion fonctionne.

    Le tout est dans un seul fichier...(je sais que tu met un require/include pour accéder à la classe myPDO ):
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    <?php
    class myPDO{
        private $db = "mysql:host=localhost;dbname=todo_list";
        private $user = "root";
        private $psw = "password";//password est le mot de passe de mysql ?
        public $conn;//pk en public, il faut créer une fonction public getDb() pour récupérer cet attribut (qui doit être private)
     
        //Constructeur
        public function __construct() {
            try {
                $this->conn = new PDO($this->db, $this->user, $this->psw,[PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]);
    	    $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                //echo 'Connexion réussie!';
            } catch (PDOException $e) {
                echo $e->getMessage();
            }
        }
     
        //Fonction qui insert une tâche dans la DB (Normalement cette méthode doit être dans une autre classe "tacheManager" et pas ici ...)
        public function insert($title, $description, $importance, $due_date, $start_date,
                $parent, $status, $category, $prerequisite, $created_at, $updated_at, $end_date, $estimated_time, $display_order) {
            $sql = "INSERT INTO tasks (title, description, importance, due_date, start_date, 
                parent, status, category, prerequisite, created_at, updated_at, end_date, estimated_time, display_order) 
                VALUES (:title, :description, :importance, :due_date, :start_date, :parent, :status, :category, 
                :prerequisite, :created_at, :updated_at, :end_date, :estimated_time, :display_order)";
            $stmt = $this->conn->prepare($sql);
            $stmt->execute([':title' => $title, ':description' => $description, ':importance' => $importance, ':due_date' => $due_date, ':start_date' => $start_date,
                ':parent' => $parent, ':status' => $status, ':category' => $category, ':prerequisite' => $prerequisite, ':created_at' => $created_at,
                ':updated_at' => $updated_at, ':end_date' => $end_date, ':estimated_time' => $estimated_time, ':display_order' => $display_order]);
            return $this->conn->lastInsertId();//Ici c'est $this->conn->last..., souviens toi que tu es dans une classe ici !
        }
    }
     
    //début récupération des variables post 
    if(isset($_POST['action']) && $_POST['action'] == "insert"){
        //$id = uniqid($prefix = "id", $more_entropy = true);//génération UUID comme id d'une tâche.
        $title = $_POST['title'];
        $description = $_POST['description'];
        $importance = $_POST['importance'];
        $due_date = $_POST['due_date'];
        $start_date = $_POST['start_date'];
        $parent = $_POST['parent'];
        $status = $_POST['status'];
        $category = $_POST['category'];
        $prerequisite = $_POST['prerequisite'];
        $created_at = $_POST['created_at'];
        $updated_at = $_POST['updated_at'];
        $end_date = $_POST['end_date'];
        $estimated_time = $_POST['estimated_time'];
        $display_order = $_POST['display_order'];
     
        $db=new myPDO();
     
        echo $db->insert($title, $description, $importance, $due_date, $start_date, $parent, $status, 
                $category, $prerequisite, $created_at, $updated_at, $end_date, $estimated_time, $display_order);
    }

    Mais c'est quoi cet interclassement utf8mb4_0900_ai_ci ?, je l'ai pas trouvé dans la liste. moi j'utilise utf8mb4_general_ci pour les tables et les champs aussi.

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    Bonjour,

    Un problème de résolu, à priori, ça venait de ma fonction pour me connecter à la DB.
    En faisant une class séparée, ça passe.

    Ma classe Database:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?php
     
    class Database {
     
        private $serverName;
        private $db_user;
        private $db_pass;
        private $db_name;
        private $charset;
        private $pdo;
     
        function db_connexion() {
            $this->serverName = 'localhost';
            $this->db_user = 'root';
            $this->db_pass = 'password';
            $this->db_name = 'todo_list';
            $this->charset = 'utf8mb4';
     
            if ($this->pdo === null) {
                try {
                    $dsn = "mysql:host=" . $this->serverName . ";dbname=" . $this->db_name . ";charset=" . $this->charset;
                    $pdo = new PDO($dsn, $this->db_user, $this->db_pass);
                    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                    return $pdo;
                } catch (PDOException $e) {
                    echo "erreur connexion à la base de données : " . $e->getMessage();
                }
            }
        }
     
    }
    ma class Crud qui à été renommée, elle contient toutes mes fonctions CRUD.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    <?php
     
    require_once 'Database.php';
     
    //Class pour le CRUD sur les tâches
    class Crud {
     
        //Fonction qui insert une tâche dans la DB
        public function insert($id, $title, $description, $importance, $due_date, $start_date,
                $parent, $status, $category, $prerequisite, $created_at, $updated_at, $end_date, $estimated_time, $display_order) {
            $db = new Database;
            $sql = "INSERT INTO tasks (id_task, title, description, importance, due_date, start_date,
          parent, status, category, prerequisite, created_at, updated_at, end_date, estimated_time, display_order)
          VALUES (:id_task, :title, :description, :importance, :due_date, :start_date, :parent, :status, :category,
          :prerequisite, :created_at, :updated_at, :end_date, :estimated_time, :display_order)";
            try {
                $stmt = $db->db_connexion()->prepare($sql);
                $stmt->execute(array(':id_task' => $id, ':title' => $title, ':description' => $description, ':importance' => $importance, ':due_date' => $due_date, ':start_date' => $start_date,
                    ':parent' => $parent, ':status' => $status, ':category' => $category, ':prerequisite' => $prerequisite, ':created_at' => $created_at,
                    ':updated_at' => $updated_at, ':end_date' => $end_date, ':estimated_time' => $estimated_time, ':display_order' => $display_order));
                return $this->$db->db_connexion()->lastInsertId();
            } catch (Exception $e) {
                //s'il y a un problème PHP ou SQL, tout s'affichera ici
                print "Erreur ! " . $e->getMessage() . "<br/>";
            }
        }
     
        //Fonction qui va lire toutes les tâches de la DB
        public function readTasks() {
            $db = new Database;
            $data = array();
            $sql = "SELECT * FROM tasks";
            $stmt = $db->db_connexion()->prepare($sql);
            $stmt->execute();
            $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
            foreach ($result as $row) {
                $data[] = $row;
            }
            return $data;
        }
     
        //Fonction qui va lire une tâche dans la DB sue base de son id.
        public function getTaskById($id) {
            $sql = "SELECT * FROM tasks WHERE id = :id";
            $stmt = $this->conn->prepare($sql);
            $stmt->execute(['id' => $id]);
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            return $result;
        }
     
        //Fonction qui va mettre à jour une tâche dans la DB sur base de son id.
        public function updateTask($id, $title, $description, $importance, $due_date, $start_date,
                $parent, $status, $category, $prerequisite, $created_at, $updated_at, $end_date, $estimated_time, $display_order) {
            $sql = "UPDATE tasks SET title = :title, description = :description, importance = :importance, due_date = :due_date, "
                    . "start_date = :start_date, parent = :parent, status = :status, category = :category, prerequisite = :prerequisite, "
                    . "created_at = :created_at, updated_at = :updated_at, end_date = :end_date, estimated_time = :estimated_time, "
                    . "display_order = :display_order WHERE id = :id";
            $stmt = $this->conn->prepare($sql);
            $stmt->execute(['title' => $title, 'description' => $description, 'importance' => $importance, 'due_date' => $due_date, 'start_date' => $start_date,
                'parent' => $parent, 'status' => $status, 'category' => $category, 'prerequisite' => $prerequisite, 'created_at' => $created_at,
                'updated_at' => $updated_at, 'end_date' => $end_date, 'estimated_date' => $estimated_time, 'display_order' => $display_order, 'id' => $id]);
            return true;
        }
     
        //Fonction qui efface une tâche que base de son ID
        public function deleteTask($id) {
            $sql = "DELETE FROM tasks WHERE id = :id";
            $stmt = $this->conn->prepare($sql);
            $stmt->execute(['id' => $id]);
            return true;
        }
     
        //Fonction qui renvoi le nombre de tâche dans la DB
        public function totalTasks() {
            $db = new Database;
            $sql = "SELECT * FROM tasks";
            $stmt = $db->db_connexion()->prepare($sql);
            $stmt->execute();
            $totalTask = $stmt->rowCount();
            return $totalTask;
        }
     
    }
     
    //$object = new Database();//connexion à la DB
    //print_r($object->read());//test fonction read
    //echo $object->totalTasks();//test fonction totalTasks
    J'ai deux questions concernant cette classe et ses fonctions:
    dans la fonction insert, j'ai remplacé le return true; par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->$db->db_connexion()->lastInsertId();
    Je dois faire la meme chose dans updateTask() et deleteTask()?

    Ma deuxième question est comment fermer la connexion à la DB à la fin d'une fonction?
    avec un ?


    Au début, je disais un problème de résolu, pcq:
    J'ai ces erreurs SQL qui remontent pour 3 de mes colonnes:
    SQLSTATE[01000]: Warning: 1265 Data truncated for column 'status' => est un enum.
    SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect date value: '' => est une date
    SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' => est in Int.
    c'est toutes des colonnes nullable, avec une valeur NULL par défaut, mais à priori, elle ne supporte pas la valeur NULL.

  10. #10
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 446
    Points : 4 959
    Points
    4 959
    Par défaut
    Salut,

    Pour la première question, lastInsertId fonctionne seulement pour les requêtes insert (désolé faute de frappe), pour le select, delete et update tu peux utiliser rowCount().

    La deuxième question, PDO n'est pas comme mysqli, tu peux mettre le $stmt à null et c'est tout :$stmt=null;

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Toufik83 Voir le message
    lastInsertId fonctionne seulement pour les requêtes select,...
    ...pour les requêtes INSERT.

  12. #12
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 446
    Points : 4 959
    Points
    4 959
    Par défaut
    Oui jreaux62, c'était une faute sans faire attention...

  13. #13
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par Toufik83 Voir le message
    Salut,

    Pour la première question, lastInsertId fonctionne seulement pour les requêtes insert (désolé faute de frappe), pour le select, delete et update tu peux utiliser rowCount()
    .

    à quoi servent ces deux fonctions dans ce cas-ci

  14. #14
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 446
    Points : 4 959
    Points
    4 959
    Par défaut
    C'est le temps de lire un peu la documentation...

    rowCount retourne le nombre de ligne retournée par une requête.

    lastInsertId retourne le dernier id (auto-incrémente) qui vient d'être insérer.

  15. #15
    Invité
    Invité(e)
    Par défaut
    A priori, tu n'as pas les bras plâtrés.

    Donc : ou


  16. #16
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par Toufik83 Voir le message
    C'est le temps de lire un peu la documentation...

    rowCount retourne le nombre de ligne retournée par une requête.

    lastInsertId retourne le dernier id (auto-incrémente) qui vient d'être insérer.
    oui, ça j'ai été le lire dans le doc, mais pourquoi utiliser ces fonctions plutôt que return null;?

  17. #17
    Invité
    Invité(e)
    Par défaut
    1- Si tu avais VRAIMENT lu la DOC rowCount(), tu aurais ta réponse....

    PDOStatement::rowCount() retourne le nombre de lignes affectées par la dernière requête DELETE, INSERT ou UPDATE exécutée par l'objet PDOStatement correspondant.
    C'est toujours bon de vérifier si une opération s'est bien passée.

    2- pour ton SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
            foreach ($result as $row) {
                $data[] = $row;
            }
            return $data;
    se résume à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
            return $result;
    ou juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            return $stmt->fetchAll(PDO::FETCH_ASSOC);

  18. #18
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 446
    Points : 4 959
    Points
    4 959
    Par défaut
    Pour t'assurer que l'insertion s'est déroulée sans problème, par exemple pour ta fonction insert comme elle retourne le dernier id inséré, tu peux donc l'évaluer dans un if :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(insert(......)>0){//vu qu'elle retourne soit 0 soit le dernier id inséré
    ...
    }
    else{
    ...
    }

    C'est un moyen pour contrôler tes scripts comme jreaux62 t'a expliqué.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(insert(......)>0){//vu qu'elle retourne soit 0 soit 1(dans ton cas)
    FAUX.

    Elle renvoie :
    • soit l'id (auto-incrément) de la ligne créée
    • soit false

    Néanmoins... la condition fonctionne

  20. #20
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 446
    Points : 4 959
    Points
    4 959
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    • soit l'id (auto-incrément) de la ligne créée (correcte)
    • soit false (FAUX)
    Elle retourne 0 (sans l'utilisation du paramètre name) si aucune insertion n'est effectuée

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] VB.NET : utilise VB pour des insert dans une base ACCESS
    Par simo22 dans le forum VB.NET
    Réponses: 0
    Dernier message: 25/01/2019, 12h28
  2. [MySQL] Problème pour l'insertion dans une base de données avec variables $_POST
    Par hakkio dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/03/2012, 17h04
  3. Requête d'insertion dans une base ACCESS
    Par kurul1 dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/11/2006, 17h41
  4. [ODBC] Récupération d'une donnée pour insertion dans une autre table
    Par rom950 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 17h13
  5. Requête pour remplacer caractères dans une table
    Par elliott1961 dans le forum Installation
    Réponses: 5
    Dernier message: 16/01/2006, 01h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo