Maison > Questions et réponses > le corps du texte
J'ai un formulaire qui récupère plusieurs lignes de données, chaque élément dispose d'une zone de texte permettant aux utilisateurs de commenter un élément spécifique. Le nombre d'éléments renvoyés est variable et ils n'ont pas besoin de laisser de commentaires dans aucune ou dans toutes les cases.
<textarea name="comment[]" cols="25" rows="2"><?php echo $f2; ?></textarea> <input name="tableid[]" type="hidden" value="<?php echo $f1; ?>">L'instruction
echo remplit la zone de texte avec tout ce qui est actuellement stocké dans la base de données, puisque l'utilisateur peut modifier ce que les autres ont saisi.
Lorsqu'il sera transmis à la page de traitement du formulaire, il renverra ceci..
Submit: Submit comment: Test Comment 1,Test Comment 2 tableid: 590,591
Il semble donc que le tableau passe correctement. J'utilise ce code pour mettre à jour la base de données
$conn = new PDO("mysql:host=xxxx;dbname=xxxxx",$username,$password); $i = 0; if(isset($_POST['submit'])) { foreach($_POST['comment'] as $comment) { $comment = $_POST['comment'][$i]; $id = $_POST['tableid'][$i]; $stmt = $conn->prepare("UPDATE reservations SET comment=:comment WHERE tableid=:id"); $stmt->bindValue(':comment', $comment, PDO::PARAM_INT); $stmt->bindValue(':id', $id, PDO::PARAM_INT); $stmt->execute(); $i++; } }
Cependant, cela ne semble pas du tout être mis à jour, où me suis-je trompé ?
Merci beaucoup
P粉7040660872023-10-25 09:13:24
Quelques choses :
PDOException
en cas d'erreur. Cela facilitera le débogage. Code :
$conn = new PDO("mysql:host=xxxx;dbname=xxxxx", $username, $password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //Set PDO to fire PDOExceptions on errors. PDO::ATTR_EMULATE_PREPARES => false //Disable emulated prepares. Solves some minor edge cases. ]); //No need for incrementer. The index of the comment should be enough. if (isset($_POST['submit'])) { //Note the prepare on the outside. $stmt = $conn->prepare("UPDATE `reservations` SET `comment` = :comment WHERE `tableid` = :id"); //As well as the binding. By using bindParam, and supplying a variable, we're passing it by reference. //So whenever it changes, we don't need to bind again. $stmt->bindParam(":comment", $comment, PDO::PARAM_STR); $stmt->bindParam(":id", $id, PDO::PARAM_INT); foreach ($_POST['comment'] as $index => $comment) { //All that's left is to set the ID, see how we're reusing the $index of the comment input? $id = $_POST['tableid'][$index]; $stmt->execute(); } }
P粉9940928732023-10-25 00:17:28
<textarea name="comment[<?=$f1?>]" cols="25" rows="2"><?=$f2?></textarea> <?php $dsn = "mysql:host=xxxx;dbname=xxxxx"; $opt = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ); $conn = new PDO($dsn, $username, $password, $opt); $sql = "UPDATE reservations SET comment=? WHERE tableid= ?"; $stmt = $conn->prepare($sql); foreach ($_POST["comment"] as $id => $comment) { if ($comment) { $stmt->execute([$comment, $id]); } }