Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 31-07-2007 21:05:38

BOBART
Nouveau membre
Date d'inscription: 30-07-2007
Messages: 5

[zend_DB ???][1.0.1]Base de données

bonsoir / bonjour
apres avoir strictement suivi le tutoriel
ftp://ftp-developpez.com/g-rossolini/tu … -yogui.pdf

je me suis lancer dans la modification de site final produit par le tutoriel

j'en arrive a quelques problèmes que je n'arrive pas a résoudre:

=> je créer une table catégorie
=> j'ajoute une champ Id_cat à Album (évidement) ce qui donne
Categorie(id, Nom_Cat)
Album(id,artist,title,Id_cat)

l'idée serai (dans un premier temps) produire un affichage des champs suivants
artist title Nom_Cat

je pense faire une jointure

dans l'état actuel des choses cela ressemble à peu prés à cela dans mon .phtml

Code:

foreach($this->Album as $album) : 
echo $this->escape($Album->Artite);
echo $this->escape($Album->title);
    foreach($this->Categorie as $categorie) : 
        if($categorie->id==$Album->Id_Cat)
        {
        echo $this->escape($categorie->Nom_Cat); 
        }
    endforeach
endforeach

extrait de code de mon indexcontrolleur

Code:

$album = new Album();
    $this->view->Album = $album->fetchAll();    
    $categorie = new Categorie();
    $this->view->Categorie = $categorie->fetchAll();

je ne trouve pas cela très performant
et cela risque de devenir ingérable
j'ai essayer des choses de ce genre ci

Code:

$select = $db->query('SELECT champ FROM table');
$rows = $select->fetchAll();

en vain car dans le tutoriel de référence le seul $db et défini dans zf-tutorial/index.php


visiblement il y a quelque chose que je n'ai pas saisi si quelqu'un pouvait m'éclaircir cela 
merci d'avance

Hors ligne

 

#2 31-07-2007 21:42:55

Ysaak
Membre
Lieu: Strasbourg
Date d'inscription: 18-06-2007
Messages: 33

Re: [zend_DB ???][1.0.1]Base de données

Bonsoir,

Si tu souhaites tester ta méthode, il faut que tu récupères ton objet instancé dans ton bootstrap.
Il y a 2 solutions. Soit tu utilises le mot clef global dans ta methode.
Soit, la solution recommandée, dans ton bootstrap, tu ajoutes après avoir instancé $db

Code:

Zend_Registry::set('database', $db);

Et tu récupères dans tes classes via :

Code:

$db = Zend_Registry::get('database');

+, Damien

Hors ligne

 

#3 01-08-2007 13:15:04

jzender
Membre
Date d'inscription: 12-07-2007
Messages: 25

Re: [zend_DB ???][1.0.1]Base de données

Bonjour,

J'ai exactement le même type de problème !

Dans mon contrôleur :

Code:

$client = new Client();
$requete = $client->getDefaultAdapter()->select()->from('Client')->query();
$requete->fetchAll();

Dans ma vue :

Code:

<?php
foreach($this->clients as $client) :
    echo $this->escape($client->RaisonSociale);
endforeach;
?>

Quelqu'un a-t-il une idée ?

Merci !!

J-Zender.

Hors ligne

 

#4 01-08-2007 14:00:56

Ysaak
Membre
Lieu: Strasbourg
Date d'inscription: 18-06-2007
Messages: 33

Re: [zend_DB ???][1.0.1]Base de données

Bonjour J-Zender,

As-tu essayé de faire directement (si ta classe étend Zend_DB_Table) ?

Code:

$client->fetchAll();

+, Damien

Hors ligne

 

#5 01-08-2007 14:41:59

jzender
Membre
Date d'inscription: 12-07-2007
Messages: 25

Re: [zend_DB ???][1.0.1]Base de données

Oui Damien, avec $client->fetchAll(), cela fonctionne. Mais mon but est ensuite de faire des $db->select()->join(), et donc de récupérer le résultat d'un $db->query()->fetchAll() dans ma vue.

$client->fetchAll(), je n'y arrive qu'avec une seule table, pas pour les jointures entre plusieurs tables.

En utilisant $client->fetchAll(), je récupère une variable $this->clients dans ma vue, et l'affichage des résultats se fait avec un foreach($this->clients as $client). Mais ça ne fonctionne plus dès que je n'utilise pas $client->fetchAll().

Une idée ?

Hors ligne

 

#6 01-08-2007 15:16:28

Ysaak
Membre
Lieu: Strasbourg
Date d'inscription: 18-06-2007
Messages: 33

Re: [zend_DB ???][1.0.1]Base de données

Est-ce que le programme te renvoi une erreur ?
Je viens d'éplucher à nouveau la documentation et il me semble que la méthode soit correcte.

As-tu essayé de décomposer la commande pour voir si à un endroit quelque chose bloque le système ?

Hors ligne

 

#7 01-08-2007 15:38:23

jzender
Membre
Date d'inscription: 12-07-2007
Messages: 25

Re: [zend_DB ???][1.0.1]Base de données

Oui, j'obtiens cette erreur :

Code:

Notice: Trying to get property of non-object in C:\wamp\phenix\www\test\application\views\scripts\index\index.phtml on line 4

La méthode est pourtant conseillée dans la doc.

Je suis parti de ce célèbre tutoriel, avec un projet fonctionnel :
ftp://ftp-developpez.com/g-rossolini/tu … -yogui.pdf

Je l'ai simplifié de la façon suivante :

/index.php (tu remarqueras que j'ai sauvé l'adapter dans le registre)

Code:

<?php
    error_reporting(E_ALL|E_STRICT);
    date_default_timezone_set('Europe/Paris');
    set_include_path('.' . PATH_SEPARATOR . './library'
        . PATH_SEPARATOR . './application/models/'
        . PATH_SEPARATOR . get_include_path());
    include "Zend/Loader.php";
    Zend_Loader::loadClass('Zend_Controller_Front');

    Zend_Loader::loadClass('Zend_Config_Ini');
    Zend_Loader::loadClass('Zend_Registry');

    Zend_Loader::loadClass('Zend_Db');
    Zend_Loader::loadClass('Zend_Db_Table');

    // load configuration
    $config = new Zend_Config_Ini('./application/config.ini', 'general');
    $registry = Zend_Registry::getInstance();
    $registry->set('config', $config);

    // setup database
    $db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
    Zend_Db_Table::setDefaultAdapter($db);
    $registry->set('adapter', $db);

    // setup controller
    $frontController = Zend_Controller_Front::getInstance();
    $frontController->throwExceptions(true);
    $frontController->setControllerDirectory('./application/controllers');
    // run!
    $frontController->dispatch();

/application/controllers/IndexController.php (l'adapter est récupéré)

Code:

<?php

    class IndexController extends Zend_Controller_Action
    {

        function init() {
            $this->view->baseUrl = $this->_request->getBaseUrl();
            Zend_Loader::loadClass('Client');
        }

        function indexAction() {
            $this->view->title = "Tous les clients";
            
            /*$client = new Client();
            $this->view->clients = $client->fetchAll();*/
            
            $db = Zend_Registry::get('adapter');
            //$db = Client::getDefaultAdapter();
            
            //$select = $db->query('SELECT * FROM Client');
            $this->view->clients = $db->query('SELECT * FROM Client')->fetchAll();
        }

    }

/application/models/Client.php (modèle correspondant à la table)

Code:

<?php
    class Client extends Zend_Db_Table_Abstract {
        protected $_name = 'Client';
        protected $_primary = 'NumClient';
    }

/application/views/index/index.phtml (la vue)

Code:

<h1><?php echo $this->escape($this->title); ?></h1>

<?php foreach($this->clients as $client) :
    echo $this->escape($client->RaisonSociale);?>
    
<br>

<?php endforeach; ?>

Arriver à utiliser l'adapter $db pour faire des requêtes sur des tables, c'est l'enjeu ! smile

A la place de la sauvegarde de l'adapter dans le registre, j'ai lu quelque part que je pouvais faire :

Code:

$client->getAdapter()

et qu'il y avait aussi une fonction

Code:

getDefaultAdapter()

pour Zend_Db_Table (d'où le

Code:

Zend_Db_Table::setDefaultAdapter($db);

dans index.php). Problème : ça ne semble pas fonctionner ...

HELLLP PLEAAASE !!! smile

Hors ligne

 

#8 01-08-2007 15:48:51

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: [zend_DB ???][1.0.1]Base de données

Essaye en ajoutant ca :

Code:

$this->getAdapter()->setFetchMode(Zend_Db::FETCH_OBJ);

Alors je sasi pas trop ou tu va sle mettre ton code j'ai pas tout suivi.
tu dois le faire avant d'effectuer ta requete, normalement ca devrait marcher.

Sinon au lieu de :

Code:

echo $this->escape($client->RaisonSociale);?>

Tu dosi mettre :

Code:

echo $this->escape($client["RaisonSociale"];?>

C'est là que ca bloque.

Dernière modification par alien7 (01-08-2007 15:51:19)


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#9 01-08-2007 15:50:17

Ysaak
Membre
Lieu: Strasbourg
Date d'inscription: 18-06-2007
Messages: 33

Re: [zend_DB ???][1.0.1]Base de données

Je pense peut-être avoir trouvé ta solution, si c'est comme décrit ci-dessous.
Dans mes classes : fetchAll  me retourne toujours un tableau php. L'erreur vient peut-être de là.

A la ligne 4 de ton index.phtml il y a :

Code:

echo $this->escape($client->RaisonSociale);

As-tu essayé de remplacer par :

Code:

echo $this->escape($client['RaisonSociale']);

Si ce n'est pas cela essaye de placer à la place de ton foreach et regarder le type de données :

Code:

<pre>
print_r($this->clients);

Hors ligne

 

#10 01-08-2007 15:52:02

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: [zend_DB ???][1.0.1]Base de données

Lis mon post plus haut Ysaak j'ai update


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#11 01-08-2007 15:54:21

jzender
Membre
Date d'inscription: 12-07-2007
Messages: 25

Re: [zend_DB ???][1.0.1]Base de données

Effectivement, ça fonctionne !!! smile

Code:

$db->setFetchMode(Zend_Db::FETCH_OBJ);

Tu saurais m'expliquer pourquoi ? Les résultats n'étaient pas sous forme de tableau ?

Merci beaucoup en tout cas !!

Hors ligne

 

#12 01-08-2007 15:56:46

Ysaak
Membre
Lieu: Strasbourg
Date d'inscription: 18-06-2007
Messages: 33

Re: [zend_DB ???][1.0.1]Base de données

Alien7, j'ai été grillé lors de la rédaction de mon message ^^

jzender :
Si en effet, mais tu cherchais à récupérer les informations comme avec un objet. La méthode que alien7 t'a donné dit à l'adapter de te renvoyer les informations sous forme d'objet et non de tableau.

+

Hors ligne

 

#13 01-08-2007 16:05:08

jzender
Membre
Date d'inscription: 12-07-2007
Messages: 25

Re: [zend_DB ???][1.0.1]Base de données

Effectivement,

Code:

echo $this->escape($client['RaisonSociale']);

fonctionne lorsque je retire :

Code:

$db->setFetchMode(Zend_Db::FETCH_OBJ);

Merci beaucoup !!

Hors ligne

 

#14 02-08-2007 16:39:07

BOBART
Nouveau membre
Date d'inscription: 30-07-2007
Messages: 5

Re: [zend_DB ???][1.0.1]Base de données

Merci à tous , je n'ai pas eut le temps auparavant de tester à l'heure actuelle , si je fait un var_dump sa à l'air de marcher :-)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages