[编辑/更新]
请允许我解释一下情况。我有三个文件:
下面是db.class.php。调用时,它连接到构造函数中的DB并关闭析构函数中的连接。如果您注意到query()方法,那么它现在只是一个静态INSERT,因为那是我被困住的地方。
<?php
//
// Class: db.class.php
// Desc: Connects to a database and runs PDO queries via MySQL
// Settings:
error_reporting(E_ALL);
////////////////////////////////////////////////////////////
class Db
{
# Class properties
private $DBH; // Database Handle
private $STH; // Statement Handle
# Func: __construct()
# Desc: Connects to DB
public function __construct()
{
// Connection information
$host = 'localhost';
$dbname = 'removed';
$user = 'removed';
$pass = 'removed';
// Attempt DB connection
try
{
$this->DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$this->DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo 'Successfully connected to the database!';
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
# Func: query(sql statement)
# Desc: Sends a query to the DB
public function query($sql_statement)
{
$sql = array(':color' => $sql_statement);
$this->STH = $this->DBH->prepare("INSERT INTO color_table (color) value ( :color )");
$this->STH->execute($sql);
}
# Func: __destruct()
# Desc: Disconnects from the DB
public function __destruct()
{
// Disconnect from DB
$this->DBH = null;
echo 'Successfully disconnected from the database!';
}
}
?>
下面是colors.class.php。目前,它只有一个插入功能。我想要做的就是从db.class.php中查询我在query()函数中的内容并将其放入insertColor()函数中,并传递整个SQL语句,无论是插入,删除,或更新到query()函数。
<?php
//
// Class: colors.class.php
// Desc: Provides methods to create a query to insert,
// update, or delete a color from the database.
////////////////////////////////////////////////////////////
class Colors
{
# Class properties
protected $db;
# Func: __construct()
# Desc: Passes the Db object so we can send queries
public function __construct(Db $db)
{
$this->db = $db;
}
# Func: insertColor()
# Desc: Sends an INSERT querystring
public function insertColor($color)
{
$this->db->query($color);
echo 'Inserted color:' . $color;
}
}
?>
下面我们有colors.php,这是实例化和实现上述所有内容的地方。所以这里是我传递实际想要插入数据库的颜色的地方。
<?php
Require('db.class.php');
Require('colors.class.php');
$db = new Db;
$colors = new Colors($db);
$colors->insertColor('TestColor'); // Passing the color here to be put into an insert statement
?>
我基本上陷入困境的是我正在尝试使colors.class.php创建一个PDO语句,然后在它们准备运行时将其传递给db.class.php query()方法。现在,PDO语句只是在query()方法中定义,但我试图避免这种情况。本质上,我想从查询()方法中删除我所拥有的内容,并将其拆分为Colors类中的三个方法,一个用于插入,更新和删除。
但是,我对OOP编程很陌生,并且遇到了所有语法问题,也不知道这是否是一个好方法。非常感谢任何帮助,如果需要更多细节或信息,请告诉我。
答案 0 :(得分:3)
是的,因为$db
是方法中的局部变量。将其作为论据传递:
class Colors
{
protected $db;
public function __construct(Db $db = null)
{
$this->db = $db;
}
public function insertColor()
{
if ($this->db != null)
{
$this->db->query();
}
}
}
query
是一种方法,因此您必须添加括号:$db->query()
答案 1 :(得分:3)
我会从您的类文件中删除数据库的包含和初始化,并将其放在colors.php
本身。然后将$db
作为参数传递给构造函数:
<?php
Require('db.class.php');
Require('colors.class.php');
$db = new Db;
$colors = new Colors($db);
$colors->insertColor();
?>
我还会删除构造函数中的默认值,因为如果没有数据库,Colors
类将无效:
public function __construct(Db $db) // constructor Colors class
最后,我会调查autoloading个类,这样您就不必手动要求它们了。
答案 2 :(得分:0)
将$db->query;
更改为$db->query();
此外,需要将$ db声明为全局,以便像这样访问它。可能要考虑将其设为Colors