Mise à jour base mysql

Bonjour,

Suite à un upload de fichier, je veux mettre un champ d'une base mysql à jour (adresse du fichier uploadé). Ce champ comporte déjà un enregistrement (adresse d'une image ou doc existante). Ce ne serait juste qu'une complémentation.
L'upload se passe bien, mais apparemment, la requête ne s'éxécute pas. Voilà ce que j'ai écrit :

$requete_update = "UPDATE manifestations SET lien_fichier='$lien_fichier' , fichier='$fichier' , extension='$extension' WHERE id='$id'";

J'ai l'impression que ce n'est pas la bonne requête !!!! ???

Quelle est celle que je dois utiliser pour complémenter un champ texte d'une base de donnée ?

Merci
Configuration: Windows Vista Internet Explorer 7.0

23 réponses

Résumé de la discussion

La mise à jour d'un champ dans une base MySQL après l'upload d'un fichier vise à enregistrer l'adresse du fichier dans un champ préexistant déjà. Des réponses divergent sur la syntaxe de l UPDATE, l'échappement des valeurs et la manière de concaténer les données, avec des conseils sur l'utilisation de mysql_query et des tests en amont. D'autres intervention suggèrent d'assurer le bon transfert de l'identifiant via POST plutôt que GET, ou via un champ caché, puis de tester le flux d'upload et la récupération de l'id avant l UPDATE. En cas de test, certains proposent d'utiliser des requêtes préparées ou, à défaut, d'échapper correctement les guillemets et d'éviter les concaténations directes, afin d'améliorer la sécurité et la fiabilité.

Bobot (l’IA à votre service)
  1. Bonjour P@t@ch0n,

    J'arrive au bout du problème ..... :o))

    Il me reste un problème d'affichage. Suite à l'affichage du texte, le premier élément de upload affilié au texte s'affiche en dessous, le tableau se ferme, et les autres éléments de upload affiliés au texte s'affichent également mais en dehors du tableau.

    Je n'arrive pas à rentrer "les autres éléments" dans le tableau, et à les afficher l'un à côté de l'autre.

    Voici mon code :

    $requete="SELECT manifestations.id, manifestations.jour , manifestations.heure ,manifestations.datefr ,manifestations.titre ,manifestations.texte , upload.id_liaison, upload.lien_fichier, upload.fichier, upload.extension
    FROM manifestations LEFT JOIN upload ON manifestations.id=upload.id_liaison
    ORDER BY manifestations.date ASC";
    $result = mysql_query($requete,$link) or exit ('Erreur : '.mysql_error() );

    $idEncours = 0;
    while($row = mysql_fetch_array($result))
    {
    if( $idEnCours != $row['id'] )
    {
    echo '<table width="800px" border="1">';
    echo '<tr>';
    echo '<td align="center">'.nl2br($row['texte']).'<p>';
    }
    if ($idEnCours = $row['id_liaison']);

    if (in_array($row['extension'], array( ".jpg", ".JPG", ".png", ".PNG", ".jpeg", ".JPEG", ".gif", ".GIF")))
    {
    echo '<center><a href ="http://xxxxxxx ' . $row['lien_fichier'] . '"><img src="http://xxxxxxx ' . $row['lien_fichier'] . '"></a></center>';
    }
    elseif (in_array($row['extension'], array( ".doc", ".DOC", ".pdf", ".PDF")))
    {
    echo '<center><a href ="http://xxxxx ' . $row['lien_fichier'] . '">Télécharger ou afficher le document<br><img src="../../../images/commande.gif"></a></center>';
    }
    echo '</td></tr></table><p>';
    }


    Merci
    0
    1. Je te l'ai expliqué plus haut comment il faut faire.

      Le LEFT JOIN permettra de retourner tous les enregistrements de ta table manifestation, mais s'il n'y a pas de lignes affiliées à elles dans la table upload, les colonnes sélectionnées de la table upload auront pour valeur NULL.

      Ensuite pour la non-répétitions de chaque colonnes sélectionnées de la table manifestation qu'il y a de lignes dans la table upload, il suffit de stocker l'id précédent dans une variable, de comparer avec l'id actuel du tour de boucle et si différent, on affiche les colonnes de manifestation, et on change la valeur de cette variable par l'id courant.

      Donc niveau code, cela donne.

      // Ordonnancement par les ids en premiers et date en second ESSENTIEL POUR GÉNÉRER L'AFFICHAGE ORDONNÉ
      $requete = 'SELECT id, texte, id_liaison, extension, lien_fichier FROM manifestations
      LEFT JOIN upload ON id = id_liaison
      ORDER BY id, date';
      $result = mysql_query($requete,$link) or exit ('Erreur : '.mysql_error() );
      
      $idEnCours = 0; // On déclare cette variable de stockage avec une valeur ne pouvant être un id de la table, 0 donc.
      while($row = mysql_fetch_array($result))
      {
          // Si la valeur de l'id de la table manifestation est différent de la valeur de $idEnCours 
          // (ce qui sera forcément le cas lors du 1er tour de boucle)
          // On affiche les colonnes de la table manifestation, et on modifie la valeur de $idEnCours par la valeur de l'id de manifestation
          if( $idEnCours != $row['id'] )
          {
              $idEnCours = $row['id_liaison'];
              echo nl2br($row['texte']);
          }
          
          // Pour savoir s'il y a des lignes correspondantes dans la table upload et le cas échéant les afficher, l'id_relation 
          // (ou n'importe quelle autre colonne de la table upload) ne doit pas valoir NULL
          if( $row['id_liaison'] !== null )
          {
             if (in_array($row['extension'], array( '.jpg', '.JPG', '.png', '.PNG', '.jpeg', '.JPEG', '.gif', '.GIF')))
             {
                 echo '<a href ='http://xxxxxxxxxxx ' . $row['lien_fichier'] . ''><img src='http://xxxxxxxxxxxxxxxx ' . $row['lien_fichier'] . ''></a>';
             }
             elseif (in_array($row['extension'], array( '.doc', '.DOC', '.pdf', '.PDF', '.txt', '.TXT')))
             {
                 echo '<center><a href ='http://xxxxxxxxxxxx ' . $row['lien_fichier'] . ''>Télécharger<br><img src='../../../commande.gif'></a>';
             }
          }
          else
          {
              echo '<em>aucun fichier affilié à cette manifestation</em>';
          }
      }
      0
      1. C'est bon !!!!! J'ai réussi grâce à ton code .......... ;o))
        Virré toutes les balises et rajouté au fur et à mesure .....

        Merci pour tout ............. ;o))
        0
    2. Merci P@t@ch0n ... ;o))

      Maintenant, si je veux associé plusieurs éléments de la table upload à un unique enregistrement de la table manifestation (donc ces éléments de upload ont le même id_liaison qui font référence au même enregistrement de manifestation), à l'affichage, j'ai l'élément de manifestation qui s'affiche autant de fois qu'il a d'élément de upload associé.
      Comment faire pour qu'à l'affichage, l'élément de manifestation s'affiche une seule fois avec tous les éléments de upload associés ?

      J'espère avoir été assez clair ..... :o))
      Merci ....
      0
      1. « J'ai testé ce que tu me proposes ! Malheureusement, il n'y a que les enregistrements de la table manifestation ayant une liaison avec la table upload qui s'affichent .... »

        Bah oui, c'est ce que la requete va chercher, je croyais que c'est ce que tu voulais.
        Tu voudrais donc que toutes lignes de manifestation s'affichent ?

        Si c'est ça, il suffit simplement d'utiliser un LEFT JOIN à la place du JOIN.

        Ensuite, pour $idEncours, cette variable n'est là que pour générer un affichage sans répéter à chaque tour de boucle le contenu de texte.
        Ce n'est pas ce que tu voulais non plus ?

        Un peu de précisions donc :)
        0
        1. Merci .... :o))

          J'ai testé ce que tu me proposes ! Malheureusement, il n'y a que les enregistrements de la table manifestation ayant une liaison avec la table upload qui s'affichent ....
          Je pense que ça vient de $idEncours (ce que je ne comprends pas trop !!!!)
          Alors je cherche , je cherche .....

          Pour répondre à tes questions, je n'ai pas mis la casse des extensions uniquement en minuscule, car parfois les extensions sont écrites en majuscule, et je ne sais pas si php fait la différence .... (c'est vrai que j'aurais pu tester .... )
          0
          1. Salut,

            Comme ceci.

            // Ordonnancement par les ids en premiers et date en second
            $requete = 'SELECT texte, extension, lien_fichier FROM manifestations m
            JOIN upload u ON m.id = u.id_liaison
            ORDER BY u.id_liaison, m.date';
            $result = mysql_query($requete,$link) or exit ('Erreur : '.mysql_error() );
            
            $idEnCours = 0;
            while($row = mysql_fetch_array($result))
            {
                if( $idEnCours != $row['id_liaison'] )
                {
                    $idEnCours = $row['id_liaison'];
                    echo nl2br($row['texte']);
                }
                if (in_array($row['extension'], array( '.jpg', '.JPG', '.png', '.PNG', '.jpeg', '.JPEG', '.gif', '.GIF')))
                {
                    echo '<a href ='http://xxxxxxxxxxx ' . $row['lien_fichier'] . ''><img src='http://xxxxxxxxxxxxxxxx ' . $row['lien_fichier'] . ''></a>';
                }
                elseif (in_array($row['extension'], array( '.doc', '.DOC', '.pdf', '.PDF', '.txt', '.TXT')))
                {
                    echo '<center><a href ='http://xxxxxxxxxxxx ' . $row['lien_fichier'] . ''>Télécharger<br><img src='../../../commande.gif'></a>';
                }
            }


            Autres commentaires, pourquoi n'as tu pas mit la casse des extensions en minuscules uniquement ?
            Le point des extensions n'a pas non plus besoin d'être enregistré dans la table.
            0
            1. Je pense que ça vient de $idEncours (ce que je ne comprends pas trop !!!!)
              0
          2. Bonjour,

            Je ne suis pas assez callé en php pour c omprendre ce que tu me dis !!!!!

            Voilà ce que j'ai écrit :


            $requete = 'SELECT * FROM manifestations, upload ORDER BY date ASC'; //--- le ORDER uniquement valable pour la table manifestation---
            $result = mysql_query($requete,$link) or die ('Erreur : '.mysql_error() );
            while($row = mysql_fetch_array($result))
            {
            echo .nl2br($row['texte']).; //---données venant de la table manifestation---
            if ($id == $id_liaison) //---id venant de la table manifestation, id_liaison venant de la table upload---
            if (in_array($row['extension'], array( ".jpg", ".JPG", ".png", ".PNG", ".jpeg", ".JPEG", ".gif", ".GIF")))
            {
            echo '<a href ="http://xxxxxxxxxxx ' . $row['lien_fichier'] . '"><img src="http://xxxxxxxxxxxxxxxx ' . $row['lien_fichier'] . '"></a>'; //données venant de la table upload
            }
            else if (in_array($row['extension'], array( ".doc", ".DOC", ".pdf", ".PDF", ".txt", ".TXT")))
            {
            echo '<center><a href ="http://xxxxxxxxxxxx ' . $row['lien_fichier'] . '">Télécharger<br><img src="../../../commande.gif"></a>';
            }
            }
            mysql_free_result($result);
            exit;
            ?>


            Je suis conscient que mon $requete est plutôt général, mais je ne sais pas comment l'écrire ????
            J'ai rajouté des //--- pour des commentaires, que ce soit plus lisible.
            0
            1. « tous les enregistrements de la table manifestation s'affichent autant de fois (et avec) qu'il y a d'enregistrements dans la table upload. »

              C'est tout à fait normal, le sql ressort toujours les données brutes.
              À toi de gérer l'affichage désiré avec php.

              Préfère également les jointures normalisées.

              SELECT les_colonnes  FROM manifestations m
              JOIN  upload u
                  ON m.id=u.id_liaison
              ORDER BY date ASC
              0
              1. Merci !!!! J'ai créé une 2° table, et je fais une jointure.

                J'avance et je te tiens au courant .... ;o))
                0
                1. « Qu'en penses-tu ? »

                  Que c'est une mauvaise idée.

                  J'entends par table séparée, une table destinée uniquement à enregistrer tes données concernant l'upload de tes fichiers.
                  0
                  1. Bonjour,

                    J'ai donc créé deux tables. Une "manifestations", et une "upload" pour les pièces uploadés (images, doc, ....).
                    La table upload comprend un champs nommé id_liaison qui est égal à l'id de l'enregistrement correspondant de la table manifestation. Mais tous les enregistrements de la table manifestation non pas obligatoirement un fichier uploadé dans la table upload.

                    Si j'écris ceci :
                    $requete = 'SELECT * FROM manifestations, upload ORDER BY date ASC';
                    $result = mysql_query($requete,$link) or die ('Erreur : '.mysql_error() );
                    while($row = mysql_fetch_array($result))

                    tous les enregistrements de la table manifestation s'affichent autant de fois (et avec) qu'il y a d'enregistrements dans la table upload.

                    Si je rajoute une condition if ($id = $id_liaison), puis l'echo des éléments de la table upload, les éléments de la table manifestation s'affichent en double sans les éments uploadés correspondant !!!????

                    Merci pour le coup de main !
                    0
                2. 1) Quentends-tu par "table séparée" ?

                  2) Si je veux complémenter ma table avec de nouvelles valeurs, comme je ne peux enregistrer plusieurs valeurs dans le même champs, dois-je créer à chaque fois un nouveau champs ? Et comment incrémenter le nouveau nom de ce nouveau champs ?

                  3) J'avais pensé récupérer l'enregistrement existant dans les champs, les renommés en "_old", et au moment de l'update, faire un genre de
                  $sql = "UPDATE manifestations SET lien_fichier='$lien_fichier_old $dossier.$fichier',fichier='$fichier_old $fichier',extension='$extension_old $extension' WHERE id='$id'";

                  Qu'en penses-tu ?
                  0
                  1. Encore une fois, je dirais que l'on n'enregistre pas plusieurs valeurs dans un même champ.

                    Si une ligne de ta table manifestation peut posséder plusieurs fichiers, tu dois faire une table séparée pour ceux-ci.

                    Tu gagneras en facilité sur les futures manipulations.
                    0
                    1. L'upload ne peut s'effectuer en methode get, post obligatoire.

                      J'avais pas fait attention à cela.
                      Donc l'id que tu devras récupérer sera dans $_POST, et plus dans get.

                      Et d'ailleurs, tu n'es plus obligé de le transmettre via un champ caché (cela est mieux quand même), tu peux le passer directement dans l'attribut action de ton form.
                      0
                      1. OK !!! Génial !!!! Ca marche ..... !!!!

                        Par contre, y'a encore un 'tit problème avec ma requête UPDATE que voici :

                        $sql = "UPDATE manifestations SET lien_fichier='$dossier.$fichier',fichier='$fichier',extension='$extension' WHERE id='$id'";
                        mysql_query($sql) or die('Erreur SQL !'.$sql.mysql_error()); "<br />$sql";


                        Les upload sont bien enregistrés dans la base, mais si il existe déjà un enregistrement dans le champs, le dernier upload écrase le précédent. Alors que je voudrais qu'il se rajoute .....

                        Comment résoudre cela ?

                        Merci
                        0
                    2. C'est logique non ?
                      Le code php doit toujours se trouver entre <?php et ?>

                      Donc :

                      ...
                      <input type="hidden" name="id" value="<?php echo (int)$_GET['id']; ?>" />
                      ... 
                      0
                      1. Merci !!!! Effectivement .........

                        Maintenant, mon upload de fichier ne fonctionne plus ..... ???? J'ai rien touché, j'y comprends plus rien ........ Bref !!!!!

                        Voici une partie du code :

                        $dossier = 'upload/';
                        $fichier = basename($_FILES['monfichier']['name']);
                        $taille_maxi = 100000;
                        $taille = filesize($_FILES['monfichier']['tmp_name']);
                        $extensions = array('.png', '.gif', '.jpg', '.JPG', '.jpeg');
                        $extension = strrchr($_FILES['monfichier']['name'], '.');
                        //Début des vérifications de sécurité...
                        if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
                        {
                        $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';
                        }
                        if($taille>$taille_maxi)
                        {
                        $erreur = 'Le fichier est trop gros...';
                        }
                        if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
                        {
                        //On formate le nom du fichier ici pour éviter les accents, caractères spéciaux, espaces, qui peuvent poser problème ....
                        $fichier = strtr($fichier,
                        'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
                        'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
                        $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
                        if(move_uploaded_file($_FILES['monfichier']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
                        {
                        echo 'Upload effectué avec succès !';
                        }
                        else //Sinon (la fonction renvoie FALSE).
                        {
                        echo 'Echec de l\'upload !';
                        }
                        }
                        else
                        {
                        echo $erreur;
                        }

                        ?>


                        Si je tente d'uploader un fichier jpg ou doc, j'ai automatiquement le message d'erreur 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...', alors que l'extension est bonne !!!???

                        Comment ça se fait ?

                        Merci
                        0
                    3. Merci P@t@ch0n !

                      J'ai donc modifier mon upload.php (qui contient également du html) ainsi :

                      // connection à la DB
                      $link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
                      mysql_select_db($db) or die ('Erreur :'.mysql_error());

                      $id = $_GET["id"];

                      $result=mysql_query("SELECT * FROM manifestations WHERE id='$id'");
                      echo '<pre>'; print_r($_GET); echo '</pre>'; // visualiser l'id sélectionné en test
                      ?>
                      <html>

                      <head>
                      <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
                      <title>Upload fichier</title>
                      </head>

                      <body bgcolor="#0000FF">
                      <form enctype="multipart/form-data" method="GET" action="add-manif-pj.php" value="envoyer" name="soumettre">
                      <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
                      <input type="hidden" name="id" value="' . (int)$_GET['id'] . '" />
                      <input type="file" name="monfichier" size="51" /><p>
                      <input type="reset" value="Effacer">
                      <input type="submit" name="preview" value="Valider">
                      ..................


                      Et dans mon add-manif-pj.php, quand j'exécute
                      $id = $_GET['id'];
                      echo 'L\'id est :';
                      echo $id ;

                      J'ai comme réponse :
                      L'id est :' . (int)$_GET['id'] . '

                      ???????
                      0
                      1. Merci P@t@ch0n !

                        J'ai donc modifier mon upload.php (qui contient également du html) ainsi :

                        // connection à la DB
                        $link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
                        mysql_select_db($db) or die ('Erreur :'.mysql_error());

                        $id = $_GET["id"];

                        $result=mysql_query("SELECT * FROM manifestations WHERE id='$id'");
                        echo '<pre>'; print_r($_GET); echo '</pre>'; // visualiser l'id sélectionné en test
                        ?>
                        <html>

                        <head>
                        <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
                        <title>Upload fichier</title>
                        </head>

                        <body bgcolor="#0000FF">
                        <form enctype="multipart/form-data" method="GET" action="add-manif-pj.php" value="envoyer" name="soumettre">
                        <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
                        <input type="hidden" name="id" value="' . (int)$_GET['id'] . '" />
                        <input type="file" name="monfichier" size="51" /><p>
                        <input type="reset" value="Effacer">
                        <input type="submit" name="preview" value="Valider">
                        ..................


                        Et dans mon add-manif-pj.php, quand j'exécute
                        $id = $_GET['id'];
                        echo 'L\'id est :';
                        echo $id ;

                        J'ai comme réponse : L'id est :' . (int)$_GET['id'] . '

                        ???????
                        0
                        1. C'est normal que tu le perdes, ton form utilise la method get.

                          Il faut donc que tu transmettes ton id via ton form, en ajoutant un champ caché dans celui-ci.

                          echo '<input type="hidden" name="id" value="' . (int)$_GET['id'] . '" />';
                          0
                          1. Bonsoir,
                            j'ai ajouté quelques " voyez si cela va meiux.

                            $requete_update = "UPDATE manifestations SET lien_fichier='".$lien_fichier."' , fichier="'.$fichier."' , extension="'.$extension.'" WHERE id="'.$id."'";
                            0
                            1. Bonjour à tous,

                              Bon ben ça ne marche toujours pas !
                              J'ai modifier ma requête, mais c'est pas mieux !!!!

                              J'ai constaté que je perdais l'id, une fois arrivé au script add.
                              Je sélectionne donc un enregistrement, et je le récupère dans mon script upload.php.

                              $id = $_GET["id"];

                              $result=mysql_query("SELECT * FROM manifestations WHERE id='$id'");
                              echo '<pre>'; print_r($_GET); echo '</pre>'; // visualiser l'id sélectionné
                              ?>
                              <html>

                              <head>
                              <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
                              <title>Upload fichier</title>
                              </head> ..................
                              <form enctype="multipart/form-data" method="GET" action="add-manif-pj.php" value="envoyer" name="soumettre">


                              Là je teste l'id et il est bien présent.

                              Par contre, l'id n'arrive pas à add-manif-pj.php

                              // connection à la DB
                              $link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
                              mysql_select_db($db) or die ('Erreur :'.mysql_error());

                              $id = $_GET['id'];
                              echo 'L\'id est :';
                              echo $id ;
                              echo '<pre>'; print_r($_GET); echo '</pre>'; // visualiser l'id sélectionné


                              Et ma fameuse requête :

                              $sql = "UPDATE manifestations SET lien_fichier='".$dossier.$fichier."', fichier='".$fichier."' , extension='".$extension."' WHERE id='".$id."'";
                              mysql_query($sql) or die('Erreur SQL !'.$sql.mysql_error());


                              La variable ".$dossier.$fichier." correspond à deux variable que je veux coller dans mon enregistrement, l'une à la suite de l'autre .....

                              Merci pour votre aide car je m'en sort pô ... :o((
                              0
                          2. Si je met mysql_query($query_update), j'ai comme réponse "query is empty ..."

                            Je pense que c'est la requête UPDATE qui est mal écrite et qui ne s'exécute pas .... !!!!! Mais là .... ?????
                            0
                            1. bonsoir,
                              tenter mysql_query($query_update)
                              mais mettre à jour des données ne peut se faire avec un insert
                              0
                              • 1
                              • 2