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 :

Problème UPDATE / WHERE


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2008
    Messages : 150
    Par défaut Problème UPDATE / WHERE
    Bonsoir à tous!

    J'ai un tio soucis, et je voudrais avoir votre avis.

    J'ai une base de données simple dans laquelle il y a des dates., le but étant d'afficher un tableau qui ressemble à ceci:

    Nom : test.jpg
Affichages : 85
Taille : 263,1 Ko

    Et dans ce tableau, je veux être en mesure de changer les dates d'un ou plusieurs champs date.

    Sauf qu'avec le code ci-dessous, seule la dernière ligne de mon tableau se met à jour. Si je change un champ autre que la dernière ligne, rien ne se passe.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    <form method="POST" action="Licences.php">
    <script src="//cdn.jsdelivr.net/webshim/1.14.5/polyfiller.js"></script>
     
    <?php	
    echo'<table class="tg" border="0" cellspacing="3" >';
     
    $db = mysqli_connect($localhost,$login,$pwd,$dbName)  or die('Erreur de connexion '.mysql_error()); 
    $res = $db -> query ('SELECT COUNT(*) AS total FROM licences') OR die(mysql_error());
    $row = mysqli_fetch_array($res);
     
    ?>
    <style type="text/css">
    #cellules
    td {
    padding: 5px;
    .tg {box-shadow: 1px 1px 12px #555;}									
    }
    </style>
     
    <?php
     
    echo"<tr>";
    echo"<th height=50 align=center bgcolor=#beceff>ID</th>";
    echo"<th  align=center bgcolor=#beceff>TYPE</th>";
    echo"<th  align=center bgcolor=#beceff>ATO / Organisation</th>";
    echo"<th  align=center bgcolor=#beceff>Date of Issue</th>";
    echo"<th  align=center bgcolor=#beceff>Expire Date</th>";
    echo"</tr>";
     
     
    $offset = ((isset($_REQUEST['offset']) && $_REQUEST['offset'] > 0) ? $_REQUEST['offset'] : 0);
     
     
    $sql_str  = 'SELECT SQL_CALC_FOUND_ROWS * FROM licences ORDER BY ID LIMIT '.$offset.', '.$limit3.'  ';
    $result   = $db -> query($sql_str);	while ($data = mysqli_fetch_array($result)) {
     
    echo"<tr id=cellules >";
    echo"<td height=30 bgcolor=#D7E1FF><input name='id' value=".($data['ID'])."></td>";
    echo"<td bgcolor=#D7E1FF>".$data['type']."</td>";
    echo"<td bgcolor=#D7E1FF>".$data['ato']."</td>";
     
     
     
    echo"<td width=150 align=center bgcolor=#D7E1FF><input name='datedebut' type='date' value=".($data['datedebut'])."></td>";
    if ($data['datefin']==="0000-00-00")
    {
    echo"<td bgcolor=#D7E1FF>'Valid for Life'</td>";
    }
    else
    {
    echo"<td width=150 align=center bgcolor=#D7E1FF><input name='datefin' type='date' value=".($data['datefin'])."></td>";
    }
    echo"</tr>";
    }
    echo "</table>";
     
     
     
    }
    }
    ?>
    <input class="css_button" type="submit" value="Mettre à jour les licenses..." name="envoyer">
     
    <?php
    // On commence par répérer les champs 
     
    if(isset($_POST['datedebut']))      $datedebut=$_POST['datedebut'];
    else      $datedebut="";
    if(isset($_POST['datefin']))      $datefin=$_POST['datefin'];
    else      $datefin="";
    if(isset($_POST['id']))      $id=$_POST['id'];
    else      $id="";
     
     
    // On vérifie si les champs sont vides 
    if(empty($datedebut) OR empty($datefin))  
    { 
     
    	echo "</br></br>";
     
    } 
    // Aucun champ n'est vide, on peut enregistrer dans la table 
    else      
    { 
     
    	$db = mysqli_connect($localhost,$login,$pwd,$dbName)  or die('Erreur de connexion '.mysql_error());       
     
    	$sql = "UPDATE licences SET datedebut='$datedebut',datefin='$datefin' WHERE id='$id'"; 
     
    	$res= $db -> query($sql) or die('Erreur SQL DE MERDE !'.$sql.'<br>'.mysql_error()); 
     
    	mysqli_close($db); 
     
    ?>						
     
     
     
     
    <?php
    }
     
    ?>

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Pose-toi la question : "comment identifier une ligne, pour savoir laquelle (lesquelles) modifier ?"

    Actuellement, tes input, d'une ligne à l'autre, ont les mêmes name="...".
    Normal donc que tu ne récupères que la dernière ligne, les données des autres étant "écrasés" au fur et à mesure...

    -> il faut créer des tableaux (array) de name :
    ex. : au lieu de <input... name='datedebut'.../>, on écrit <input... name='datedebut[]'.../>.
    Mais la ligne n'est pas encore clairement identifiée : à quel ID correspond ce datedebut ?
    -> on en spécifie l'index avec l'ID :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "<input... name='datedebut[".$data['ID']."]'.../>";
    D'autre part l'input ID ne sert à rien (les ID ne doivent pas être modifiés !

    Il reste :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    echo "<td height='30' bgcolor='#D7E1FF'>.$data['ID']."</td>";
     
    // ....
     
    echo "<td width='150' align='center' bgcolor='#D7E1FF'><input name='datedebut[".$data["ID"]."]' type='date' value=".($data['datedebut'])."/></td>";
     
    // ....
     
    echo "<td width='150' align='center' bgcolor='#D7E1FF'><input name='datefin[".$data["ID"]."]' type='date' value=".($data['datefin'])."/></td>";
    A la récupération :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $datedebut_array = $_POST['datedebut']; // array
    $datefin_array = $_POST['datefin']; // array
    // traitement
    foreach( $datedebut_array as $ID => $datedebut ) // on a ici l'ID et $datedebut correspondant à cet ID
    {
       $datefin = $datefin_array[$ID]; // $datefin correspondant à cet ID
       // UPDATE
       // .....
     
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2008
    Messages : 150
    Par défaut Merci pour la réponse
    Je sais que le champ ID ne sert à rien, j'ai fais ça bourrinement en pensant que c'est comme ça que j'allais pouvoir identifier les lignes.

    Je crois que je comprends mieux: Comment mon tableau a été créé avec une boucle, les $... s'arrêtent à la fin de la boucle, donc il faut que je refasse une sorte de boucle pour l'update.

    Ok, je vais bosser là dessus, je te remercie!

    Je posterai le code final quand ça marchera!

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2008
    Messages : 150
    Par défaut Mise à jour du code
    Salut!

    Alors, j'ai un peu avancé, j'ai modifié l'affichage du tableau de la manière 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
     
    echo"<tr>";
    echo"<th height=50 align=center bgcolor=#beceff>ID</th>";
    echo"<th  align=center bgcolor=#beceff>TYPE</th>";
    echo"<th  align=center bgcolor=#beceff>ATO / Organisation</th>";
    echo"<th  align=center bgcolor=#beceff>Date of Issue</th>";
    echo"<th  align=center bgcolor=#beceff>Expire Date</th>";
    echo"</tr>";
     
     
    $offset = ((isset($_REQUEST['offset']) && $_REQUEST['offset'] > 0) ? $_REQUEST['offset'] : 0);
     
     
    $sql_str  = 'SELECT SQL_CALC_FOUND_ROWS * FROM licences ORDER BY ID LIMIT '.$offset.', '.$limit3.'  ';
    $result   = $db -> query($sql_str);	while ($data = mysqli_fetch_array($result)) {
     
    echo "<tr id=cellules >";
    echo "<td height='30' bgcolor='#D7E1FF'>".$data['ID']."</td>";
    echo "<td bgcolor=#D7E1FF>".$data['type']."</td>";
    echo "<td bgcolor=#D7E1FF>".$data['ato']."</td>";
    echo "<td width=150 align=center bgcolor=#D7E1FF><input name='datedebut[".$data['ID']."]' type='date' value=".($data['datedebut'])."></td>";
     
     
     
    if ($data['datefin']==="0000-00-00")
    {
    echo"<td bgcolor=#D7E1FF>'Valid for Life'</td>";
    }
    else
    {
    echo "<td width=150 align=center bgcolor=#D7E1FF><input name='datefin[".$data['ID']."]' type='date' value=".($data['datefin'])."></td>";
     
    }
    echo"</tr>";
    }
    echo "</table>";
     
     
     
    }
    }
    ?>

    Cela fonctionne, et j'ai viré le input inutile pour ID.

    Ensuite, j'ai modifié de la manière qui suit pour la mise à jour de la BDD:

    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
    <?php
    // On commence par répérer les champs 
     
    if(isset($_POST['datedebut']))      $datedebut=$_POST['datedebut'];
    else      $datedebut="";
    if(isset($_POST['datefin']))      $datefin=$_POST['datefin'];
    else      $datefin="";
    if(isset($_POST['id']))      $id=$_POST['id'];
    else      $id="";
     
     
    // On vérifie si les champs sont vides 
    if(empty($datedebut) OR empty($datefin))  
    { 
     
    echo "</br></br>";
     
    } 
    // Aucun champ n'est vide, on peut enregistrer dans la table 
    else      
    { 
     
    $db = mysqli_connect($localhost,$login,$pwd,$dbName)  or die('Erreur de connexion '.mysql_error());       
     
    $datedebut_array = $_POST["datedebut"]; // array
    $datefin_array = $_POST["datefin"]; // array
    // traitement
    foreach( $datedebut_array as $ID => $datedebut ) // on a ici l'ID et $datedebut correspondant à cet ID
    {
    $datefin = $datefin_array[$ID]; // $datefin correspondant à cet ID
    $sql = "UPDATE licences SET datedebut='$datedebut',datefin='$datefin' WHERE id='$ID'"; 
     
     
    }
     
     
    $res= $db -> query($sql) or die('Erreur SQL DE MERDE !'.$sql.'<br>'.mysql_error()); 
     
    mysqli_close($db); 
     
    ?>
    Le problème est toujours le même, seule la dernière ligne veut bien se mettre à jour.
    Quand je change une date dans une des lignes précédentes, rien ne se passe...

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    - débarasse ton code du superflus comme tes "recuperations des champs" dont tu ne fais rien ensuite.
    - enlève toutes les fonctions mysql qui restent dans ton code
    - pour executer une requête en boucle et pour protéger des injections SQL quand on utilise des données externes, on utilise une requête préparée.
    - pour debuguer ton code, un simple echo des valeurs peut te donner une idée de ce qui se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    if (isset($_POST['datedebut'], $_POST['datefin']) { 
           $db = mysqli_connect($localhost,$login,$pwd,$dbName);       
           $stmt = $db->prepare("UPDATE licences SET datedebut= ?, datefin = ? WHERE id= ?");
           $stmt->bind_param("ssi", $datedebut, $datefin, $id);
     
           foreach ($_POST['datedebut'] as $ID => $datedebut) {
                 $datefin = $_POST['datefin'][$ID];
                 $stmt->execute();
     
                 echo 'debug : ' . $ID . ' - ' . $datedebut . ' - ' $datefin . '<br/>';
           }
    }
    ?>
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2008
    Messages : 150
    Par défaut Gné?
    J'obtiens un magnifique

    PHP Parse error: syntax error, unexpected '{' in /var/www/chette/Licences.php on line 1492
    Qui correspond à l'accolade du "if" ligne 2 de ton code Sabotage...

    Ce que je ne comprends pas, car c'est bien la bonne syntaxe pour un if is set...

    Pourtant dans le code, je n'ai modifié que $id --> $ID

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (isset($_POST['datedebut'], $_POST['datefin']){ 
           $db = mysqli_connect($localhost,$login,$pwd,$dbName) or die('Erreur de connexion '.mysql_error());       
           $stmt = $mysqli->prepare("UPDATE licences SET datedebut= ?, datefin = ? WHERE id= ?");
         $stmt->bind_param("ssi", $datedebut, $datefin, $ID);
     
          foreach ($_POST['datedebut'] as $ID => $datedebut) {
                $datefin = $_POST['datefin'][$ID];
                $stmt->execute();
     
                 echo 'debug : ' . $ID . ' - ' . $datedebut . ' - ' $datefin . '<br/>';
           }
    }

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

Discussions similaires

  1. [MySQL] Problème requête UPDATE (WHERE)
    Par cedric.g dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/06/2012, 16h16
  2. Problème UPDATE et LIKE
    Par Golork dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/08/2005, 16h01
  3. [Update]Problème update Eclipse
    Par tomate dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 05/04/2005, 11h14
  4. Problème UPDATE
    Par Eltaz dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/07/2004, 11h37
  5. Problème clause WHERE
    Par Invité dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/06/2004, 15h07

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