Bonjour,

Je souhaite mattre a jour plusieurs ligne avec l'id d'une table de ma bdd sur un paramtre de champ de chaque ligne
je sais pas si c'est claire mais voici ce que j'ai testé:
Je reçois bien toutes les info dans ma page de traitement php, la mise a jour ne se fait pas et j'ai pas de message d'erreur!

array (size=3)
'matchsid' => string '71' (length=2) le paramtre a modifié
'buttonsave' => string 'matchsid' (length=8) le bouton
'id' =>
array (size=2) Les id a modifier
0 => string '660' (length=3)
1 => string '656' (length=3)

Test 1

if(isset($_POST['buttonsave']) AND !empty($_POST['buttonsave'])) {
    if(isset($_POST['id']) AND isset($_POST['matchsid'])) {
        $matchidstage = $_POST['matchsid'];

         $index_countsatage = 0;
        $post_id_liststage = array();
        foreach($_POST['id'] as $post_idsstage) {
            $post_id_liststage[':post_'.$index_countsatage] = (int) $post_idsstage;
            $index_countsatage++;
        }
        $stagesid = $bdd->prepare('UPDATE stages SET matchsid = ? where id IN ('.implode(',', array_keys($post_id_liststage)).')');
        $stagesid->execute($matchidstage);

            $_SESSION['message'] = "Les stages séléctionnées ont bien été modifiés";
            header("Location:stages.php?id={$_SESSION['id']} ");

    }else{
        $_SESSION['messagenok'] = "Vous n'avez pas séléctionné de stage";
        header("Location:stages.php?id={$_SESSION['id']} ");
    }
}
?>

Test 2

if(isset($_POST['buttonsave']) AND !empty($_POST['buttonsave'])) {
    if(isset($_POST['id']) AND isset($_POST['matchsid'])) {
        $matchidstage = $_POST['matchsid'];
        foreach ($_POST['id'] as $id) {
            $editStages = $bdd->prepare('UPDATE stages SET matchsid= ? WHERE id = :id');
            $editStages->bindValue('id', $id);
            $editStages->execute($matchidstage);
    }

            $_SESSION['message'] = "Les stages séléctionnées ont bien été modifiés";
            header("Location:stages.php?id={$_SESSION['id']} ");

    }else{
        $_SESSION['messagenok'] = "Vous n'avez pas séléctionné de stage";
        header("Location:stages.php?id={$_SESSION['id']} ");
    }
}
?>

Merci a tous.

6 réponses


Lartak
Réponse acceptée

La méthode prepare, ne doit pas se situer dans une boucle, seulement les méthode de bind ou la méthode execute peuvent s'y situer.
Autre chose, tu ne peux utiliser qu'une seule fois la méthode execute pour la requête SQL, tu ne peux donc pas utiliser deux fois ou plus la méthode execute dans une boucle.
N'oublies pas que le nombre d'arguments que ce soit via les méthodes bind ou la méthode execute, doit correspondre au nombre de marqueurs présents dans la méthode prepare.
Donc si par exemple, que ce soit via les marqueurs anonymes ou les marqueurs nommés, si tu en a un seul, dans la méthode execute tu ne peux y passer qu'un seul argument.
Comme je l'ai déjà dit, dans la méthode execute, c'est sous forme de tableau que tu dois passer l'/les argument(s) et si tu as une erreur, il te faut prendre en compte l'erreur qui t'ai retournée, car ça veut dire que tu fais une erreur dans l'utilisation de ta requête préparée.
Si je te dit que c'est sous forme de tableau, je ne l'invente pas:

input_parameters
Un tableau de valeurs avec autant d'éléments qu'il y a de paramètres à associer dans la requête SQL qui sera exécutée. Toutes les valeurs sont traitées comme des constantes PDO::PARAM_STR.

Les valeurs multiples ne peuvent pas être liées à un seul paramètre; par exemple, il n'est pas autorisé de lier deux valeurs à un seul paramètre nommé dans une clause IN().

La liaison de plus de valeurs que spécifié n'est pas possible ; s'il y a plus de clés dans input_parameters que dans le code SQL utilisé pour PDO::prepare(), alors la requête préparée échouera et une erreur sera levée.

Bonsoir.
Pour commencer, la première condition est trop répétitive, je te conseille de vérifier ce que fais la fonction empty.
Ensuite, la méthode execute prend en argument un tableau d'argument(s) et non une ou des valeurs en argument(s).
Pour terminer, réfléchis un peu plus à ce que tu fais exactement par rapport à ce que tu veux faire, car dans le code tu te contredis totalement.

Nesyou75
Auteur

Bonjour Lartak,

Oui effectivement la premiere condition le not empty vérifi si non vide mais sur le boutton il n'est pas utile.
Pour la méthode execute lorsque je met un array j'ai des erreurs et c'est la ou j'ai un probleme de sytaxe, de logique ou de cerveau lol.
J'avoue que lorsque j'ai des tableaux j'ai un peu de mal.

if(isset($_POST['buttonsave'])) {
    if(isset($_POST['id']) AND isset($_POST['matchsid'])) {
        $matchidstage = $_POST['matchsid'];

     $index_countsatage = 0;
    $post_id_liststage = array();
    foreach($_POST['id'] as $post_idsstage) {
        $post_id_liststage[':post_'.$index_countsatage] = (int) $post_idsstage;
        $index_countsatage++;
    }       

    $stagesid = $bdd->prepare('UPDATE stages SET matchsid = ? where id IN ('.implode(',', array_keys($post_id_liststage)).')');
    $stagesid->execute(array(
        $matchidstage, 
        $post_id_liststage
    ));

pour execute j'ai testé plein de chose:

     $stagesid->execute(array(
        $matchidstage = 'matchsid', 
        $post_id_liststage = 'id'
    ));
    ou
     $stagesid->execute(array(
        'matchsid' => $matchidstage, 
        'id' => $post_id_liststage
    ));

Merci Lartak.

Nesyou75
Auteur

Salut lolo3129,

Je ne suis pas sur davoir bien compris ta solution:

if(isset($_POST['buttonsave'])) {
    if(isset($_POST['id']) AND isset($_POST['matchsid'])) {
        $matchidstage = $_POST['matchsid'];
        $index_countsatage = 0;
        $post_id_liststage = array();
        foreach($_POST['id'] as $post_idsstage) {
            $post_id_liststage[':post_'.$index_countsatage] = (int) $post_idsstage;
            $index_countsatage++;
        } 
        $stagesid = $bdd->prepare('UPDATE stages SET matchsid = ? where id IN ('.implode(',', array_keys($post_id_liststage)).')');
        foreach ($post_id_liststage as $key) {
            $stagesid->execute(array(
                $matchidstage
            $stagesid->execute(array(
                $key
                ));
            }

OU

 if(isset($_POST['buttonsave'])) {
    if(isset($_POST['id']) AND isset($_POST['matchsid'])) {
        $matchidstage = $_POST['matchsid'];
         $index_countsatage = 0;
        $post_id_liststage = array();
        foreach($_POST['id'] as $post_idsstage) {
            $post_id_liststage[':post_'.$index_countsatage] = (int) $post_idsstage;
            $index_countsatage++;
        }       
        $stagesid = $bdd->prepare('UPDATE stages SET matchsid = ? where id IN ('.implode(',', array_keys($post_id_liststage)).')');
        foreach ($array as $key => $post_id_liststage) {
        $stagesid->execute(array(
             $matchidstage
        ));
    }
Nesyou75
Auteur

J'ai testé autre chose mais ça ne marche as non plus :(

if(isset($_POST['buttonsave'])) {
    if(isset($_POST['id']) AND isset($_POST['matchsid'])) {     
foreach ($_POST['id'] as $id) {
            $stagesid = $bdd->prepare('UPDATE stages SET matchsid = :matchsid WHERE id = :id');     
            $stagesid->bindValue('id', $id);
     }
     foreach ($_POST['matchsid'] as $matchidstage) {
        $stagesid->bindParam('matchsid', $matchidstage);
        $stagesid->execute(array());
      }
            $_SESSION['message'] = "Les stages séléctionnées ont bien été modifiés";
            header("Location:stages.php?id={$_SESSION['id']} ");
    }else{
        $_SESSION['messagenok'] = "Vous n'avez pas séléctionné de stage";
        header("Location:stages.php?id={$_SESSION['id']} ");
    }
}
?>      
Nesyou75
Auteur

Hello,
Bon et bien j'ai tester quelque chose que j'avais deja testé au dubut et qui n'avait pas fonctionné et qui maintenant fonctionne.
Javais du faire une erreur quelque part, berf ça fonctionne maintenant, je sias pas si c'est meilleur façon de faire mais cest cool!
Merci a tous pour votre aide!

 if(isset($_POST['buttonsave'])) {
    if(isset($_POST['id']) AND isset($_POST['matchsid'])) { 
        $matchidstage = $_POST['matchsid'];
        $stagesid = $bdd->prepare('UPDATE stages SET matchsid = :matchsid WHERE id = :id');
        foreach ($_POST['id'] as $id) 
        {

            $stagesid->bindParam('matchsid', $matchidstage);
            $stagesid->bindValue('id', $id);            
            $stagesid->execute();
        }

        $_SESSION['message'] = "Les stages séléctionnées ont bien été modifiés";
        header("Location:stages.php?id={$_SESSION['id']} ");

    }else{
        $_SESSION['messagenok'] = "Vous n'avez pas séléctionné de stage";
        header("Location:stages.php?id={$_SESSION['id']} ");
    }
}
?>