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

AJAX Discussion :

Requête SQL DELETE en Ajax qui ne fonctionne pas (alors que tout fonctionne)


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Les plantes et l'informatique
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Les plantes et l'informatique

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Par défaut Requête SQL DELETE en Ajax qui ne fonctionne pas (alors que tout fonctionne)
    Bonsoir,

    voici quelques heures que j'ai un petit soucis concernant une requête SQL en AJAX via JQuery.

    Je développe pour m'entrainer, un site E-commerce avec un panier et la possibilité d'y modifier les quantités. J'utilise pour cela un "input number", associé à un bouton "modifier". Le click sur le bouton modifier va activer un script JQuery, qui va traiter les données reçues (quel produit est actualisé, quelle quantité est ajoutée ou retirée en fonction du nombre inscrit dans l"input number par l'utilisateur, ET SI il a entré un chiffre égal ou inférieur à zéro, alors on supprime la ligne du produit concerné). C'est à cette dernière étape que je ne comprends pas ce qu'il se passe.

    Bref, voici quelques images et mon code qui seront certainement plus parlant :

    Mon Panier :
    Nom : caddy.png
Affichages : 266
Taille : 18,2 Ko


    Mon Code HTML / PHP (affichage du panier simplifié) :
    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
    echo'<tr>
         <td class="img-table"><img src="assets/img/shop/produit_'.$produit['id'].'/photo_1.jpg" alt="'.$produit['name'].'" title="'.$produit['name'].'"></td>
         <td>'.$produit['name'].'</td>
         <td class="test">
              <input type="number" name="quantite" id="quantite_'.$produit['id'].'" class="quantite" value="'.$caddyItems['quantite'].'"><br>
              <input type="button" name="modifier" id="modifier_'.$produit['id'].'" class="modifier" value="Modifier" data-id="'.$produit['id'].'" data-user="'.$idUser.'" data-idDel="'.$caddyItems['id'].'">
         </td>                                                
         <td>'.$produit['prix'].'€</td>
         <td>';
              if($produit['pourcent'] != 0)
              {
                   echo $produit['pourcent'].'%';
              }
              else{
                   echo '-';
              }
         echo'</td>
         <td>'.$total.'€</td>                               
    </tr>

    Mon Code JQuery (je vous place TOUT le traitement lié au panier) :
    Code JS : 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
    // Actualisation des quantités du caddy ou suppression de ce dernier si quantite < ou = 0
    $(document).ready( function()
    {
        // On créé une délégation d'événement sur TOUT le documents afin de toujours vérifier le click sur ce dernier et si le clic correspond au bouton "Modifier"
        $(document).on('click', ".modifier", function () 
        {   
            // On récupère l'ID du produit sur lequel on désire modifier la quantité          
            const idProduit = $(this).attr('data-id');
            // On récupère l'ID de l'utilisateur qui effectue cette modification
            const idUser = $(this).attr('data-user');
     
            // On récupère l'input number associé au bouton sur lequel on a cliqué pour valider la modification
            const idItem = $(this).attr('id'); 
            var recupId = document.getElementById(idItem);
            const inputQuantite = document.querySelector('input[id="quantite_' + recupId.dataset.id + '"]')
     
            if (inputQuantite) 
            {
                // On récupère la value de l'input number concerné
                let quantite = inputQuantite.value;
                let idDelete = $(this).attr('data-idDel');
     
                // On UPDATE la BDD avec la nouvelle quantité via une requête AJAX si quantite > 0
                if (quantite > 0)
                {
                    $.ajax(
                    {
                        type: "POST",
                        data: 'newQuantite='+quantite+'&idP='+idProduit+'&idU='+idUser,
                        url: "./assets/fonctions/modifQuantite.php",
                        // Si succès, on actualise la liste du panier
                        success: $('#caddyList'). load('index.php #caddyList')
                    });
                }
     
                // Sinon, on supprime le produit concerné du panier de l'utilisateur
                else
                {                
                    $.ajax(
                    {
                        type: "POST",
                        data: 'idI='+idDelete,
                        url: "./assets/fonctions/deleteProduit.php",
                        // Si succès, on actualise la liste du panier                    
                        success: $('#caddyList'). load('index.php #caddyList')
                    });               
                }
     
                return false;            
            }
        });
    }); // FIN ACTUALISATION CADDY
    (Alors oui, je mélange du JQuery et du JS, c'est pas très beau, mais ça fonctionne et j'améliorerais cela avec le temps.)
    Lorsque je modifie un produit avec une quantité supérieure à 0, tout fonctionne bien. Mon caddy s'actualise avec la nouvelle valeur et les nouveaux prix, pas de soucis avec ça.
    En revanche, lorsque j'inscris 0 ou un chiffre négatif dans l'input number, mon algo rentre bien dans le ELSE (j'ai testé avec des console.log) et l'actualisation du caddy a bien lieu, mais la requête n'est pas exécutée.


    Code PHP deleteProduit.php :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
         $idI = $_POST['idI'];
     
         $delete = $db->prepare('DELETE FROM caddy WHERE id = :idI');
         $delete->execute([
              'idI' => $idI
         ]) or die(print_r($db->errorInfo()));
     
         $delete->closeCursor();
    ?>
    D'ordinaire je fais mes requêtes comme ceci :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $delete = $db->prepare('DELETE FROM caddy WHERE id = :idI');
    $delete->execute(array(
              'idI' => $idI));
    Mais ne fonctionnant pas, j'ai tenté tout ce que j'ai pu trouver sur le net, mais rien n'y fait.
    Je ne vois pas mon erreur...
    Parce que TOUT fonctionne, sauf la ligne qui n'est pas retirée de la BDD... C'est à n'y rien comprendre :s

    La connexion à ma BDD est ok. Les droits de suppression me semblent être bons car je me connecte en root.


    Si quelqu'un a la patience de me lire et de m'aider à comprendre, je suis preneur

    En attendant, je vous souhaite une très bonne soirée !

    Cordialement,
    Derko.

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 668
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 668
    Par défaut
    commencez par vérifier si la requete http est bien lancée. pour cela, vous pouvez utiliser l'onglet "Réseau" de la console de développement de votre navigateur.
    par exemple avec Firefox, faites Ctrl + Maj + E
    https://developer.mozilla.org/fr/doc...ur_r%C3%A9seau

    je voulais aussi vous prévenir qu'avec votre code actuel, un utilisateur malveillant peut vider les paniers de tous les clients. si jamais vous voulez plus d'aide sur ce point, n'hésitez pas à créer une nouvelle discussion une fois que le souci de cette discussion sera réglé.

  3. #3
    Membre averti
    Homme Profil pro
    Les plantes et l'informatique
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Les plantes et l'informatique

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Par défaut
    Bonsoir Mathieu,

    la requête HTTP est bien lancée lorsque j'indique une quantité de 0 (ou inférieure) et que je clique sur mon bouton "modifier" :
    Nom : requeteHTTP.png
Affichages : 241
Taille : 3,2 Ko

    Pour ce qui est des utilisateurs malveillants, je pense que ce que vous cherchez à me dire c'est que l'on peut facilement modifier les ID des produits / utilisateurs / quantités via les method GET et POST c'est cela ?
    Je débute le JS / JQuery donc j'ai un peu de mal à voir les failles potentielles pour le moment, mais ça m'intéresse oui, et je serais curieux de trouver une solution à ce problème ! Donc avec plaisir pour travailler là dessus à vos côtés

    Merci pour votre intérêt et bonne nuit (j'imagine) !

    Derko.

  4. #4
    Membre averti
    Homme Profil pro
    Les plantes et l'informatique
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Les plantes et l'informatique

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Par défaut
    Bon,

    après de longues recherches et d'analyse de mon code j'ai trouvé l'erreur...

    Je me connectais à ma BDD en déclarant la variable $bdd, et j'appelais ensuite ma requête sous la variable $db...

    J'ai honte d'avoir perdu plus de 5h la dessus...

    Mais au moins, tout fonctionne !

    Du coup, Mathieu, vous pouvez m'envoyer un message privé si vous souhaitez toujours m'expliquer comment modifier mon code pour éviter de potentiels actes de sabotages. Car je ne saurais pas comment nommer un post comme celui-ci ni où le mettre dans le forum. Donc pour éviter tout soucis, j'attends de vos nouvelles (si vous avez le temps et la motivation bien entendu)

    Je clôture le post actuel.

    Derko.

  5. #5
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 668
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 668
    Par défaut
    avez vous activé l'affichage de toutes les erreurs php ?
    https://www.php.net/manual/fr/errorf...display-errors
    https://www.php.net/manual/fr/errorf...rror-reporting
    c'est important pendant la phase de développement pour justement éviter de perdre des heures.

    ensuite quand il s'agit de requête http, vous pouvez cliquer dessus dans la console de développement et c'est à cet endroit que vous aurez dû voir l'erreur php s'afficher.

  6. #6
    Membre averti
    Homme Profil pro
    Les plantes et l'informatique
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Les plantes et l'informatique

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Par défaut
    Oui, je suis tombé sur un lien qui indiquait comment activer toutes les erreurs PHP, et j'obtenais cette erreur :

    Undefined variable $db in <b>C:\MAMP\htdocs\1-myWebSite\assets\fonctions\deleteProduit.php</b> on line <b>33
    Uncaught Error: Call to a member function exec() on null in C:\MAMP\htdocs\1-myWebSite\assets\fonctions\deleteProduit.php:33
    Même avec ça, j'ai mis 1h pour voir de quoi il s'agissait... La fatigue !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] J'ai un script AJAX qui ne fonctionne pas
    Par beegees dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/10/2008, 16h21
  2. [AJAX] AJAX qui ne fonctionne pas sous IE
    Par tavarlindar dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 30/05/2008, 11h01
  3. [AJAX] Méthode sous Ajax qui ne fonctionne qu'une fois?
    Par patrice419 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/04/2007, 13h19
  4. [SQL] un create table qui devrait fonctionner
    Par klerdesign dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/06/2006, 14h05
  5. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10

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