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

PHP & Base de données Discussion :

Edition d'article : impossible de trouver ce qui cloche


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 8
    Par défaut Edition d'article : impossible de trouver ce qui cloche
    Bonjour,

    Voilà j'ai créé un site avec une partie administration qui permet de créer, éditer et supprimer des articles.

    La partie création et la suppression fonctionnent très bien. Par contre l'édition fonctionne mais pas à chaque fois.
    J'ai bien essayé de trouver ce qui clochait mais je n'y arrive pas. Quand je copie ma requête directement dans PHPMyadmin ça fonctionne mais lorsque j'utilise mon formulaire, ça marche pour certain articles et pas pour d'autres (mais jamais de message d'erreur, c'est juste la table qui ne se modifie pas).

    Voici mon code :

    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
     
     <?php
     
    try
    {
    $bdd = new PDO('***;dbname=***;charset=utf8', '***', '***');
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }
     
    $reponse = $bdd->query('SELECT * FROM produit WHERE id = '.$_GET['id'].'');
     
    $donnees = $reponse->fetch()
     
    ?>
    <div class="row">								
        <form class="col-md-6" action="edit_validation.php" method="post">
     
    		<h3>Miniature :</h3>
    		<label>Titre de la page du produit :</label><input type="text" name="title_head" value="<?php echo $donnees['title_head'];?>" required="required" ><br/><br/>
    		<label>Meta description :</label><textarea rows="4" cols="50" name="meta_desc"  required="required" ><?php echo $donnees['meta_desc'];?></textarea><br/><br/>
    		<label>Titre du produit :</label><input type="text" name="titre" value="<?php echo $donnees['titre'];?>" required="required" ><br/><br/>
    		<label>Description :</label><textarea rows="4" cols="50" name="descrip"   required="required" ><?php echo $donnees['descrip'];?></textarea><br/><br/>
    		<label>Image :</label><input type="text"  name="image_name" value="<?php echo $donnees['image'];?>"  required="required" ><br/><br/>
    		<label>Lien :</label><input type="text"  name="lien" value="<?php echo $donnees['lien'];?>"  required="required" ><br/><br/>
    		<input type="hidden" name="id" value="<?php echo $_GET['id'] ?>" required="required" >
    		<h3>Fiche produit :</h3>
    		<label>Description produit :</label><textarea rows="4" cols="50" name="desc_produit"  required="required"><?php echo $donnees['desc_produit'];?></textarea><br/><br/>
    		<label>Description supplémentaire :</label><textarea rows="4" cols="50" name="desc_produit_plus" ><?php echo $donnees['desc_produit_plus'];?></textarea><br/><br/>
    		<label>Image supp 1 :</label><input type="text"  name="image_name_un" value="<?php echo $donnees['photo_deux'];?>"  ><br/><br/>
    		<label>Image supp 2 :</label><input type="text"  name="image_name_deux" value="<?php echo $donnees['photo_trois'];?>"  ><br/><br/>
    		<label>Image supp 3 :</label><input type="text"  name="image_name_trois" value="<?php echo $donnees['photo_quattre'];?>"  ><br/><br/>
    		<label>Image supp 4 :</label><input type="text"  name="image_name_quattre" value="<?php echo $donnees['photo_cinq'];?>"  ><br/><br/>
    		<label>Image supp 5 :</label><input type="text"  name="image_name_cinq" value="<?php echo $donnees['photo_six'];?>"  ><br/><br/>
     
            <input  type="submit" name="upload" value="Envoyer" />
     
        </form>			
    </div>								
    <?php
     
     
    $reponse->closeCursor(); 
     
    ?>
    Ici je récupère bien tous mes champs avec leur contenu Qee je peux modifier. Et je les envoies vers la page suivante :


    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
     
     <?php
    $meta_description = $_POST['meta_desc'];
    $meta_description = addslashes(nl2br($meta_description));
    $description = $_POST['descrip'];
    $description = addslashes(nl2br($description));
    $description_produit = $_POST['desc_produit'];
    $description_produit = addslashes(nl2br($description_produit));
    $description_plus = $_POST['desc_produit_plus'];
    $description_plus = addslashes(nl2br($description_plus));
    try
    {
    $bdd = new PDO('****;port=3306;dbname=****;charset=utf8', '****', '*****');
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }
     
     
    $bdd->exec('UPDATE produit SET titre = \''.$_POST['titre'].'\', title_head = \''.$_POST['title_head'].'\', meta_desc = \''.$meta_description.'\', descrip = \''.$description.'\', image = \''.$_POST['image_name'].'\', lien = \''.$_POST['lien'].'\', titre_produit = \''.$_POST['titre'].'\', desc_produit = \''.$description_produit.'\', desc_produit_plus = \''.$description_plus.'\', photo_un = \''.$_POST['image_name'].'\', photo_deux = \''.$_POST['image_name_un'].'\', photo_trois = \''.$_POST['image_name_deux'].'\', photo_quattre = \''.$_POST['image_name_trois'].'\', photo_cinq = \''.$_POST['image_name_quattre'].'\', photo_six = \''.$_POST['image_name_cinq'].'\' WHERE id = '.$_POST['id'].'');
     
     
     
     
     
     
     
      header('Location: admin_choix.php');
      exit();
     
     
    ?>
    Voilà, pourquoi parfois ça fonctionne et parfois pas suivant l'article que je veux modifier?

    Si une bonne âme pouvait m'éclairer

    Merci,

    Ben

  2. #2
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Bonjour !
    Je suis une bonne âme !
    Etape 1

    Tu utilises un bloc try & catch, super ! Mais pourquoi alors ne pas profiter de ses bons et loyaux services sur tout ton traitement, et pas seulement sur la connexion !

    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
     <?php
    $meta_description = $_POST['meta_desc'];
    $meta_description = addslashes(nl2br($meta_description));
    $description = $_POST['descrip'];
    $description = addslashes(nl2br($description));
    $description_produit = $_POST['desc_produit'];
    $description_produit = addslashes(nl2br($description_produit));
    $description_plus = $_POST['desc_produit_plus'];
    $description_plus = addslashes(nl2br($description_plus));
    try
    {
       $bdd = new PDO('****;port=3306;dbname=****;charset=utf8', '****', '*****');
       $bdd->exec('UPDATE produit SET titre = \''.$_POST['titre'].'\', title_head = \''.$_POST['title_head'].'\', meta_desc = \''.$meta_description.'\', descrip = \''.$description.'\', image = \''.$_POST['image_name'].'\', lien = \''.$_POST['lien'].'\', titre_produit = \''.$_POST['titre'].'\', desc_produit = \''.$description_produit.'\', desc_produit_plus = \''.$description_plus.'\', photo_un = \''.$_POST['image_name'].'\', photo_deux = \''.$_POST['image_name_un'].'\', photo_trois = \''.$_POST['image_name_deux'].'\', photo_quattre = \''.$_POST['image_name_trois'].'\', photo_cinq = \''.$_POST['image_name_quattre'].'\', photo_six = \''.$_POST['image_name_cinq'].'\' WHERE id = '.$_POST['id'].'');
      header('Location: admin_choix.php');
      exit();
     
    }
    catch(Exception $e)
    {
             echo 'Exception reçue : ',  $e->getMessage(), "\n";
    }
    ?>
    Etape 2

    Et si on passait aux requêtes préparées ? Quitte à utiliser PDO, autant en profiter, d'autant que ta problématique est toute indiquée :

    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
    <?php
    $meta_description = $_POST['meta_desc'];
    $meta_description = addslashes(nl2br($meta_description));
    $description = $_POST['descrip'];
    $description = addslashes(nl2br($description));
    $description_produit = $_POST['desc_produit'];
    $description_produit = addslashes(nl2br($description_produit));
    $description_plus = $_POST['desc_produit_plus'];
    $description_plus = addslashes(nl2br($description_plus));
    try
    {
       $bdd = new PDO('****;port=3306;dbname=****;charset=utf8', '****', '*****');
       //ici 16 marqueurs anonymes (points d'interrogation)=>ce seront 16 variables à récupérer dans l'ordre à la ligne execute !
       $sql='UPDATE produit SET titre = ?, title_head = ?, meta_desc =?, descrip = ?, image = ?, lien = ?, titre_produit = ?, desc_produit = ?, desc_produit_plus = ?, photo_un = ?, photo_deux = ?, photo_trois = ?, photo_quattre = ?, photo_cinq = ?, photo_six = ? WHERE id = ?';
       $sth=$bdd->prepare($sql);
       //a toi de compléter ici les 14 autres variables !
       $sth->execute(array($_POST['title'],$_POST['title_head']));
       $nb_modif=$sth->rowCount();
       unset($bdd);
       //ça serait pas mal de récupérer à l'arrivée combien de lignes ont été updatées (ici 0 ou 1 bien sûr !)
       header('Location: admin_choix.php?update='$nb_modif);
       exit();
     
    }
    catch(Exception $e)
    {
             echo 'Exception reçue : ',  $e->getMessage(), "\n";
    }
    ?>
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 8
    Par défaut
    Merci pour ton aide.

    Je vais prendre le temps de comprendre ce code et je reviens te dire si ça a fonctionné.

    Bonne journée

  4. #4
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Oki doc.
    Par contre, je viens de modifier un petit truc : ton catch, il vaut mieux qu'il récupère les exceptions, et te les affiche, que ça soit des warnings ou des erreurs fatales... Donc je me suis contentée d'un echo dans le catch.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  5. #5
    Membre émérite Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 541
    Par défaut
    Salut,
    Dans ce code on peut se passer des variables intermédiaires, l'utilisation de addslashes ne se justifie pas et puis le nl2br ce n'est pas plutôt à l'affichage ?.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 8
    Par défaut
    Salut,

    Que veux-tu dire par variable intermédiaire?

    Et pour ce qui est de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $meta_description = $_POST['meta_desc'];
    $meta_description = addslashes(nl2br($meta_description));
    $description = $_POST['descrip'];
    $description = addslashes(nl2br($description));
    $description_produit = $_POST['desc_produit'];
    $description_produit = addslashes(nl2br($description_produit));
    $description_plus = $_POST['desc_produit_plus'];
    $description_plus = addslashes(nl2br($description_plus));
    Ça me sert à ce que les saut à la ligne soit bien pris en considération lorsque j'encode dans ma base de donnée.
    Mais lorsque j’édite mon article, je vois tous les <br/> à chaque saut de ligne dans mes input.

    Ce serait à cause de ça?

    Je vais aussi essayer.

    Merci pour l'info.

  7. #7
    Membre émérite Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 541
    Par défaut
    Exactement, elles ne sont pas nécessaires, il faut comme dans l'exemple de Dendrite utiliser directement $_POST['xxx'] dans execute.
    Pour le nl2br oui , il va insérer des br avant les sauts de ligne mais il faut réserver son utilisation à l'affichage (avec echo, print etc...)

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 8
    Par défaut
    J'ai trouvé ce qui déconnait.

    C'était à cause des guillemets dans mes textes.

    Le addslashes() règle le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $bdd->exec('UPDATE `categorie` SET `categ_article` = \''.addslashes($categ_article).'\' WHERE categ_id = '.$_POST['categ_id'].'');
    Dendrite :
    Je vais quand-même modifier ma requête en requête préparée

    Et Willy_k :

    En effet le nl2br à la lecture fonctionne très bien et plus besoin de faire toute ces manipulations avant la requête.


    Voilà problème résolu, encore merci!

  9. #9
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Tu fais bien.
    Voilà le genre de viol de ta base que ton code permettait et qui ne sera plus permis avec des requêtes préparées.

    https://fr.wikipedia.org/wiki/Injection_SQL

    Les requêtes préparées, c'est donc la base de la sécurité.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  10. #10
    Membre émérite Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 541
    Par défaut
    > Le addslashes() règle le problème.

    A ne pas utiliser dans un contexte de base de données surtout quand y a des fonctions dédiées (avec PDO on a PDO::quote), quoi qu'il en soit la requête doit être préparée et il faut le faire dès maintenant.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/09/2014, 19h34
  2. Réponses: 2
    Dernier message: 08/09/2014, 14h24
  3. [Plugin][MYECLIPSE]Impossible de trouver une JVM
    Par tolsam dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 08/08/2004, 20h46
  4. Impossible de trouver la procédure stockée
    Par engi dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 12/05/2004, 16h28

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