2010-07-12 4 views
1

J'essaie de configurer une connexion MySQL dans un script principal, puis d'appeler différentes fonctions en fonction de ce que je veux faire. J'ai du mal à transmettre les informations de connexion à la fonction.Passer la connexion MySQL à la fonction

J'ai une classe "requêtes" qui contient diverses fonctions, toutes qui retournent un tableau. C'est ce que le code ressemble dans mon script principal (appeler la fonction normale)

$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name) or die (mysql_error()); 
$stats = $queries->normal($mysqli); 

Et puis à l'intérieur de la ressource de requêtes, j'ai ce code:

class queries { 
    function normal($mysqli) { 
     $query = "SELECT number, first, last FROM roster"; 
     $roster = $mysqli->query($query); 

Puis je passe à faire ce que je avoir besoin. Je ne peux pas faire fonctionner cela. Je reçois l'erreur

Call to a member function normal() on a non-object 

sur la ligne que j'appelle la fonction dans mon fichier principal.

Ceci est similaire à ces questions, mais je ne peux pas tout à fait comprendre.
Passing database connection by reference in PHP
Ensuring MySQL connection works in PHP function

Merci

+0

Comment les requêtes $ sont-elles créées? –

+1

définissez-vous $ requêtes = nouvelles requêtes()? –

Répondre

2

« Appel à une fonction membre normale() sur un non-objet » signifie que vous essayez d'appeler normal() sur une variable qui n'est pas un objet. Probablement que vous vouliez faire:

$queries = new queries(); 
$stats = $queries->normal($mysqli); 
+0

C'est exactement ce que le problème était, merci Scott. –

5

$queries est pas un objet, beaucoup moins un objet queries. Déterminez ce que vous lui avez affecté à la place, et attribuez-lui la bonne chose :)

Ahh, je pense que je comprends maintenant. queries est une classe, pas un objet. Vous devez créer un objet qui est une instance de la classe.

$queries_obj = new queries; 
$queries_obj->normal($mysqli); 
+0

Que voulez-vous dire exactement? Êtes-vous en train de dire que j'ai probablement déjà assigné une variable à $ requêtes? –

+2

@phoffer Avez-vous attribué quelque chose à la variable $ queries? –

+1

@phoffer Cela signifie que vous devriez avoir créé une instance de requêtes en $ requêtes, ie selon le commentaire de votre question - $ queries = new queries() – Cez

1

Pensez à votre définition de la classe comme une recette et l'objet comme le plat réel que vous avez fait en utilisant cette recette.

Comme indiqué par d'autres, vous n'avez probablement pas instancié (créé) un objet de cette classe.

0

Je ne recommande vraiment pas de structurer votre code comme ça. Passer autour de la connexion mysql peut rendre vos signatures de fonctions incroyablement encombrées. Deux autres options sont:

  • Singleton Motif: Encapsulate vos fonctions d'interaction de base de données en une seule classe, et chaque fois que vous avez besoin d'appeler l'un d'eux, vous prenez une instance de cette classe. Ce qui est bien avec cette méthode, c'est que vous avez toujours la même connexion db, au lieu d'ouvrir de nombreuses demandes. Si vous n'utilisez pas OO lourd (beaucoup de php procédure, ou beaucoup de fonctions globales), c'est vraiment utile. Par exemple:
public function foo() { 
    $results = Db::getInstance()->query("SELECT * FROM bar"); 
    // Do other stuff 
    return $results; 
} 
  • Héritage: Ce modèle est vraiment utile si vous travaillez quelque chose comme MVC, ou vous avez besoin d'avoir des objets fonctionnalité de partage.Combiné avec un singleton, vous gardez une seule connexion db par requête, et l'accès facile de l'instance db dans une variable membre.
class DB { 
    public function __construct() { 
    $this->conn = Db::getInstance(); 
    } 
} 


class Foo extends DB { 
    public function foo() { 
    $this->conn->query("SELECT * FROM bar"); 
    } 
} 
0

Alors que je pourrais être d'accord que le passage des gestionnaires de bases de données autour des méthodes/fonctions est probablement pas la meilleure idée, ce n'est pas sale de passer la base de données des objets à travers des classes par le constructeur, en particulier si vous avez plusieurs connexions.

Questions connexes