Problème de requête SQL

a marqué ce sujet comme résolu.

Bonjour, bonjour, je poste de nouveau un poste à propos d’un de mes projets à rendre, qui se trouve être un site de e-commerce. Je le redis encore une fois je suis vraiment pas douée en Base de donnée et je sais que je devrais réapprendre les bases mais j’ai pas vraiment le temps dans mes cours.

Je dois pouvoir modifier un article, j’ai donc créer ce formulaire :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<form action="valide_modif_art.php" method="POST">

         <?php
         include('../config.inc.php');


    $bdd = new PDO('mysql:host='.BDD_SERVER.';dbname='.BDD_DATABASE.';charset=utf8', BDD_LOGIN, BDD_PASSWORD);
        $requete = 'SELECT * FROM articles WHERE art_id='.$_GET['id'];
        $exe = $bdd->query($requete);

        $ligne=$exe->fetch();
        ?>   

        <p>ID <input type='text' name='id' value='<?php echo $ligne['art_id'] ?>'><br></p>
        <p>Designation <input type='text' name='Designation' value='<?php echo $ligne['art_design'] ?>'><br></p>
        <p>Description <input type='text' name='Description' value='<?php echo $ligne['art_descript'] ?>'><br></p>
        <p>Prix <input type='text' name='Prix' value='<?php echo $ligne['art_prix'] ?>'><br></p>
        <p>Quantité <input type='text' name='Quantité' value='<?php echo $ligne['art_qte'] ?>'><br></p>       

        <INPUT type="submit" name="bouton" value="Valider"><BR><BR>


</form>

J’ai également créer une page pour valider la modification, celle-ci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
        $design = $_GET['design'];
        $descript = $_GET['descript'];
        $prix = $_GET['prix'];
        $qte = $_GET['qte'];
        $four = $_GET['four'];
        $numart = $_GET['numart'];

        include('../config.inc.php');
        $bdd = new PDO('mysql:host='.BDD_SERVER.';dbname='.BDD_DATABASE.';charset=utf8', BDD_LOGIN, BDD_PASSWORD);
        $requete = "UPDATE articles SET art_design='$design', art_descript='$descript', art_prix='$prix', art_qte='$qte', _four_id='$four' WHERE art_id=$numart ";
        $bdd->query($requete);
    ?>

J’ai l’impression que ma requête n’est pas bonne mais je ne vois pas d’ou.

Pourriez-vous m’aider s’il vous plait.

Merci d’avance

Salut !

Le premier point mentionné par mon VDD est valable pour tes deux codes : tu utilises PDO, nous te conseillons vivement d’utiliser les requêtes préparées (avec les méthodes PDO::prepare et PDOStatement::execute que mon VDD mentionne aussi).

Ensuite, tu as l’impression que ta requête n’est pas bonne, pourquoi ? Est-ce que tu attends qu’il se passe quelque chose qui ne se passe pas ?
Dans la plupart des cas, je te conseille d’activer l’affichage des erreurs de PHP ET de PDO (le premier n’implique pas le second, et le second sans le premier est inefficace).

Je note au passage que tu utilises les guillemets simples pour délimiter les valeurs de tes attributs HTML. N’oublie pas que dans ce cas dès que tu as un apostrophe dans une valeur, ça va aussi poser problème, mais au niveau du HTML cette fois. Je te conseillerais plutôt d’utiliser un <textarea> pour au moins la description, tu ne devrais ainsi avoir aucun souci de guillemets.

+0 -0

Comme le dit artragis c’est interdit d’ajouter une variable à un requête de cette façon.

Donc tu ne peux pas faire comme ça :

1
2
3
4
<?
$requete = 'SELECT * FROM articles WHERE art_id='.$_GET['id'];
//ou
$requete = "UPDATE articles SET art_design='$design', art_descript='$descript', art_prix='$prix', art_qte='$qte', _four_id='$four' WHERE art_id=$numart ";

Tu dois faire une de ces deux méthodes :

1
2
3
4
<?
$requete = 'SELECT * FROM articles WHERE art_id= ?';
//ou
$requete = "UPDATE articles SET art_design=?, art_descript=?, art_prix=?, art_qte=?, _four_id=? WHERE art_id=?";

ou

1
2
<?
$requete = 'SELECT * FROM articles WHERE art_id= :id';

Puis lis ça pour savoir comment utiliser prepare : http://php.net/manual/fr/pdo.prepared-statements.php

Ensuite c’est bien de vérifier le type de variable (int ou str), si elles sont définies (isset), ou la longueur du texte.

+0 -0

Dans l’idéal, remplace par ce qui t’est expliqué deux messages avant celui-ci (prends le temps de lire au moins le premier lien qui y est fourni).

Cela implique de ne pas utiliser directement $_GET (ni $_POST le cas échéant) dans la chaîne de requête, mais de remplacer par des éléments qu’on appelle des marqueurs.
Ces marqueurs sont soit nommés (exemple : :id), soit "positionnés" (et du coup, c’est uniquement un ?). Ils remplacent une valeur dans la requête, y compris les guillemets pour les chaînes de caractères.

Ces marqueurs, c’est à l’exécution de la requête qu’ils seront identifiés et remplacés par les valeurs que tu souhaites utiliser. Ces valeurs seront sécurisées du point de vue de la base de données, donc un souci en moins !

+0 -0

C’est assez simple.

  1. Tu créés la chaîne de requête avec les marqueurs là où tu aurais utilisé $_GET ;
  2. Tu prépares la requête avec la méthode PDO::prepare et mets dans une variable ce qui t’est retourné, que je vais appeler "déclaration" ;
  3. Tu exécutes la déclaration avec la méthode execute() de la variable récupérée au point 2, et tu passes en paramètre les valeurs que tu veux avoir dans la requête (celles qui remplaceront les marqueurs).

Fais quelques essais et si vraiment tu bloques, reviens nous montrer ton nouveau code  :)

+0 -0

Hello!

Bonjour, il y a deux problèmes avec ta requêtes :

  1. elle est sensibles aux injections (faille de sécurité)
artragis

Hahaha, c’est le premier truc que j’ai repéré. Malheureusement, dans certaines filières (CyrilleGrd est en DUT MMI si j’ai bien compris) la sécurité n’est pas une priorité… Du coup je me demande si ça vaut bien la peine de la noyer d’informations de la sorte qui sont un peu hors sujet, sachant qu’elle doit rendre quelque chose rapidement…

Enfin, cela étant, à lire les snippets fournis en premier message et indépendamment des problèmes de sécurité que tout le monde a soulevés, je constate que :

  • la première page affiche un formulaire utilisant la méthode POST
  • la seconde page récupère des informations via le tableau superglobal $_GET. Pour moi, il faut utiliser soit l’un, soit l’autre.

Et aussi se mettre d’accord sur les clefs des données. Dans le formulaire, je vois ça :

1
<p>ID <input type='text' name='id' value='<?php echo $ligne['art_id'] ?>'><br></p>

Donc je devrais avoir une clef id alors que sur la page cible, je vois ça :

1
$_GET['numart'];

Pour moi, c’est pas bon. Je devine que id et numart désignent la même donnée (le numéro de l’article). Il faudrait choisir soit l’un, soit l’autre.

Et à aucun moment tu n’indiques de fournisseur pour ton produit.

Essaie quelque chose comme :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
        $design = $_POST['Designation'];
        $descript = $_POST['Description'];
        $prix = $_POST['Prix'];
        $qte = $_POST['Quantité'];
        $four = 1; // Mettre un identifiant de fournisseur valide
        $numart = $_POST['id'];

        include('../config.inc.php');
        $bdd = new PDO('mysql:host='.BDD_SERVER.';dbname='.BDD_DATABASE.';charset=utf8', BDD_LOGIN, BDD_PASSWORD);
        $requete = "UPDATE articles SET art_design='$design', art_descript='$descript', art_prix='$prix', art_qte='$qte', _four_id='$four' WHERE art_id=$numart ";
        $bdd->query($requete);
    ?>

En bref, il faut bien être cohérent entre le nom des données postées et le nom des données reçues.

Désolé si je fais l’impasse sur les problématiques sévères de sécurité, mais ça n’est clairement pas l’objet du topic. Je te recommande tout de même de lire ultérieurement le tutoriel de Que20 sur les injections SQL.

En effet Ymox, la modification a sauté (sur Android des fois l’édition du message est agaçante). J’ai donc corrigé mon message.

Pour ce qui est du message de Ge0, évite peut-être d’utiliser des accents dans $_GET ou $_POST (pour éviter/prévenir de certain problème).

De plus, le message de Ge0 ne prend pas en compte les éventuelles apostrophe ' que peut contenir la description ou le titre et donc provoquer une erreur sans pour autant avoir volontairement pirater ta base de données.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte