mysqli数据库conexion和函数问题(Mysql - PHP)

时间:2011-11-18 17:50:29

标签: php oop mysqli

我正在尝试使用MySQL和PHP开发一个系统。我正在使用OOP使用mysqli*函数。我遇到的问题是下一个问题:

我有一个连接数据库的类:

<?php
  class Conexion{
   $this->linkDb = new mysqli("127.0.0.1", "user", "pass");
   if($this->linkDb){
     $this->linkDb->select_db("test");
     return TRUE;
   }
  else{
     return FALSE;
  }
 } // End of class Conexion

&GT;

我有几个类来检索和存储数据库中的数据,例如:

<?php
class Product{

  public function listProducts()
  {
    $query = "SELECT * FROM products";
    $rsProducts = $linkDb->query($query);
    if($rsProducts){
       // ....
    }
    else{
      // ....
    }
  }
}
?>

我在下一个文件(main)中使用这个类:

<?php
  function __autoload($className)
  {
    require_once("./class/$className.php");
  }

  $cnx = new Conexion();
  $prd = new Products();
  if($prd->listProducts()){
    echo "OK";
  }
  else{
    echo "Wrong...";
  }
?>

当我尝试运行此文件时,我收到下一个错误: Fatal error: Call to a member function query() on a non-object in /home/emco/training/phpmysqli/class/Products.php on line 8

我知道错误是由于方法$linkDblistProducts()的范围。我的问题是,我怎样才能在我班级的所有功能中提供conexion的链接?我是否必须在班级的每个功能中建立一个conexion链接?这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以将$cnx对象传递给Products的每个方法调用,也可以将其设置为Products的属性。 (第三种方法是在方法中声明global $linkDb,但使用依赖注入更清楚。)

示例1:将连接注入构造函数并将其作为属性保存到Products

class Product{
  // Database as property
  public $linkDb;

  // Pass it into the constructor
  public function __construct($cnx) {
    $this->linkDb = $cnx;
    // ...other stuff...
  }

  public function listProducts()
  {
    $query = "SELECT * FROM products";
    // Access it with $this->linkDb
    $rsProducts = $this->linkDb->query($query);
    if($rsProducts){
       // ....
    }
    else{
      // ....
    }
  }
}

// Use it as:
$cnx = new Conexion();
$prd = new Products($cnx);

示例2:将$cnx传递给Products所需的每个方法调用

// Require one parameter $linkDb
public function listProducts($linkDb)
{
  $query = "SELECT * FROM products";
  $rsProducts = $linkDb->query($query);
  if($rsProducts){
   // ....
  }
  else{
    // ....
  }
}

// Call as
$cnx = new Conexion();
$prd = new Products();

// Pass $cnx as a parameter
if($prd->listProducts($cnx)){
  echo "OK";
}