Bonjour à tous,

Je bloque depuis hier sur la récupération de données mysql en php.

Une checkbox me renvoie un ou plusieurs identifiant(s) sur une autre page.
Ces identifiants doivent me permettre d'intégrer un nom de tarif, un tarif, un nom d'évènement et un visuel d'évènement.
Ces éléments se trouvent sur trois tables d'une bdd.

Je récupère bien les identifiants suite au(x) clic(s) dans checkbox. Mais je ne parviens pas à afficher toutes les données liées à ces identifiants (seule une ligne s'affiche).

Voici le code de traitement :
$panier = new panier($db);
	$ids = array_keys($_SESSION['panier']);
		if(!empty($_POST)){
			foreach($_POST['choix'] as $valeur_choix){
				echo $valeur_choix.'</br>';
				$t_id = $db->quote($valeur_choix);
				$select = $db->query("SELECT * FROM tarifs WHERE tar_id = $t_id");
				$tarifs = $select->fetchAll();
				var_dump($tarifs);
			}

			}


Et le code d'affichage :
<?php foreach ($tarifs as $key=>$tarif): ?>
		        		<?= $tarif['tar_name']; ?>
		        		<?= number_format($tarif['tarif'],2, ',', ' '); ?> €
		        	<?php endforeach; ?>


Par souci pour vous, je n'ai mis en avant qu'un seul type de données à retourner.

Je vous remercie par avance pour votre aide.

Cordialement,

Cynthia
Salut,

quand tu fais ta requêtes, directement sur ta table (genre PHPMyAdmin)
SELECT * FROM tarifs WHERE tar_id = $t_id
en remplaçant ton t_id;
SI cela te retourne une seul ligne (car tar_id est peut être un champ unique)
alors ton fetchall va te retourner un seul résultat, c'est normal.

si on retrouve plusieurs tar_id pour un id là c'est différent.

à essayé
foreach ($tarifs as $tarif)
{
 var_dump($tarif->tar_name);
} 

Modifié par JENCAL (25 Nov 2015 - 11:57)
Bonjour Jencal,

Une nouvelle fois, tu te poses sur mon problème, je t'en remercie chaleureusement.

J'ai testé le foreach que tu me proposes et il retourne null

Je ne suis pas sûre d'avoir été claire.

L'utilisateur clique sur une ou plusieurs checkbox.
Je récupère le bon nombre d'identifiants-checkbox (et les bons) sur une nouvelle page.

Ces identifiants sont les premiers éléments de récupération de données qui sont sur trois tables. Mais je ne parviens pas à afficher la totalité des éléments cochés.

J'espère que je suis claire... pas sûre ! Smiley confus

Je pense qu'il faut je simplifie quelquechose dans ma démarche ou que je dé-tricote ces deux fameux identifiants mais je ne sais pas comment.

Je vous remercie par avance pour votre aide !

Cordialement,

Cynthia
Bonjour à tous,

Comme je n'avance pas, je me permets de vous solliciter à nouveau.

Un formulaire contenant des checkbox me renvoie ceci :
Array
(
[id_soiree] => 5
Smiley choix => Array
(
[0] => 4
[1] => 5
)

Smiley go => Aller au panier
)

Je n'arrive pas à sélectionner dans ma bdd les deux lignes du Smiley choix .

Mes tentatives de boucle ne me renvoie qu'une ligne.

Je ne sais pas comment faire pour avoir l'ensemble de mes données...

Je vous remercie par avance pour votre aide.

Cordialement,

Cynthia
salut,
c'est une erreur d'inattention... Tu es entrain d'écraser la valeur de ta variable $tarifs à chaque itération donc le résultat final sera le dernier résultat de ta boucle.
Tu devras soit passer le type de ta variable $tarifs à un array, ce qui te permettra de faire

$tarifs[] = $select->fetchAll();

Soit faire une seule requête pour tout récupérer d'un coup, sans passer par un foreach


		if(!empty($_POST)){

			$select = $db->prepare("SELECT * FROM tarifs WHERE tar_id IN (".implode(",", array_pad(array(), count($_POST['choix']), "?")).")");
			$select->execute($_POST['choix']);
			$tarifs = $select->fetchAll(2);

		}
Bonjour Zelalsan,

Je te remercie vivement ! Je pataugeais vraiment. Ça fonctionne !

Est-ce que je te comprends bien si je dis que je prenais le problème à l'envers ? Tu commences par sélectionner dans la base le résultat des checkbox, ce résultat est "implodé" et bouclé. Tu exécutes la requête et tu envoies le tableau.

J'ai encore un peu de mal à voir la différence avec ma méthode. Peux-tu me l'expliquer ? Et surtout le fetchall(2) que je n'identifie pas...

Je te remercie par avance.

Cordialement,

Cynthia
Modifié par Cynthia1301 (27 Nov 2015 - 09:24)
Salut,
dans ton code dans la boucle tu exécutes une requête pour chaque identifiant (je suppose que c'est la clé primaire, donc unique et cela retourne une seule ligne par identifiant)
A chaque tour de boucle $tarifs est remplacé par la nouvelle valeur et donc en sortie de boucle il ne vaut plus que le résultat de la dernière requête.
$select = $db->query("SELECT * FROM tarifs WHERE tar_id = $t_id"); //retourne une seule ligne
$tarifs = $select->fetchAll(); //$tarifs écraser a chaque tour de boucle


Au lieu de faire plusieurs requêtes en boucle, il te propose donc de faire une seule requête en utilisant IN au lieu de l'égalité, ce qui va te permettre de retourner plusieurs lignes d'un seul coup (tjrs en supposant que c'est la clé primaire..)
Si on reprend ton exemple avec 4 et 5, cela donne une requête qui sera :
SELECT * FROM tarifs WHERE tar_id IN (4,5); //retourne la ligne avec l'identifiant 4 et celle avec l'identifiant 5 d'un seul coup

En très simplifié, le "implode(.." qu'il fourni permet d'obtenir le 4, la virgule, puis le 5 dans ce cas la.
(En plus précis : implode permet de séparer chaque élément d'un tableau (le "," signifie que l'on met une virgule entre chaque élément) , array_pad permet de copier le tableau $_POST fourni par $select->execute($_POST['choix']); a la ligne d’après)
Modifié par mathieu1004 (27 Nov 2015 - 15:03)
Bonjour,
Je viens mêler mon grain de sel car il parait utile de rappeler que la sagesse veut que nous séparions nos traitements même si l'écriture d'un code peut être plus ramassé !
tu traites des valeurs de Session, des valeurs de POST et des requêtes Mysql (ou PDO peut importe)
Rien de pire pour se planter !
Utilises des codes de type

<?php
session_start();
$UnElement = (isset($_SESSION['UnElement'])) ? $_SESSION['UnElement'] : 'xxxxx';
/* ------------ ETC... ----------- */
?>

Tu as donc toutes les valeurs en cours de traitement
En second tu regardes si des valeurs son changées par un POST GET etc...
Par exemple récup&ération de checkbox

<html><body><b>
<form method='POST' action='form_multi_check.php'>
<input type="checkbox" name="LaTbl[]" value="PHP"> PHP<br>
<input type="checkbox" name="LaTbl[]" value="Language C"> Langage C<br>
<input type="checkbox" name="LaTbl[]" value="VB"> VB<br>
<input type="checkbox" name="LaTbl[]" value="Assembleur"> Assembleur<br>
<input type="checkbox" name="LaTbl[]" value="HTML"> HTML<br>
<input type="submit" value="Soumettre">
</form>
<?php
if (isset($_POST["LaTbl"]))
 {
  echo "vous avez coche<br />";
   foreach ($_POST['LaTbl'] as &$value) 
      {
        echo ("".trim($value)."<br />");
        $value = $value * 2;
      }
 }
 else { echo "pas encore de donnees<br />";}
?>
</b></body></html>


Tu as alors mis dans un array par exemple la liste de tes requêtes a réaliser , il te suffit de faire des requêtes simples a travers un boucle ....

<?php
for $x=0;$x<nbr;$x++) 
  {
    $result = $bdd->prepare("SELECT * FROM matable  WHERE  UserNom=:LeUsr ");
    $result->execute(array(':LeUsr' =>  $monaray[$x]));
    $row = $result->fetch();
     if ($row)
          {
            $UserNom=$row['UserNom'];
             $UserAvat=$row['UserAvat'];
           }
 }


Bon ce ne sont que des matériaux, excuses, mais pioche dedans et SÉPARE les genres de ces trois grandes catégories.
Merci à tous pour vos conseils avisés et précieux !

Je remets tout ça à plat et je re-code !

Merci encore à tous !!!

Cordialement,

Cynthia