J'ai un while dans lequel je demande d'afficher des informations de ma BDD tant qu'il trouve des résultats. Or, il ne m'affiche que le premier élément trouvé. J'avais pensé à remplacer le while par un foreach, mais il faut alors un tableau, ce qui n'est pas ce que recherche. Pourriez-vous m'aider s'il vous plait?
Bien sur. Je voudrais qu'un bouton apparaisse avec des données à chaque fois que la requête trouve un ID
$requete = $p_base->query("select id, nomcourt, nomlong from apprentissage");
while($donnees = $requete->fetch())
{
//On entre dans la partie du détail de l'apprentissage
//On créé un bouton pour le détail de l'apprentissage
echo'<button type="button" onclick="toggle_divapprentissage(this,\'apprentissage\');">'.$donnees['nomcourt'].'/'.$donnees['nomlong'].' ▼</button>'; }
Voici mon fichier connexion à la BDD:
define('DB_SERVER', "localhost"); #on défini le serveur
define('DB_BASE', "ymtc"); #on défini le nom de la base
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$p_base = new PDO('mysql:host=' . DB_SERVER . ';dbname=' . DB_BASE, DB_USER, DB_PASSWORD, $pdo_options); #on créé une connexion avec la base de données
$p_base->exec("Set character set utf8"); #on convertit en utf8
Le soucis du coup, c'est que mon bouton ne marche plus. Il doit permettre d'afficher ou de cacher un <div>. Je vous met l'intégralité du code pour que vous compreniez mieux:
<?php
#on fait la requête d'affichage
$requete = $p_base->query("select id, nomcourt, nomlong from apprentissage");
while($donnees = $requete->fetch())
{
//On entre dans la partie du détail de l'apprentissage
//echo $donnees['nomcourt'].'/'.$donnees['nomlong'];
//On créé un bouton pour le détail de l'apprentissage
echo'<button type="button" onclick="toggle_divapprentissage(this,\'apprentissage\');">'.$donnees['nomcourt'].'/'.$donnees['nomlong'].' ▼</button>';
echo'<div id="apprentissage" style="display:none;">';
#on créé un tableau pour le détail de l'apprentissage
echo '<form method="post"><table>';
#on fait la requête d'affichage
$requete = $p_base->prepare("select apprentissage.nomlong, apprentissage.nomcourt, apprentissage.dateP, apprentissage.datefin, taches.description, taches.datefint, taches.avancement, taches.code, source.url, code.libelle from apprentissage,
taches, source, code where apprentissage.id=source.idapprentissage and apprentissage.id=taches.idapprentissage and apprentissage.id=code.idapprentissage and apprentissage.id=:id");
$requete->execute(array('id'=> $donnees['id']));
if($donnees = $requete->fetch()) {
// Ligne "Nom de l'apprentissage"
// Ligne "ID de l'apprentissage"
// Ligne "Date Post-it de l'apprentissage"
echo '<tr>';
echo '<td><label for="dateP">DateP :</label></td>';
echo '<td><input type="text" name="dateP" id="dateP" value="' . $donnees['dateP'] . '"></td>';
echo "</tr>";
// Ligne "Date de fin de l'apprentissage"
// Ligne "Source de l'apprentissage"
// Ligne "Code de l'apprentissage"
// On créé un menu déroulant pour les mails
echo '<tr align="center">';
echo '<td>Envoyer mail?</td>';
echo '<td><select name="envoyer_mail">';
echo '<option value="mail1">Début de tâche</option>';
echo '<option value="mail2">Dépassement de tâche</option>';
echo '<option value="mail3">Début et dépassement de tâche</option>';
echo '<option value="mail4">Jamais</option>';
echo '</select></td>';
echo '</tr>';
echo '</table>';//On ferme le tableau du détail de l'apprentissage
//On entre dans la partie des thèmes
echo '<button type="button" onclick="toggle_div(this,\'tache\');">Tâches ▼</button>';//On ajoute un bouton pour les thèmes
echo '<div id="tache" style="display:none;">';
echo '<form method="post"><table>'."\n";//On ouvre un autre tableau
// Ligne "Nom de la tâche"
echo '<tr>';
echo '<td><label for="nom">Nom :</label></td>';
echo '<td><input type="text" name="nom" id="nom" value=" '. $donnees['description'] . '"></td>';
echo "</tr>";
// Ligne "ID de la tâche"
// Ligne "Date de fin de la tâche"
// Ligne "Avancement de la tâche"
echo '</table>';//On ferme le tableau des thèmes
echo'</div>';//On quite la partie des thèmes
}
else{//Si la requête ne marche pas ou autres
die("Opération Interdite!") ;
}
$requete->closeCursor();//On ferme la requête du détail de l'apprentissage
?>
Et concernant le PHP, j'ai un cahier des charges à respecter, donc je dois tout mettre en php.
Alors je pense qu'il est logique que ça ne fonctionne pas.
En effet, tu affectes dynamiquement une action au bouton, mais jamais tu dois avoir un script JS quelque part qui définie ces actions. Est ce que chaque cas de figure est codé ?
Mon bouton appelle bien une fonction en JS qui est exécutée. Elle se trouve sur un autre fichier et est bien appelée sur mon fichier php puisque tous les boutons marchent. C'est pour ça que je comprends pas le problème
Voici mon script JS:
function toggle_divapprentissage(bouton, id) { // On déclare la fonction toggle_div qui prend en param le bouton et un id
var div = document.getElementById(id); // On récupère le div ciblé grâce à l'id
if(div.style.display=="none") { // Si le div est masqué...
div.style.display = "block"; // ... on l'affiche...
bouton.innerHTML = "Masquer les détails ▲"; // ... et on change le contenu du bouton.
} else { // S'il est visible...
div.style.display = "none"; // ... on le masque...
bouton.innerHTML = "Détails de l'apprentissage ▼"; // ... et on change le contenu du bouton.
}
}
ton probleme viens de tes boucle imbriquées et de ta variable $donnees et $requete
j'ai suppr ce qui ne m'interesssait pas
<?php
$requete = $p_base->query("select id, nomcourt, nomlong from apprentissage");
while($donnees = $requete->fetch()){
//...
#on fait la requête d'affichage
$requete = $p_base->prepare("select // blabla ta requete et au passsage revoie coment on fait des jointure parce que la c'est vraiment old school xd
);
$requete->execute(array('id'=> $donnees['id']));
if($donnees = $requete->fetch()) {
1ere requete plusieurs résultat
2eme requete préparé un seul résultat
quand tu repasse dans ta boucle $requete->fetch() n'a plus de ligne de résultat a lire vu qu'il essaie de lire le $requete de ta requete préparé. Donc tu n'a qu'un ligne qui s'affiche CQFD
Modifie le nom de $donnees et $requete aprés ton prepare et cela devrait marcher
Et au passage essaie de mettre des dont qui ont un sens par exemple
Le 1er $requete =>sel_all_appr (selection de tout les appretissage)
Le 1er $donnees =>arr_one_appr(tableau avec une ligne de sel_all_appr)
ca t'évite de te planté avec le contenu de tes variable parce que si tu met des $requete, $donnees partout on si perd vite
"Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité" A.E.
Pourrais-vous me montrer comment vous le modifiez sur mon code?
J'ai testé morceau par morceau pour chercher où commence l'erreur.
Elle se trouve dans la partie suivante, mais je la trouve pas.
sauriez-vous où elle est?
<?php
//On entre dans le niveau B
echo '<button type="button" onclick="toggle_divb(this,\'niveaub\');">Je veux gérer mes apprentissages ▼</button>';
echo '<div id="niveaub" style="display:none;">';
//echo '<h3>Liste des apprentissages</h3>';
#on fait la requête d'affichage
$sel_all_appr = $p_base->query("select distinct id, nomcourt, nomlong from apprentissage");
while($arr_one_appr = $sel_all_appr->fetch())
{
//On entre dans la partie du détail de l'apprentissage
//echo $donnees['nomcourt'].'/'.$donnees['nomlong'];
//On créé un bouton pour le détail de l'apprentissage
echo'<button type="button" onclick="toggle_divapprentissage(this,\'apprentissage\');">'.$arr_one_appr['nomcourt'].'/'.$arr_one_appr['nomlong'].' ▼</button>';
echo'<div id="apprentissage" style="display:none;">';
#on créé un tableau pour le détail de l'apprentissage
echo '<form method="post"><table>';
#on fait la requête d'affichage
$requete = $p_base->prepare("select apprentissage.nomlong, apprentissage.nomcourt, apprentissage.dateP, apprentissage.datefin, taches.description, taches.datefint, taches.avancement, taches.code, source.url, code.libelle from apprentissage,
taches, source, code where apprentissage.id=source.idapprentissage and apprentissage.id=taches.idapprentissage and apprentissage.id=code.idapprentissage and apprentissage.id=:id");
$requete->execute(array('id'=> $arr_one_appr['id']));
if($donnees = $requete->fetch()) {
// Ligne "Nom de l'apprentissage"
echo '<tr>';
echo '<td><label for="nomlong">Nom :</label></td>';
echo '<td><input type="text" name="nomlong" id="nom" value="' . $donnees['nomlong'] . '"></td>';
echo "</tr>";
}
else{//Si la requête ne marche pas ou autres
die("Opération Interdite!") ;
}
$requete->closeCursor();//On ferme la requête du détail de l'apprentissage
echo'</div>';//On quitte la partie du détail de l'apprentissage
}
$sel_all_appr->closeCursor();//On ferme la requête des apprentissages
echo'</div>'.'<br/>';//On quitte le niveau B
//On passe au niveau C
echo '<button type="button" onclick="toggle_divc(this,\'niveauc\');">Je veux gérer ma connaissance de moi ▼</button>';
echo '<div id="niveauc" style="display:none;">';
echo 'Hello';
echo '</div>'.'<br/>';
//On passe au niveau D
echo '<button type="button" onclick="toggle_divd(this,\'niveaud\');">Je veux gérer mes objectifs ▼</button>';
echo '<div id="niveaud" style="display:none;">';
echo 'World';
echo '</div>'.'<br/>';
?>
J'ai continué mes recherches hier soir, mais ai pas réussi à résoudre le soucis.
Lorsque je n'ai que ceci, tout marche parfaitement:
<?php
//On entre dans le niveau B
echo '<button type="button" onclick="toggle_divb(this,\'niveaub\');">Je veux gérer mes apprentissages ▼</button>';
echo '<div id="niveaub" style="display:none;">';
//echo '<h3>Liste des apprentissages</h3>';
#on fait la requête d'affichage
$sel_all_appr = $p_base->query("select distinct id, nomcourt, nomlong from apprentissage");
while($arr_one_appr = $sel_all_appr->fetch())
{
//On entre dans la partie du détail de l'apprentissage
//echo $donnees['nomcourt'].'/'.$donnees['nomlong'];
//On créé un bouton pour le détail de l'apprentissage
echo'<button type="button" onclick="toggle_divapprentissage(this,\'apprentissage\');">'.$arr_one_appr['nomcourt'].'/'.$arr_one_appr['nomlong'].' ▼</button>';
echo'<div id="apprentissage" style="display:none;">';
CODE PROBLEMATIQUE ICI
echo'</div>';//On quitte la partie du détail de l'apprentissage
}
$sel_all_appr->closeCursor();//On ferme la requête des apprentissages
echo'</div>'.'<br/>';//On quitte le niveau B
//On passe au niveau C
echo '<button type="button" onclick="toggle_divc(this,\'niveauc\');">Je veux gérer ma connaissance de moi ▼</button>';
echo '<div id="niveauc" style="display:none;">';
echo 'Hello';
echo '</div>'.'<br/>';
//On passe au niveau D
echo '<button type="button" onclick="toggle_divd(this,\'niveaud\');">Je veux gérer mes objectifs ▼</button>';
echo '<div id="niveaud" style="display:none;">';
echo 'World';
echo '</div>'.'<br/>';
?>
En revanche, dès que j'ajoute le code problématique, tout est cassé:
#on créé un tableau pour le détail de l'apprentissage
echo '<form method="post"><table>';
#on fait la requête d'affichage
$requete = $p_base->prepare("select apprentissage.nomlong, apprentissage.nomcourt, apprentissage.dateP, apprentissage.datefin, taches.description, taches.datefint, taches.avancement, taches.code, source.url, code.libelle from apprentissage, taches, source, code where apprentissage.id=source.idapprentissage and apprentissage.id=taches.idapprentissage and apprentissage.id=code.idapprentissage and apprentissage.id=:id");
$requete->execute(array('id'=> $arr_one_appr['id']));
if($donnees = $requete->fetch()) {
// Ligne "Nom de l'apprentissage"
echo '<tr>';
echo '<td><label for="nomlong">Nom :</label></td>';
echo '<td><input type="text" name="nomlong" id="nom" value="' . $donnees['nomlong'] . '"></td>';
echo "</tr>";
} echo '</table>';else{//Si la requête ne marche pas ou autres
die("Opération Interdite!") ;
}
$requete->closeCursor();//On ferme la requête du détail de l'apprentissage
Quelqu'un voit ce qui cloche?
J'ai continué à chercher, et j'ai un doute au niveau de cette ligne:
echo '<form method="post"><table>';
Est-ce qu'il faut mettre </table> et </form>, ou juste </table>?
- Edité par Anonyme 25 janvier 2017 à 11:46:15
Problème avec un while et SQL
× 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.
Pour que ce soit plus simple ouvre le php quand tu en as besoin et evites les echo de balise entiere
N'oubliez pas d'activer les erreurs PDO.