Non, il faut vérifier à chaque tour de boucle si tu es sur un autre match que lors de l'itération précédente. Prends le code que j'ai fourni comme exemple et lis les commentaires.
Tout ce code est dans un formulaire qui présente à la fin un unique input Submit nommé "envoiprono". J'aimerais envoyer grâce à cet input les pronos des utilisateurs (2 inputs par matchs générés par la fonction While).
Voici ce que j'ai tenté de faire pour le moment (test sur le pronostic de l'équipe à domicile):
if(isset($_POST['envoipronos']))
{
$matchselect=$renc['id'];
$envoidom = $_POST['scoredomicile"'.$matchselect.'"'];
$validomicile = $bdd->prepare('UPDATE membres_matchs, matchs SET homeprono = ? WHERE id_membres = ? AND id_matchs= "'.$matchselect.'"');
$validomicile->execute(array($envoidom, $_SESSION['id']));
}
Je récupère l'id du match dans une variable $matchselect et je tente de récupérer le nom de l'input généré automatiquement (ce qui ne fonctionne pas)
Comment ferais-tu pour enregistrer deux pronstics de deux utilisateurs différents en même temps ? C'est difficilement possible, à mon avis.
On est d'accord qu'un pronostic concerne un match, donc le résultat de chacune des deux équipes, et est fait par un utilisateur. Je ne suis pas certain de comprendre l'histoire des deux utilisateurs, là…
- matchs (id (AI), date_match, home, home_score, away, away_score)
- membres_matchs (numprono(AI), id_membres, id_matchs, homeprono, visiteprono). C'est dans cette dernière que doit être enregistrer les données entrées dans les inputs.
L'affichage étant obtenu, j'imagine que pour l'enregistrement il suffit de se focaliser sur les tables membres (pour joindre l'id de l'utilisateur de l'id_membres de la table membres_matchs) et matchs (pour joindre l'id du match et l'id_matchs de la table membres_matchs).
L'ID du membre est probablement récupérable depuis la session, il te faut juste que le formulaire capte l'ID du match et les deux valeurs. Pas besoin de faire des mises à jour, tu devrais pouvoir faire le tout en une insertion.
yes c'est vrai, le problème est que les inputs sont générés automatiquement, leur nom sont donc de ce style : scoredomicile1 (le chiffre correspondant à l'id du match à venir)
Et si on considérait la structure de ce que tu souhaites enregistrer pour créer les name de tes champs ?
Premièrement, tu vas enregistrer des membres_matchs, ce qui fait que tu sais les matchs pour lesquels il est possible de faire des pronostics. Après, par match, tu as donc deux saisies à collecter. Du coup, je te propose de faire ainsi :
Au traitement, tu bouclerais sur $_POST['membres_matchs'], vérifierais qu'il y a des valeurs pour les deux équipes, et emballez, c'est pesé.
<?php
foreach ($_POST['membres_matchs'] as $idMatch => $pronostics) {
if (empty($pronostics['homeprono']) || empty($pronostics['visiteprono']) {
// A toi de voir quoi faire dans ce cas
} else {
// Et ici, INSERT INTO membres_matchs (id_membre, id_match, homeprono, visiteprono) VALUES (…)
}
}
J'imagine que tu as le traitement du formulaire dans le même fichier de script que le formulaire en lui-même ? Du coup il faut bien vérifier si tu as soumis ou non le formulaire avant de faire exécuter le code.
Ensuite, pourquoi est-ce que tu fais une mise à jour de la base de données plutôt qu'une insertion ? Tu enregistres des pronostics vides par défaut ? Si c'est le cas, je ne pense pas que ce soit une bonne idée : tu n'as aucune information par rapport au fait que c'est volontairement vide (le membre n'a pas voulu faire de pronostic) ou par défaut (le membre a loupé qu'il pouvait faire ce pronostic).
Petit détail : par convention, on n'utilise pas les parenthèses autour de ce qu'on affiche avec echo.
Rends-toi bien compte qu'une mise à jour ne peut se faire que sur quelque chose d'existant, est-ce que tu as bien quelque chose d'existant ?
Et en l'état, tu vas écraser l'entier des pronostics existants par le dernier que tu enregistres, il faut que tu mettes une condition pour dire pour quel match et quel utilisateur tu mets à jour.
Note que tu peux sortir la préparation de la requête (ligne 8) de la boucle, c'est entre autres pensé pour.
Je suis désolé mais ça ne fonctionne toujours pas, j'ai pourtant bien lu la fiche PHP sur la fonction FOREACH. J'ai semble-t-il omis une nouvelle fois quelque chose. Voici mon code:
if(isset($_POST['envoipronos']))
{
foreach ($_POST['membres_matchs'] as $idMatch => $pronostics)
{
if (empty($pronostics['homeprono'])||empty($pronostics['visiteprono'])) {
}
else {
$idprono=$_SESSION['id'];
$validomicile = $bdd->prepare('UPDATE membres_matchs (homeprono, visiteprono) VALUES (?,?) WHERE id_membres=? AND id_matchs=?');
$validomicile->execute($pronostics['homeprono'],$pronostics['visiteprono'], $idprono, $renc['id']);
}
}
}
Je repose la question : est-ce que tu as un pronostic vide pour ce membre et ce match avant que ce script ne fasse la mise à jour ?
Et je répète : tu peux sortir la ligne 9 de la boucle.
Je ne comprends absolument pas pourquoi tu créés une variable $idprono ligne 8 alors que là où tu l'utilises (ligne 10 entre autres, nous n'avons pas l'entier du code), tu peux utiliser directement $_SESSION['id'].
Là, ça me paraît normal, il n'y a que la création de la requête (d'ailleurs, pourquoi avoir passé à une version non-préparée ?), donc il ne peut rien se passer…
Il n'y avait que la ligne 9 à sortir de la boucle foreach, le reste du code était syntaxiquement valide au niveau PHP. Tu exécutes la même requête à chaque tour de boucle, pas besoin de la préparer à chaque fois.
Tu peux nous montrer ton code en entier ?
Va aussi regarder dans la FAQ PHP pour demander à PHP ET à PDO de te parler des erreurs qu'ils rencontrent.
Lignes 48, 50 et 63, tu utilises une syntaxe "courte" <?, vérifie qu'elle est bien utilisable sur ton serveur. Je te conseillerais cependant de n'utiliser que la syntaxe longue <?php ou la "contraction" de <?php echo qui est <?=.
Et actuellement tu ne prépares plus la requête, tu as une simple chaîne de caractères dans $validomicile. Soit ton serveur n'est effectivement pas paramétré pour utiliser <?, soit tu n'as pas activé l'affichage des erreurs comme je te l'avais demandé — et peut-être même les deux, en fait.
Entre les lignes 73 et 74, je pense qu'il devrait y avoir quelque chose. Tu arrives à comprendre pour quoi ce test est là ? Si oui, tu devrais pouvoir imaginer quoi faire quand il ne réussit pas.
Je te laisse te renseigner sur l'utilisation de execute(), qui ne prend effectivement pas plus d'un seul paramètre. Si on se demande comment mettre plusieurs valeurs dans une variable, la réponse se trouve rapidement.
Maintenant, tu boucles sur les pronostics pour les membres_matchs. Tu es certain que tu dois concaténer l'ID dans la requête, et non pas le changer à chaque itération ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.