2010-12-06 86 views
0

Je suis assez nouveau pour OOP et Zend. Jusqu'à présent, j'essaie de mettre en place une connexion DB. J'ai dans mon application.ini:Novice: Comment configurer correctement la connexion db sur zend framework?

resources.db.adapter = "PDO_MYSQL" 
resources.db.params.host = "localhost" 
resources.db.params.username = "root" 
resources.db.params.password = "" 
resources.db.params.dbname = "dbtest" 
resources.db.isDefaultTableAdapter = true 

Soi-disant que je peux accéder à l'adaptateur db partout avec:

$db = Zend_Db_Table::getDefaultAdapter(); 

Le problème est la plupart des guides supposent que vous savez automatiquement où placer, mais je Honnêtement, je n'en ai aucune idée. Ce que je fais jusqu'à présent est dans mon modèle index.php J'ai une méthode:

public function getPosts() 
{ 
$db = Zend_Db_Table::getDefaultAdapter(); 
$sql = "SELECT * FROM posts"; 
$result = $db->fetchAll($sql); 
return $result; 
} 

Avec cette seule requête, il serait correct, mais si je veux créer plusieurs méthodes qui maintiennent mes autres requêtes chaque fois Je vais devoir appeler $ db = Zend_Db_Table :: getDefaultAdapter() donc je suis sûr que je ne le fais pas de manière efficace. J'ai déjà essayé de le placer dans diverses méthodes __construct() et init(), mais cela ne fonctionnerait pas. Où ajouterais-je le code sans avoir à l'appeler à chaque fois? Merci.

Répondre

3

Un moyen facile d'exécuter vos requêtes serait de créer une classe pour chacune de vos tables qui étend Zend_Db_Table_Abstract qui vous fournirait quelques méthodes pratiques pour vous aider à obtenir votre stuff à partir de votre base de données.

En utilisant cette méthode, vous serez en mesure d'appeler le contenu de votre table via

$postsTable = new Model_Db_Tables_Posts() // Assuming you put your class post in the folders models/db/tables/ 
$posts = $postsTable->fetchAll(); 

pour un poste plus spécifique que vous pouvez aussi chercher par id en utilisant

$singlePost = $postsTable->find(1); // Assuming the id of the post you want is 1 

Et puis pour créer de nouveaux les entrées que vous pouvez aller avec

$data = array('title' => 'Some title', 'content' => 'Some Content') // where the key is the table field and the value is the value you want to insert 
$newId = $postsTable->insert($data); 

Et pour la mise à jour

$data = array('title' => 'Some title', 'content' => 'Some Content') 
$db = $postsTable->getAdapter(); 
$where = $db->quoteInto('id = ?', $id); // quoteInto is used to escape unwanted chars in your query, not really usefull for integers, but still a good habit to have 
$postsTable->update($data, $where); 

espère que cela vous aide un peu, vous pouvez trouver plus d'informations dans le instanciation Ainsi, la nouvelle classe officielle ZF doc à http://framework.zend.com/manual/fr/zend.db.table.html et http://framework.zend.com/manual/fr/zend.db.table.row.html

+0

effectue automatiquement une connexion db pour vous? Où devrais-je enregistrer ma classe qui étend le Zend_Db_Table_Abstract, désolé encore une fois encore vraiment nouveau à ce sujet. – Joker

+0

Si vous avez défini votre adaptateur de base de données par défaut dans votre bootstrap, automatiquement tout Zend_Db_Table_Abstract que vous étendez utilisera cet adaptateur sauf si vous spécifiez un autre adaptateur à utiliser. Puisque ZF utilise un chargeur automatique pour charger votre classe, vous devez juste vous assurer que le nom reflète la position du fichier, ie: Model_Db_Tables_Posts() doit se trouver dans les dossiers models/db/tables/posts.php du dossier de votre application (Zend convertit le modèle en modèles automatiquement dans le chemin). –

+0

Merci, je l'ai fait fonctionner maintenant, mais maintenant je me retrouve dans la même situation qu'avant. Chaque fois que je veux appeler une méthode qui exécute une requête, je dois utiliser: $ postsTable = new Model_Db_Tables_Posts(), ou est-ce normal? Je pensais que vous ne voudriez pas répéter cela à chaque fois. – Joker