2010-09-29 5 views
2

Je suis un peu nouveau à la POO, mais je joue avec depuis environ un mois maintenant. Habituellement, je crée une classe appelée Mysql qui a une fonction __construct qui se connecte directement à une base de données. Et après cela, j'ai beaucoup de différentes fonctions qui obtient ou insère des données dans différentes tables.PHP/Mysql - Sélection dynamique des données?

Sur le bus de la maison aujourd'hui, j'ai commencé à réfléchir et je suis venu avec une idée brillante qui le rendrait moins encombré. Mon idée est d'utiliser une seule fonction qui sélectionne les données (et une pour l'insertion), et en fonction de la façon dont la requête est passée, elle va sélectionner différentes données provenant de différentes tables. Bonne droite?

Mais je suis coincé ici. Je ne suis pas sûr du tout comment y parvenir. J'ai une petite idée de comment cela pourrait fonctionner, mais je ne sais pas comment je lierais les résultats, ou les chercher dans un tableau. La requête sera créée dans une autre méthode, puis transmise dans la fonction select/insert de la classe Mysql.

J'ai dessiné un «croquis» sur comment je pense que cela peut fonctionner. La voici:

Bien sûr, la fonction ci-dessous sera placée dans la classe Mysql et aura déjà une connexion à une base de données.

// This is an example query that could be passed in. 
$query = "SELECT * FROM table WHERE id=150"; 

function select_data($query) { 
    if ($smtp = $this->conn->prepare($query)) { 

     $smtp->execute(); 
     $smtp->bind_results(What happens here?); 

     if ($smtp->fetch()) { 

      foreach (fetched_row? as $key => $value) { 
       $return[] = $key => $value; 
      } 

      return $return; 

     } 
     else return NULL; 

    } 
    else return $this->conn->error; 
} 

Merci beaucoup à tous ceux qui peuvent me montrer comment cela peut être réalisé.

Répondre

0

Je pense que vous rencontrez des problèmes lorsque vous avez besoin de données connexes. En d'autres termes, lorsqu'un de vos objets a une propriété qui est un autre objet, les données doivent également être collectées et remplies dynamiquement. Une fois je suis venu assez loin mais quand des choses comme des jointures intérieures, gauches et droites viennent croisées, vous réfléchissez à deux fois avant d'aller plus loin;)

A propos de bind_results: http: //php.net/manual/en/mysqli-stmt. BIND result.php

(Peut-être un peu hors sujet,? SMTP est un mailprotocol, êtes-vous sûr de ne pas dire la STMT de MySQLi)

+0

Je ne vais pas être en utilisant pour ce joint, je pense. Mais même si je le fais, comment cela ne fonctionnerait-il pas? La requête sera toujours similaire à celle mentionnée dans mon premier post, en jetant peut-être une jointure si ça marche ... Ouais, je voulais dire STMT, pas SMTP, hehe. Merci! – Nike

0

pour référence, AOP fait déjà beaucoup de ce que vous semblez vouloir faire. Il a même une méthode fetchAll qui retourne un tableau de lignes, un peu comme votre fonction. Vous n'avez pas besoin de lier quoi que ce soit pour l'utiliser, sauf si vous avez des paramètres dans votre chaîne de requête (et bien sûr, des valeurs à lier à ces paramètres).

Consultez the PDO documentation pour voir si cela ne correspond pas à vos besoins. Particulièrement PDOStatement->fetchAll().

1

Vous avez plus d'options à utiliser en PHP et ils ont leurs propres spécificités. Je peux recommander certains ORM comme Doctrine en raison de la facilité d'utilisation, la stabilité, la communauté et surtout l'efectivité.

Vous pouvez l'utiliser aussi facile que:

$q = Doctrine_Query::create() 
    ->select('u.username, p.phone') 
    ->from('User u') 
    ->leftJoin('u.Phonenumbers p'); 

$users = $q->fetchArray(); 

ou:

// Delete phonenumbers for user id = 5 
$deleted = Doctrine_Query::create() 
    ->delete() 
    ->from('Phonenumber') 
    ->andWhere('user_id = 5') 
    ->execute(); 

// Make all usernames lowercase 
Doctrine_Query::create() 
    ->update('User u') 
    ->set('u.username', 'LOWER(u.username)') 
    ->execute(); 

// 'like' condition 
$q = Doctrine_Query::create() 
    ->from('User u') 
    ->where('u.username LIKE ?', '%jwage%'); 

$users = $q->fetchArray(); 
+0

Je vais devoir regarder un peu plus, merci pour la réponse! :) – Nike

Questions connexes