我正在尝试使用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
我知道错误是由于方法$linkDb
中listProducts()
的范围。我的问题是,我怎样才能在我班级的所有功能中提供conexion的链接?我是否必须在班级的每个功能中建立一个conexion链接?这样做的正确方法是什么?
答案 0 :(得分:1)
您可以将$cnx
对象传递给Products
的每个方法调用,也可以将其设置为Products
的属性。 (第三种方法是在方法中声明global $linkDb
,但使用依赖注入更清楚。)
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);
$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";
}