如何使用PHP PDO解析MySQL数据库中的对象数据?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用PHP PDO解析MySQL数据库中的对象数据?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3998字,纯文字阅读大概需要6分钟。
内容图文
![如何使用PHP PDO解析MySQL数据库中的对象数据?](/upload/InfoBanner/zyjiaocheng/888/515469a52a784f26a4d6562005b1aeee.jpg)
我在尝试从数据库返回对象数据时遇到了问题.我按照this tutorial来构建一个DB包装器,并一直在尝试扩展它的功能以满足我的需要.我的问题是,当我使用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的无用功能.
>有状态
>受保护的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 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>';
}
}
这里的秘密是PDO已经可以为您提供对象数据,而不需要额外的一行编码.
虽然这个简单的例子并不是很令人印象深刻,但这里的秘诀在于,当视频中的内容会窒息时,这个包装器也可以为任何其他示例提供服务.尝试考虑任何其他示例,我将向您展示这个包装器是多么简单而强大.
内容总结
以上是互联网集市为您收集整理的如何使用PHP PDO解析MySQL数据库中的对象数据?全部内容,希望文章能够帮你解决如何使用PHP PDO解析MySQL数据库中的对象数据?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。