gpt4 book ai didi

php - 如何使用 PHP PDO 解析 MySQL 数据库中的对象数据?

转载 作者:行者123 更新时间:2023-11-29 01:26:38 25 4
gpt4 key购买 nike

我在尝试从我的数据库返回对象数据时遇到了问题。我关注了this tutorial构建一个数据库包装器并一直在尝试扩展它的功能以满足我的需要。我的问题是,当我使用 DB 类的“get”方法返回数据时,它也返回了 PDO 对象本身的一个实例。我想知道如何解析这些数据,以便只返回数据库中的对象,而不是数据库对象本身。我希望最终能够为每个对象显示不同的数据库值。

这是我所有的相关代码:

class DB {

private static $_instance = null; //stores instance of database
private $_pdo,
$_query,
$_error = false,
$_results,
$_count = 0;


private function __construct() {
try {
$this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), Config::get('mysql/username'), Config::get('mysql/password'));
} catch(PDOException $e){
die($e->getMessage());
}
}


public static function getInstance() {
if(!isset(self::$_instance)){
self::$_instance = new DB();
}
return self::$_instance;
}

public function query($sql, $params = array()){
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)) {
$x = 1;
if(count($params)) {
foreach($params as $param) {
$this->_query->bindValue($x, $param);
$x++;
}
}
if($this->_query->execute()) {
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
} else {
$this->_error = true;
}
}
return $this;
}


public function action($action, $table, $where = array()) {
if(count($where) === 3) {
$operators = array('=', '>', '<', '>=', '<=');

$field = $where[0];
$operator = $where[1];
$value = $where[2];

if(in_array($operator, $operators)) {
$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";
if(!$this->query($sql, array($value))->error()) {
return $this;
}
}

} return $this;

}

public function get($table, $where) {
return $this->action('SELECT *', $table, $where);

}
}

class Schedule {

private $_db;
protected $_games = array();

public function __construct() {

$this->_db = DB::getInstance();

}

public function listGames() {

$data = $this->_db->get('games', array('id', '>', 0));
var_dump($data);

echo '<br>';

}
}

最佳答案

这些视频教程的问题在于他们的作者对这个主题一无所知,这使得结果比你根本不使用他们的精神排泄物要糟糕得多。它们造成的损害是如此严重,以至于我什至不得不写一篇专门的文章来解释为什么所有这些无助的“包装器”对于任何现实生活中的应用程序来说都是完全无法使用的,Your first database wrapper's childhood diseases .

以视频中的包装器为例:

  • 错误报告完全有缺陷
  • 一个对 SELECT 无用的函数。
  • 有状态
  • protected PDO 实例

因此,从本质上讲,您将无法从这个“包装器”中获取甚至像 Insert Id 这样愚蠢的东西。甚至没有错误报告可以帮助您意识到问题。

就您的代码而言,不要为了节省自己键入 SQL 关键字而讨价还价。这很愚蠢。 SQL 是一个宝贵的东西,不要因为一些乱七八糟的快捷方式而忽视它。您也不应将 PDO 减少到残缺不全的状态,从而丢弃其最出色的功能。

您的包装器应该使所有 PDO 和 SQL 功能都可访问,而不是丢弃它们。就这样:

class DB
{
protected static $instance;
protected $pdo;

protected function __construct() {
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
PDO::ATTR_EMULATE_PREPARES => FALSE,
);
$dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
$this->pdo = new PDO($dsn, DB_USER, DB_PASS, $opt);

}

// a classical static method to make it universally available
public static function instance()
{
if (self::$instance === null)
{
self::$instance = new self;
}
return self::$instance;
}

// a proxy to native PDO methods
public function __call($method, $args)
{
return call_user_func_array(array($this->pdo, $method), $args);
}

// a helper function to run prepared statements smoothly
public function run($sql, $args = [])
{
$stmt = $this->pdo->prepare($sql);
$stmt->execute($args);
return $stmt;
}
}

这个包装器比视频中的包装器简单十倍,同时功能强大十倍。

现在是你的类(class)

class Schedule
{
private $_db;

public function __construct()
{
$this->_db = DB::instance();
}

public function listGames()
{
$data = $this->_db->query('SELECT * FROM games')->fetchAll();
var_dump($data);
echo '<br>';
}
}

这里的 secret 在于 PDO 已经可以为您提供对象数据,而无需额外的一行代码。

虽然这个简单的示例不是很令人印象深刻,但这里的秘诀在于,当视频中的示例令人窒息时,此包装器也将为您提供任何其他示例。试着想出任何其他示例,我将向您展示这个包装器是多么简单而强大。

关于php - 如何使用 PHP PDO 解析 MySQL 数据库中的对象数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43104562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com