Page 1 sur 1

Modifier plusieurs lignes d'une table Mysql avec une seul requête

Posté : 07 nov. 2016, 19:01
par pmfontaine
Bonjour,
Je viens vers vous car je n'ai pas su adapter les solutions trouvé sur le Net pour modifier une table Mysql avec une seul requête.
Avec ce code J'affiche un tableau de 29 lignes modifiables. :
Page formulaire.php

Code : Tout sélectionner

<table> <form action="upload.php" method="post" enctype="multipart/form-data"> <fieldset> <caption>Tableau du Bureau</caption> <tr> <td class= "titre_col1">Non Prénom</td> <td class= "titre_col1">Bureau</td> </tr> <?php try { include('./connexion.php'); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } $req1 = $bdd->query('SELECT * FROM table_bureau LIMIT 0, 29'); while ($donnees = $req1->fetch()) { $id = $donnees['id']; $nom_prenom= $donnees['nom_prenom']; $bureau = $donnees['bureau']; ?> <input type="hidden" name="id" value="<?PHP echo $id?>"> <tr> <td> <input type="text" name="nom_prenom" value="<?php echo $nom_prenom; ?>"/> </td> <td> <input type="text" name="bureau" value="<?php echo $bureau; ?>"/> </td> </tr> <?php } $req1->closeCursor(); // Termine le traitement de la requête ?> <tr> <td colspan="2"><br/> <input type="submit" name="sub" value="Modifier !"> </td> </tr> </fieldset> </form> </table>
Avec le code suivant
Page upload.php

Code : Tout sélectionner

<?php $id =$_POST['id']; $nom_prenom =$_POST['nom_prenom']; $bureau =$_POST['bureau']; echo $id; echo $nom_prenom; echo $bureau; try { include('./connexion.php'); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } $req = $bdd->prepare('UPDATE table_bureau SET nom_prenom = :nom_prenom, bureau = :bureau WHERE id = :id'); $req->execute(array( ':nom_prenom' => $nom_prenom, ':bureau' => $bureau, ':id' => $id )); { } echo '</ul>'; $req->closeCursor(); ?>

Je souhaite donc modifier les 29 lignes de mon tableau. Mais avec mon code je ne modifie que la dernière.
J'ai bien vu sur le Net qu'il faudrait utiliser un "ARRAY" mais je ne sais pas faire.
SVP est-ce que vous pouvez m'aider ?
Merci d'avance pour votre aide
Patrick

Re: Modifier plusieurs lignes d'une table Mysql avec une seul requête

Posté : 07 nov. 2016, 22:06
par pmfontaine
En faite je viens de trouvé.
Avec

Code : Tout sélectionner

?> <input type="hidden" name="id[]" value="<?PHP echo $id?>"> <tr> <td> <input type="text" name="nom_prenom[]" value="<?php echo $nom_prenom; ?>"/> </td> <td> <input type="text" name="bureau[]" value="<?php echo $bureau; ?>"/> </td> </tr> <?php
et

Code : Tout sélectionner

<?php $ligne = 0; while ($ligne <= 29) { $id = $_POST["id"][$ligne]; $bureau = $_POST["bureau"][$ligne]; $nom_prenom = $_POST["nom_prenom"][$ligne]; echo $id; echo $bureau; echo $nom_prenom; ?> <br /> <?PHP try { include('./mdp/config.php'); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } $req = $bdd->prepare('UPDATE table_bureau SET nom_prenom = :nom_prenom, bureau = :bureau WHERE id = :id'); $req->execute(array( ':nom_prenom' => $nom_prenom, ':bureau' => $bureau, ':id' => $id )); { } echo '</ul>'; $req->closeCursor(); $ligne++; } ?>
Mais il y a peut-être plus pro ?

Re: [RESOLU] Modifier plusieurs lignes d'une table Mysql avec une seul requête

Posté : 09 nov. 2016, 17:53
par SwypeKeys
Mais il y a peut-être plus pro ?
Oui, je te conseil de créer une (ou des) classe(s), organise ton code et évite de mélanger code PHP et HTML.

Re: [RESOLU] Modifier plusieurs lignes d'une table Mysql avec une seul requête

Posté : 09 nov. 2016, 18:00
par pmfontaine
Oui, je te conseil de créer une (ou des) classe(s), organise ton code et évite de mélanger code PHP et HTML.
Merci Swypekeys pour ta réponse.
Mais je ne sais pas comment ne pas mélanger PHP et HTML !
Est-ce que tu aurais exemple simple en modifiant un minimum de mon code ?
Merci
Patrick

Re: [RESOLU] Modifier plusieurs lignes d'une table Mysql avec une seul requête

Posté : 09 nov. 2016, 19:16
par SwypeKeys
La première chose qui me vient à l'esprit c'est d'utiliser Twig afin de séparer ta partie traitement des données et la partie d'affichage => http://twig.sensiolabs.org/

Cela va rendre ton code beaucoup plus clair et flexible, c'est réellement important pour n'importe quel projet.

Donc il faut que tu installes composer les informations sont sur cette page https://getcomposer.org/download/
mais en gros tu ouvres ton invite de commande à l'emplacement de ton projet, tu copie-colle ci-dessus

Code : Tout sélectionner

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('SHA384', 'composer-setup.php') === 'aa96f26c2b67226a324c27919f1eb05f21c248b987e6195cad9690d5c1ff713d53020a02ac8c217dbf90a7eacc9d141d') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');"
et n'oublie pas d'exécuter la dernière ligne.

Ensuite il faut suivre les instructions ici http://twig.sensiolabs.org/doc/installation.html donc dans la même console tu tapes :

Code : Tout sélectionner

php composer.phar require "twig/twig:~1.0"
Cette commande va télécharger Twig et le déplacer dans le dossier vendor.

A présent Twig est installé dans tes sources.

Qu'est ce que Twig ? C'est un moteur de templates, donc au lieu de mélanger php et HTML, Twig donne la possibilité de pouvoir injecter des variables afin des les évaluer, traiter et afficher dans un contenu HTML.

Retour à ton projet.

Tu as formulaire.php qui affiche de les 30 premières lignes de ta base table_bureau

On peut donc l'éditer de cette manière :

formulaire.php
require_once 'vendor/autoload.php'; // Modifie l'emplacement en fonction de l'emplacement de ton fichier par rapport au dossier vendor

$loader = new Twig_Loader_Filesystem('vues'); // Ici on défini le ( ou les )  dossier(s) contenant les templates. Ici le dossier vues.

$twig = new Twig_Environment($loader));  // Ici on créer l'instance de l'objet Twig qui va servir à générer une templates.

// Maintenant que Twig est initialisé on effectue les actions tel que : récupérer les 30 premières lignes de ta base et les définir dans une seul variable de type array soit un tableau ensuite les afficher.
try
{
    include('./connexion.php');
}
    catch(Exception $e)
{
   die('Erreur : '.$e->getMessage());
}

$a_Tables = array();
$req  = $bdd->query('SELECT * FROM table_bureau LIMIT 0, 29');
while ($donnees = $req->fetch())
{
    $a_Tables[] = $donnees;
}
$req->closeCursor();

// Maintenant que $a_Tables contient les différentes lignes , nos actions sont terminer. On peut maintenant afficher le contenu souhaité c'est à dire, le tableau du Bureau
/**
Exemple du contenu de la variable $a_Tables :
   $a_Tables[0]['id'] = 1
   $a_Tables[0]['nom_prenom'] = Pierre Dugou
   $a_Tables[0]['bureau'] = 11
   $a_Tables[1]['id'] = 2
   $a_Tables[1]['nom_prenom'] = Ralph VW
   $a_Tables[1]['bureau'] = 12
   ....
   $a_Tables[29]['id'] = ...
   $a_Tables[29]['nom_prenom'] = ...
   $a_Tables[29]['bureau'] = ...
**/

echo $twig->render(
   'formulaire.twig.html',
   array(
      'Tables' => $a_Tables
   )
);

// Ici on affiche l'évaluation de la fonction  render de l'instance twig via le fichier formulaire.twig.html en injectant la variable $a_Tables alias Tables
Il faut maintenant créer la vue Twig. Donc préalablement créer le dossier vues à la racine du projet (au même niveau que le dossier vendor)

vues/formulaire.twig.html
<!doctype html>
<html lang="fr">
   <head>
      <meta charset="utf-8">
      <title>Formulaire</title>
   </head>
   <body>
   <table>
      <form action="upload.php" method="post" enctype="multipart/form-data">
         <fieldset>
            <caption>Tableau du Bureau</caption>
            <tr>
               <td class= "titre_col1">Non Prénom</td>
               <td class= "titre_col1">Bureau</td>
             </tr>
             {% for Table in Tables %}
                <input type="hidden" name="id[]" value="{{ Table.id }}">
                <tr>
                   <td>
                      <input type="text" name="nom_prenom[]" value="{{ Table.nom_prenom }}"/>
                   </td>
                   <td>
                      <input type="text" name="bureau[]" value="{{ Table.bureau }}"/>
                   </td>
                </tr>
             {% endfor %}
             <tr>
             <td colspan="2"><br/>
                <input type="submit" name="sub" value="Modifier !">
              </td>
           </tr>
        </fieldset>
     </form>
   </table>
</body>
</html>
A présent il faut s'attaquer au fichier upload.php je te laisse cette partie là.
Pense à vérifier que $_POST['id'] $_POST['bureau'] et $_POST['nom_prenom'] existent et qu'ils contiennent le même nombre de lignes. Que l'id est bien numérique etc ...

Je te ré-invite à aller sur http://twig.sensiolabs.org/ afin de bien comprendre le fonctionnement de Twig.
Je t'invite également à aller voir les documentations sur les classes et les objets de php. http://php.net/manual/fr/oop4.php

En espèrent t'avoir aidé en te donnant un exemple pour séparer le code à traiter et celui à afficher. Ceci n'est pas la manière de procéder par excellence ! Il y a une infinité, je t'en remets simplement un exemple. Si il y a des points pas très clair n'hésite pas à demander.

Re: [RESOLU] Modifier plusieurs lignes d'une table Mysql avec une seul requête

Posté : 09 nov. 2016, 23:59
par pmfontaine
Super,
Merci beaucoup SwypeKeys, je vais étudier tous cela attentivement.
Mais il me faudra un peu de temps pour tout assimiler, en espérant que je comprendrais tout.
Encore merci
Patrick