不同类中的PHP数据对象
我使用继承连接到PDOPHP数据对象,首先让我向您展示我的DB.php代码 我已经使我的DB.php成为一个单例类。我对单例模式有很好的了解 我希望我的代码被分发和分离,因此我创建了一个全新的类,用于从数据库中选择数据不同类中的PHP数据对象,php,pdo,Php,Pdo,我使用继承连接到PDOPHP数据对象,首先让我向您展示我的DB.php代码 我已经使我的DB.php成为一个单例类。我对单例模式有很好的了解 我希望我的代码被分发和分离,因此我创建了一个全新的类,用于从数据库中选择数据 class DB { private $db = ""; private static $instance = null ; private function __construct() { try { //$dsn = "mys
class DB {
private $db = "";
private static $instance = null ;
private function __construct() {
try {
//$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$this->db = new PDO("mysql:host=127.0.0.1;dbname=cactus", "root", "", $options = [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch(PDOException $e) {
print("Error: " . $e->getMessage() . "<br>");
die();
}
}
public function connect() {
if(self::$instance == null) {
self::$instance = new DB();
}
return self::$instance;
}
}
<?php
include "DB.php";
class Load_Data {
public function Fetch() {
$db = DB::connect();
$Querystatement = $this->db->prepare("SELECT * FROM `production`");
$Querystatement->fetchAll();
$Querystatement->execute();
/** Converting data to JSON **/
json_encode($Querystatement);
return $Querystatement;
}
}
$load_Data = new Load_Data();
$load_Data->Fetch();
下面是我的名为load-data.php的类,问题是在调用DB::connect时它给了我以下错误
错误是它无法识别DB::connect;。最终在prepare函数中也会出现错误
我哪里做错了?我应该做些什么来实现下面所需的代码
[注意]:我已经在STACKOVERFLOW和其他论坛上讨论过确切或类似的问题,但没有找到任何有帮助的方法。您的第一个问题是:
$db = DB::connect();
^^^
$Querystatement = $this->db->…
^^^^^^^^^
分配给$db将创建一个名为$db的局部变量。如果希望将此值作为实例变量$this->db使用,则需要显式地分配给该变量
第二个问题是DB对象不是PDO对象;您不能调用PDO方法,如prepare。由于db对象的db属性是私有的,因此无法从外部调用方访问它;您需要对设计进行一些更改。我认为您的问题在于尚未将connect方法定义为静态方法。因此,无法通过调用DB:connect访问它 尝试将类的连接方法修改为以下内容:
public static function connect() {
/* Existing Code Here */
}
编辑:
此外,我认为您需要将类中的$db属性设置为public而不是private,以确保Fetch方法中的本地$db变量具有调用\PDO方法的属性的可见性。Change
$Querystatement = $this->db->prepare("SELECT * FROM `production`");
到
有几个问题。首先,为了使用继承,DB类必须扩展PDO。你说的对 构造函数应该是私有的,但实际上不应该包含任何内容。您的连接方法需要是静态的, 它需要调用另一个静态方法来获取实例,并且构造函数不能是静态的。因此,添加一个静态getInstance 方法,该方法设置并返回实例,并在connect中调用该实例,而不是尝试使用new 在修复Load_数据之后,如果您想查看任何内容,您仍然需要对使用它的方式再做一次调整。使命感 $load_Data->Fetch;不输出任何内容。Fetch现在将返回一个字符串,但如果需要,您需要回显它 查看结果,或者如果要对其执行其他操作,则将其分配给变量
<?php
$load_Data = new Load_Data();
echo $load_Data->Fetch();
// OR $json = $load_Data->Fetch();
事实上,这并不能解决我的问题,因为我的另一半错误将保留在它的位置。如下所示:致命错误:未捕获错误:调用未定义的方法DB::prepare in C:\xampp\htdocs\Cactus\load data.php:8堆栈跟踪:0 C:\xampp\htdocs\Cactus\Cactus\load-data.php18:load_data->Fetch 1{main}在第8行的C:\xampp\htdocs\Cactus\Cactus\load-data.php中抛出,换句话说,它仍然不承认DB::prepare方法是合法的方法。在您的建议后,我刚刚尝试了它,但它不起作用。只有当变量$DB直接包含PDO实例时,这才是正确的。在本例中,$db变量包含一个类引用,该类引用包含另一个变量$db,该变量包含PDO实例。现在的问题是,我试图实现的逻辑是否可以实现如果是的话,我至少需要一个如何实现的提示。@WajahatAli对答案进行了编辑。由于使用了private,您的内部db实例对本地$db变量不可见。公开它,它应该可以正常工作。您在哪里使用继承?您指的是这里没有显示的其他代码吗?先生,首先非常感谢您对我的答案的深入回答。这正是我想要的,但是您能告诉我如何在上面的场景中实例化insert函数吗。再次感谢你,先生。
<?php
class DB extends PDO {
private static $instance = null ;
private function __construct() { }
private static function getInstance() {
try {
return self::$instance = new PDO("mysql:host=127.0.0.1;dbname=cactus", "root", "", [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch (PDOException $e) {
print("Error: " . $e->getMessage() . "<br>");
die();
}
}
public static function connect() {
if (self::$instance == null) {
self::$instance = self::getInstance();
}
return self::$instance;
}
}
<?php
class Load_Data {
public function Fetch() {
$db = DB::connect();
$Querystatement = $db->prepare("SELECT * FROM `production`");
$Querystatement->execute();
$result = $Querystatement->fetchAll();
return json_encode($result);
}
}
<?php
$load_Data = new Load_Data();
echo $load_Data->Fetch();
// OR $json = $load_Data->Fetch();