PHP MySQL mise à jour uniquement la mise à jour d'une ligne
J'ai mis en place une requête de mise à jour qui permettra de mettre à jour les valeurs entrées dans les champs de texte sur une boucle while. Cela fonctionne très bien jusqu'à ce que de multiples données en boucle à partir de la base de données. Puis pour une raison quelconque, seul le dernier de données dans la boucle sera mis à jour et le reste va rester la même.
<form method="post" action="update.php">
<?php
$id = $_POST["id"];
$fname = $_POST["fname"];
$lname = $_POST["lname"];
$query= "SELECT * FROM list ORDER BY id ASC" ;
$result= mysql_query($query);
while($row = mysql_fetch_assoc($result) ){
echo"<input type=\"hidden\" name=\"id\" value=" . $row['id'] . " />";
echo"<input type=\"text\" name=\"fname\" value=" . $row['fname'] . " />";
echo"<input type=\"text\" name=\"lname\" value=" . $row['lname'] . " />";
}
?>
<input type="submit" value="Save Changes" />
<?php
$sql = "UPDATE list SET fname = '{$fname}', lname = '{$lname}' WHERE id = {$id}";
$result = mysql_query( $sql );
?>
</form>
Votre mise à jour n'est pas dans une boucle, alors pourquoi devrait-il mettre à jour plus d'une fois?
OriginalL'auteur user1078385 | 2012-03-27
Vous devez vous connecter pour publier un commentaire.
C'est parce que l'ensemble de vos entrées ont le même nom si il y a plus d'un, php ne peut pas faire la différence de l'un à l'autre.
Si il n'y a plus de 1 ligne générée à partir de votre sélectionnez requête mysql, alors vous avez besoin pour donner à chaque id de l'entrée d'un nom différent, chaque fname entrée un nom différent, et chaque lname entrée un nom différent.
OriginalL'auteur maxhud
$_POST
est un tableau. Et$_POST
obtenir ses éléments par le nom des champs de saisie dans le formulaire. Ainsi, vous êtes toujours écraser les entrées. Si vous voulez avoir de multiples mises à jour, vous devez écrire une boucle (voir les commentaires). Et utilisez ce code ci-dessous pour les champs de saisie.Essayer:
Espère que ça aide.
OriginalL'auteur F. Müller
Si
id
est unique, alors laWHERE id=foo
clause de limiter les mises à jour à un seul champ. Mais plus liés à votre PHP: Vous êtes l'établissement$id
,$fname
et$lname
avant la boucle, de sorte queUPDATE
ligne est l'aide de "vieilles valeurs" si la boucle s'exécute plus d'une fois. De même, vous n'avez pas réellement lesUPDATE
de la requête dans la boucle, donc au plus, les variables seront fixées une fois, la boucle sera exécuté quelques temps (peut-être) et puis la requête est exécuté qu'une fois.Le code est exécuté dans l'ordre; vous avez d'être plus précis en mettant le code où vous voulez qu'il fonctionne.
OriginalL'auteur Neil Alexander
Votre mise à jour de la liste de la table à l'extérieur de votre boucle while. Qui contient les valeurs que lorsque le dernier sélectionné (ligne 7).
Que votre écho avec plusieurs champs de saisie vous pouvez déclarer les éléments du tableau.
Et itérer sur chaque un sur $_POST.
OriginalL'auteur Lee Davis
Sonne comme vous voulez afficher le contenu d'une table ,et de permettre à l'utilisateur de le modifier.
Il y a quelques très beaux outils qui le fera pour vous, comme jqGrid.
http://www.trirand.net/demophp.aspx
Cliquez sur le lien à propos de la modification sur le côté gauche de la jqGrid page
Le composant va prendre soin de tout l'affichage et l'édition. Il vous montre même comment mettre en œuvre le PHP sur le back-end.
OriginalL'auteur Nick
Je pense que vous avez mal interpréter les œuvres de la boucle.
En effet, vous êtes sortie de plusieurs lignes de votre table comme des groupes de champs de saisie, mais votre seule mise à jour d'une ligne après l'envoi. Si vous vouliez mettre à jour plusieurs lignes, vous auriez besoin de multiples identifiants (soit un pour chaque ligne que vous souhaitez mettre à jour)
Votre navigateur apparemment choisit de le http-post soumettre le dernier cas de votre pièce d'identité, fname et lname champs de saisie qui sont dans le formulaire html, et ceux-ci sont ceux que votre $_POST champs contiennent lors de la réception de cette requête http post.
Il est généralement une mauvaise idée d'avoir plusieurs entrées avec le même nom dans un formulaire, qui est ce qui se passe ici si plus d'une ligne de la table est sélectionnée.
Vous pourriez envisager:
Ayant une forme (y compris le bouton "soumettre") par ligne. De cette façon, votre navigateur sait par la forme de base de ce qui identifiables champ de saisie de valeurs qu'il devrait se soumettre.
Si vous ne voulez pas un multi-ligne d'en modifier la forme alors, il existe de nombreuses astuces pour y parvenir. Le plus simple serait probablement une convention de nommage comme fname_42 pour la 42e fname champ de saisie, et un champ caché dans le formulaire contenant le nombre de lignes que votre formulaire de montre. Lors du traitement de la soumission de la demande, vous serez en mesure de reconstruire les entrées de noms en comptant jusqu'à le nombre total de lignes.
exemple:
PS: merci de ne pas me blâmer si cet exemple n'est pas entièrement correcte syntaxiquement 😉 je n'ai pas de PHP interprète avec moi en ce moment.
OriginalL'auteur derabbink
Désolé d'avoir les vieux post, mais j'ai eu le même problème et le corriger.
Le problème se produit car les propriétés du formulaire et soumettre les propriétés ne sont pas inclus comme du code php, mais a gardé au format html à l'extérieur de la boucle. Lorsque la soumission est à l'intérieur de l'instruction while, chaque ligne a ses propres soumettre et le changement de l'effet seulement de la ligne. Le code de travail est ci-dessous;
OriginalL'auteur Guns