Probleme avec PDO en cascade

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Probleme avec PDO en cascade

par hello » 30 sept. 2007, 16:54

j'ai réussi
j'ai ouvert une autre connection pour gérer ma liste déroulante

mais je ne trouve que c'est de la bidouille
en attendant que je trouve mieux, je vais faire ca

merci

par Cyrano » 30 sept. 2007, 10:30

Si tu penses que je vais écrire la requête à ta place, tu rêves en couleur ;)

C'est pour ça que je t'indique des détails dans mes réponses, il me semble important de te poser la question du pourquoi je précise tel ou tel élément. Tu dois définir les règles de gestions de l'affichage des données. Tu mentionnes une liste déroulante : ok, j'ai rien contre, c'est ton application, mais sur quels critères établis-tu la liste et dans quelle mesure ça peut affecter le reste de l'affichage ?

Ce que j'essaye de faire, c'est de t'indiquer des pistes vers la solution, à toi de jouer. Et n'oublie jamais : si une question est mal formulée, c'est que le problème n'a pas été correctement compris au départ, or tu es le mieux placé pour savoir ce que tu veux obtenir et pourquoi. Donc si ta question est bien formulée, alors c'est que tu as parfaitement identifié la nature de la difficulté, et... ben tu en auras déjà résolu les 3/4 ;)

Supprimer la seconde requête, ça implique que la première (devenant du coup la seule requête) comportera très probablement une jointure : partant de là, tu devrais commencer à voir l'issue.

par hello » 30 sept. 2007, 10:20

bonjour

je suis preneur pour tout passer sur une seule requete
par contre, il ne faut pas perdre de vue que lors de l'affichage de la liste, on doit pouvoir modifier la rubrique sous la forme d'une liste déroulante


voici les tables et quelques données

Code : Tout sélectionner

CREATE TABLE `carnet` ( `id` int(11) unsigned NOT NULL auto_increment, `iduser` int(11) NOT NULL default '0', `carnetclef` varchar(20) NOT NULL, `nom` varchar(20) NOT NULL default '', `prenom` varchar(30) NOT NULL default '', `email` varchar(100) NOT NULL default '', PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; INSERT INTO `carnet` (`id`, `iduser`, `carnetclef`,`nom`, `prenom`, `email`) VALUES (1, 2,'2votizspyj0lqvkhyns9', 'VILLENEUVE', 'Christophe', '[email protected]'), (2, 1, 'azgtenwpa3k1y3o123kl','VOTRE NOM', 'Votre prenom', '[email protected]'); CREATE TABLE `carnet_details` ( `id` int(11) NOT NULL auto_increment, `idcarnet` int(11) NOT NULL default '0', `idrubrique` int(11) NOT NULL default '0', `observation` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; INSERT INTO `carnet_details` (`id`, `idcarnet`, `idrubrique`, `observation`) VALUES (1, 1, 28, 'www.phpfrance.com'), (2, 1, 29, 'www.php.net'), (3, 2, 30, 'www.phpfrance.com'); CREATE TABLE `rubrique` ( `id` int(11) NOT NULL auto_increment, `iduser` int(11) NOT NULL default '0', `nom` varchar(100) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=31 ; INSERT INTO `rubrique` (`id`, `iduser`, `nom`) VALUES (27, 2, 'URL'), (28, 2, 'Site internet'), (29, 2, 'Officiel'), (30, 1, 'URL');

merci par avance

par Cyrano » 30 sept. 2007, 06:58

...ou peut etre faire le tout en une seule requete ???
Pour ma part c'est la première solution vers laquelle je me tournerais. Mais pour faire ça, il faudrait disposer de la structure des tables (obtenu avec un DESCRIBE TABLE nom-de-ta-table) afin d'identifier les liens entre elles avec une explication sur les données recherchées.

Sinon, je t'ai déjà indiqué l'autre solution. Actuellement tu utilises le même objet $cnx pour les trois requêtes : crée plutôt deux objets, $cnx1 pour la requête avant le while() et $cnx2 pour les deux autres.

par Invité » 30 sept. 2007, 01:29

bonjour

le résultat de la 1ere requete, je m'en sers pour afficher la bonne ligne qui est selectionné dans la liste deroulante
if ($row2['id']==$row['idrubrique']) echo " SELECTED ";

Concernant la premiere requete, les autres informations qui sont affichés sont utilisés pour d'autres colonnes, mais je ne les ai pas insérer

Sinon le code n'est pas modifié
en gros une personne peut avoir un carnet 2 et une liste de rubrique a elle, qui sont reperés par 1 car c'est la premiere personne qui a rempli sa rubrique

voila
si tu as une solution pour mon probleme
ou peut etre faire le tout en une seule requete ???

merci par avance

par Cyrano » 29 sept. 2007, 21:38

Ton code est pour le moins curieux, j'y relève à tout le moins deux incohérences majeures :
-1- Le résultat de la première requête n'est jamais utilisé;
-2- Tu exécutes en boucle deux requêtes, la seconde si la première retourne un nombre supérieur à 0, mais à chaque tour du while(), ce sont strictement les mêmes requêtes sans la moindre modification de paramètres. Et j'ajoute que le ORDER BY de le première de ces deux requête n'a pas lieu d'être, il n'y a rien à ordonner, tu ne récupères qu'un seul nombre.

Je soupçonnes que tu as modifié ton code avant de l'afficher ici en remplaçant certaines variables par des valeurs en dur... si c'est ça, mets-nous donc le vrai code (sauf tes login/mot de passe de la connexion bien sur) qu'on y trouve une éventuelle erreur.

Et accessoirement, le message semble indiquer que le buffer de PDO est déjà occupé et qu'il n'est pas possible d'appeler une nouvelle requête tant qu'il n'est pas vide, d'où la suggestion d'utiliser fetchAll pour stocker le résultat de la première requête dans une variable avant de lancer une seconde requête. L'autre solution consisterait à utiliser un objet différent de $cnx à l'intérieur de la boucle while().

Probleme avec PDO en cascade

par hello » 29 sept. 2007, 13:08

bonjour

cela fait plusieurs jours que je cherche et je ne trouve pas le probleme, car je dois faire fonctionner mon probleme pour lundi matin
Je m'explique

Je veux afficher dans toutes les lignes, une liste déroulante qui s'allimente automatiquement avec une table de critere
Je fournis juste la partie qui me pose probleme car quand j'enleve cette liste déroulante, le resultat fonctionne.

voici mon source :
<?php
$serveur = "localhost";
$user    = "root";
$passwd  = "";
$bdd     = "essai";
$port='3306';


$cnx = new PDO('mysql:host='.$serveur.';port='.$port.';dbname='.$bdd, $user, $passwd);
$cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 


$sql="SELECT carnet_details.idcarnet,carnet_details.id as idtmp,carnet_details.idrubrique,carnet_details.observation,carnet.id,carnet.carnetclef 
	FROM carnet,carnet_details  
	WHERE carnet.id=carnet_details.idcarnet AND carnet.id='2' ";
 
	$qid=$cnx->prepare($sql);
	$qid->execute();
 
while ($row=$qid->fetch(PDO::FETCH_ASSOC))  
{ 
	$sql="SELECT COUNT(*) FROM rubrique WHERE iduser='1' ORDER BY nom";
	$rubrique=$cnx->prepare($sql);
	$rubrique->execute();
 
	if ($rubrique->fetchColumn()>0)
	{
	$sql="SELECT id,iduser,nom FROM rubrique WHERE iduser='1' ORDER BY nom";
	$rubrique=$cnx->prepare($sql);
	$rubrique->execute();
		echo "<select name=\"idrubrique[]\">";
		echo ligne_selected(" ","-1",$frm['idrubrique'][$i]);
	
		while( $row2=$rubrique->fetch(PDO::FETCH_ASSOC) )       
		{
			echo "<option value=".$row2['id'];
			if ($row2['id']==$row['idrubrique']) echo " SELECTED ";
			echo ">".$row2['nom']."</option>";
		}
		echo "</select>";  
	
	}
}
?> 


et j'obtiens le résultat suivant :

Code : Tout sélectionner

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.' in L:\www\application\essai.php:98 Stack trace: #0 L:\www\application\essai.php(98): PDOStatement->execute() #1 {main} thrown in L:\www\application\essai.php on line 98
je ne comprends pas le probleme

l'erreur pointe sur le 1er $rubrique->execute();

Merci par avance