Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonsoir tout le monde,
Voila j'ai mis en place une base de donnée Oracle avec Zend. Quand je sélectionne affiche modifié mes tables tout ce passe très bien.
Mais quand je souhaite afficher une vue de ma base de donnée la pas pareil j'ai une erreur fatal.
/Base de donnée :
Voici le sql de ma vue :
CREATE OR REPLACE FORCE VIEW "GIVRY"."CLIENT1" ("NUMCLIENT", "NOM", "PRENOM", "ADRESSEPOSTALE", "DATEDENAISSANCE") AS
Select numClient, nomClient, prenomClient, adressePostale, dateDeNaissance from CLIENT;
dedans nous avons bien des données.
/Zend application :
Voici mon script index dans le dossier script/test/ :
<HTML>
<BODY LANG="fr-FR" BACKGROUND="/projetBD/isc/images/Marceau.png" DIR="LTR">
<P ALIGN=CENTER><FONT COLOR="#000000"<FONT SIZE=4 STYLE="font-size: 15pt"><B>Liste des Clients</B></FONT></FONT></P>
<BR><BR>
<P ALIGN=CENTER>
<table>
<table border="2">
<thead>
<tr>
<th>n° Client</th>
<th>Nom</th>
<th>Prenom</th>
<th>Adresse Postale</th>
<th>Date naissance</th>
</tr>
</thead>
<tbody>
<?php
foreach ($this-> test as $liste) {
echo '<tr><td>' . $liste-> NUMCLIENT.'</td>';
echo ' <td>' . $liste-> NOM .'</td>';
echo ' <td>' . $liste-> PRENOM .'</td>';
echo ' <td>' . $liste-> ADRESSEPOSTALE .'</td>';
echo ' <td>' . $liste-> DATEDENAISSANCE .'</td>';
}
?>
</table>
</tbody>
</table>
</P>
</BODY>
</HTML>
Mon Controler testControler :
<?php
class testController extends Zend_Controller_Action {
public function init(){
// chargement de la classe listedt
Zend_Loader::loadClass('test');
//on retrouve le registre global
$registry= Zend_Registry::getInstance();
// on mémorise l'adapteur
$this->db=$registry->get('db');
}
// Action d'accueil
function indexAction(){
// on crée une instance de Listedt en passant l'adapteur en
// paramètre du constructeur
$b = new test($this->db);
// obtenons un objet Zend_Db_Select
$select= $b->select();
$this->view->test=$b->fetchAll($select);
$this->render();
}
}
?>
Et enfin mon model qui je pense d'ou proviens mon erreur :
<?php
class test extends Zend_Db_Table_Abstract{
//nom du schéma sur le SGBD mySQL
protected $_schema='XE';
//nom de la table dans la base de données
protected $_name='GIVRY.CLIENT1';
//nom de la clé primaire de la table
protected $_primary='NUMCLIENT';
}
?>
Est ce que c'est pas le Zend_Db_Table_Abstract qui pose un probleme puisque je veux afficher une vue ?
Voici l'erreur afficher :
Uncaught exception 'Zend_Db_Table_Exception' with message 'Primary key column(s) (NUMCLIENT) are not columns in this table ()' in C:\wamp\www\projetBD\Zend\Db\Table\Abstract.php:660
Voila Merci a tout ceux qui pourront m'aider.
Hors ligne
Peut-être une piste ici : http://www.z-f.fr/forum/viewtopic.php?pid=13873
Hors ligne
Je vais voir ça et je tiens au courant merci !
Hors ligne
Hello,
Au vue de ton code, je me pencherais en premier sur les options de ton adaptateur : autoQuoteIdentifier et caseFolding.
A+
Hors ligne
Même pas j'ai changer de version je suis passé a la version 1.7.5 et ma vue a était directement prise.
Donc bug dans l'adaptateur pour Oracle je suppose.
En tout cas merci pour l'aide sa sauve mon projet XD.
venant de Réseau j'ai pas beaucoup eu d'expérience dans le développement d'application en php, java et Zend et
Une solution pas mal.
Bonne journée.
Hors ligne
Hello,
Tu avais une version avant 1.7.2 ?
A+
Hors ligne
apparemment oui !
j'ai réutilise le Zend que je possédais lorsque nous avons eu les cours d'initiation en novembre
Hors ligne
Bonjour Juroks,
Zend_Db_Table_Abstract à besoin absolument d'une clé primaire existante et comme pour une vue on ne peut pas définir une PrimaryKey (en tout cas pour MySQL) et c'est ton cas il faut la forcer.
Quand tu fais
protected $_primary="maClePrimaire"
Tu soulage simplement ZF dans sa découverte de la table car ZF réalise un DescribeTable pour découvrir les paramètres de la table et comme il ne trouve pas de PrimaryKey sur ta vue, tu as beau lui dire le code précédent, il s'en moque.
Donc on modifie le comportement normal de ZF comme si dessous
@+
<?php /** * * @package application * @subpackage models * * fichier TMavue.php * */ class TMavue extends Zend_Db_Table_Abstract { protected $_name = 'nomvue'; /* nom de la vue */ /* - But : utiliser une Vue comme modèle de données, mais... - Zend_Db_Table ne peut être utilisé si il n'existe pas de clé primaire - Comme on ne peut pas définir de clé primaire à une vue pour MySQL ou autre SGBD - Je force la méthode _setupPrimaryKey de la classe Zend_Db_Table_Abstract en lui donnant une clé primaire - Définition : _setupPrimaryKey() donne le nom de la clé primaire par défaut en cherchant dans describeTable(); vérifie que la clé primaire fait bien partie du tableau $_cols. - En redéfinissant cette méthode, vous pouvez spécifier une clé primaire manuellement. */ protected function _setupPrimaryKey() { $this->_primary = 'id_MaClePrimaire'; parent::_setupPrimaryKey(); } } ?>
Hors ligne
Hello,
freeseb a écrit:
Tu soulage simplement ZF dans sa découverte de la table car ZF réalise un DescribeTable pour découvrir les paramètres de la table et comme il ne trouve pas de PrimaryKey sur ta vue, tu as beau lui dire le code précédent, il s'en moque.
Non, non, il s'en moque pas du tout.
freeseb a écrit:
Code:
<?php /** * * @package application * @subpackage models * * fichier TMavue.php * */ class TMavue extends Zend_Db_Table_Abstract { protected $_name = 'nomvue'; /* nom de la vue */ /* - But : utiliser une Vue comme modèle de données, mais... - Zend_Db_Table ne peut être utilisé si il n'existe pas de clé primaire - Comme on ne peut pas définir de clé primaire à une vue pour MySQL ou autre SGBD - Je force la méthode _setupPrimaryKey de la classe Zend_Db_Table_Abstract en lui donnant une clé primaire - Définition : _setupPrimaryKey() donne le nom de la clé primaire par défaut en cherchant dans describeTable(); vérifie que la clé primaire fait bien partie du tableau $_cols. - En redéfinissant cette méthode, vous pouvez spécifier une clé primaire manuellement. */ protected function _setupPrimaryKey() { $this->_primary = 'id_MaClePrimaire'; parent::_setupPrimaryKey(); } } ?>
Ce n'est absolument pas nécessaire, tu utilises peut-être une version ancienne de ZF. Car la première étape de Zend_Db_Table_Abstract::_setupPrimaryKey, c'est :
protected function _setupPrimaryKey() { if (!$this->_primary) { ... } // ensuite une série de tests de validité
A+
Dernière modification par mikaelkael (17-02-2009 17:44:15)
Hors ligne