Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
bonjour, je souhaite récupérer un résultat qui est null mais je sais pas comment le récupérer
voici mon modèle
[lang=php] class Application_Model_DbTable_Facture extends Zend_Db_Table_Abstract { protected $_name = 'factures'; public function maxfacture() { $db = Zend_Db_Table::getDefaultAdapter(); $sql="SELECT max(id_facture) FROM factures"; $id_max=$db->query($sql); Zend_Debug::dump($id_max); } }
pour le moment je dans ma table facture je n'ai pas d'id factures enregistrer
ici comment je fait pour afficher NULL ?
je vous remercie d'avance pour votre réponse
Dernière modification par keokaz (14-09-2011 23:33:33)
Hors ligne
Hello,
A priori je dirais
return $id_max;
Hors ligne
merci de votre réponse, mais si je fait
$id_max=$db->query($sql); Zend_Debug::dump($id_max); echo $id_max;
j'ai ceci
Catchable fatal error: Object of class Zend_Db_Statement_Pdo could not be converted to string in /var/www/myboutik/application/models/DbTable/Facture.php on line 13
Dernière modification par keokaz (14-09-2011 15:40:27)
Hors ligne
Tout est dans la doc...
[lang=php] $stmt = $db->query('SELECT * FROM bugs'); $rows = $stmt->fetchAll(); echo $rows[0]['bug_description'];
Donc ici il te manque un fetchAll, ou un while($result = $stmt->fetch()) pour récupérer ton jeu de résultats.
Pour le traitement, tu peux faire un count sur ton rowset par exemple, si count(rowset) < 1 pas de résultat, sinon traitement des résultats.
Hors ligne
merci de ta réponse théocite,
je viens de testé avec un fetchOnes
[lang=php] <?php class Application_Model_DbTable_Facture extends Zend_Db_Table_Abstract { protected $_name = 'factures'; public function maxfacture() { $db = Zend_Db_Table::getDefaultAdapter(); $sql="SELECT max(id_facture) FROM factures"; echo $sql; $id_max=$db->fetchOne($sql); Zend_Debug::dump($id_max); echo $id_max;//affiche bien null } }
qu'en pense tu au lieu d'utiliser fetchAll() ?
cette id_facture me sert a determiner la prochaine id_facture
dans cette table l'id_facture n'est pas un auto-incrémente, il peut avoir plusieurs même id_facture
Dernière modification par keokaz (14-09-2011 15:57:49)
Hors ligne
Le fetchOne te permet en effet de récupérer une seule ligne, hors tu désires récupérer 0 lignes, donc fetchAll et fetchOne ont le même comportement.
Ah oui tu fais un count, j'avais omis cet aspect. C'est donc bien un fetchOne qu'il te faut.
Par contre, je raccourcirais le code...
[lang=php] <?php class Application_Model_DbTable_Facture extends Zend_Db_Table_Abstract { protected $_name = 'factures'; public function maxfacture() { $result = $this->fetchOne('max(id_facture) as max'); return $result->max; } }
Là c'est pas testé mais ça doit donner quelque chose dans ce goût :
$result est un Zend_Db_Table_Row
on va donc lui demander son attribut (champ de la bd).
Hors ligne
keokaz a écrit:
merci de ta réponse théocite,
je viens de testé avec un fetchOnesCode:
[lang=php] <?php class Application_Model_DbTable_Facture extends Zend_Db_Table_Abstract { protected $_name = 'factures'; public function maxfacture() { $db = Zend_Db_Table::getDefaultAdapter(); $sql="SELECT max(id_facture) FROM factures"; echo $sql; $id_max=$db->fetchOne($sql); Zend_Debug::dump($id_max); echo $id_max;//affiche bien null } }qu'en pense tu au lieu d'utiliser fetchAll() ?
Dans la mesure où tu ne peux récupérer qu'un seul tuple, la fonction "fetchOne" est en effet plus appropriée.
keokaz a écrit:
cette id_facture me sert a determiner la prochaine id_facture
dans cette table l'id_facture n'est pas un auto-incrémente, il peut avoir plusieurs même id_facture
O_o
Quel est l'intérêt d'avoir plusieurs fois le même id_facture ?!? Un id n'est pas censé être un identifiant unique ?
Dernière modification par f.garoby (14-09-2011 16:09:42)
Hors ligne
merci de toute ces réponse
Quel est l'intérêt d'avoir plusieurs fois le même id_facture ?!? Un id n'est pas censé être un identifiant unique ?
ma table contient
id_lignecommande | id_facture |id_client
avec une facture je peux commander plusieurs chose
merci Téocite, j'ai testé ta solution
Fatal error: Call to undefined method Application_Model_DbTable_Facture::fetchOne() in /var/www/mytest/application/models/DbTable/Facture.php on line 22
la ligne 22
$result = $this->fetchOne('max(id_facture) as max');
donc pour le moment mon scripte est comme ceci
[lang=php] $db = Zend_Db_Table::getDefaultAdapter(); $sql="SELECT max(id_facture) FROM factures"; $id_max=$db->fetchOne($sql); $id_max=$id_max+1; $this->id_max = $id_max;//je viens de penser que je n'avais pas besoin de transmettre dans le controlleur, tous ce fait dans cette classe
Dernière modification par keokaz (14-09-2011 16:33:16)
Hors ligne
Essaye avec fetchRow plutôt que fetchOne.
Tout comme f.garoby, je ne comprends pas ton système, qui au passage risque de compromettre l'intégrité des données contenues dans ta base... Je t'aide sur les problèmes que tu poses, mais je ne suis pas forcément en phase avec les rudiments du projet...
Dernière modification par Théocrite (14-09-2011 16:38:07)
Hors ligne
je dois crée 2 tables alors?
1 table facture
id_facture |id_personne|date
et une autre table commande ?
id_ligne commande | id_facture
la ligne de commande serai un auto-incrémente
Dernière modification par keokaz (14-09-2011 17:54:27)
Hors ligne
En fait j'ai pas suivi la manip là...
id_lignecommande | id_facture |id_client
A quoi ça correspond tout ça ?
Hors ligne
Au début je souhaitai enregistrer mes commande dans un seul tableau qui ressemblerai à cela
Table FACTURE id_ligne | id_facture | id_client
id_ligne est auto incrémente
id_facture correspond au numéro de la facture par exemple si jean commande 3 articles j'aurai 3 id_article différents
id_ligne |id_facture |id_client|---id_article ---1-----| -----9------|-----98---|----56----- //56 une pomme ---2-----|-----9-------|----98----|-----4-----//4 un stylo ---3-----|-----9-------|----98----|-----10-----
le 98 c'est jean j'ai une table client qui a un id et un nom
le 56 c'est la pomme j'ai une table article qui a un id_article avec le nom des articles
le 4 c'est le stylo
maintenant je vais essayer de suivre vos conseille, je vais essayer de scinder cette table en deux
donc 1 table facture qui contient
l'id de la facture , se sera l'autoincrémentation + l'id du client
et une autre table commande(peut être qu'il vaut mieux trouver un autre nom, je n'ai pas encore trouvé le nom adéquate)
avec id_commande, se sera l'auto incrémentation (clef primaire) avec un id_produit , une quantité
Dernière modification par keokaz (14-09-2011 18:23:11)
Hors ligne
Ok, c'est déjà plus clair ainsi.
Là comme ça, j'ai l'impression que tu es tout simplement face à une classique relation 1-N/1-N : une facture peut porter sur 1 à N articles et 1 article peut être facturé 1 à N fois. Donc il te faut une table intermédiaire entre ces deux-là.
Ton schéma de tables pourrait donc être le suivant :
* une table "clients" (tu l'as déjà) ;
* une table "articles" (tu l'as déjà) ;
* une table "facture", avec id_facture comme clé primaire et id_client qui est la clé étrangère provenant de la table "clients" ;
* une table "facture_articles", qui est la table intermédiaire entre tes tables "factures" et "articles" (du fait de la ration 1-N/1-N évoquée plus haut), avec id_facture et id_article. C'est cette table qui contiendra une ligne par article facturé pour une facture donnée
Hors ligne