Maison  >  Questions et réponses  >  le corps du texte

Mettre à jour plusieurs lignes de données à l'aide de la boucle PDO

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粉384366923P粉384366923382 Il y a quelques jours789

répondre à tous(2)je répondrai

  • P粉704066087

    P粉7040660872023-10-25 09:13:24

    Quelques choses :

    1. Définissez PDO pour qu'il lance PDOException en cas d'erreur. Cela facilitera le débogage.
    2. L'intérêt d'une instruction préparée est que vous pouvez l'appeler plusieurs fois avec différentes variables, de cette façon, vous n'avez besoin de la préparer qu'une seule fois, puis de l'appeler plusieurs fois. Vous pouvez également en tirer une belle amélioration des performances.

    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();
    
            }
        }

    répondre
    0
  • P粉994092873

    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]);
        }
    }

    répondre
    0
  • Annulerrépondre