利用PDO.so连接并读取Mysql数据库 核心代码实现讲解
Posted 狱典司
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用PDO.so连接并读取Mysql数据库 核心代码实现讲解相关的知识,希望对你有一定的参考价值。
Pre. 准备
- 建议阅读本文前先大致浏览下方链接文章 :
PDO.so中PDO类以及PDOStatement类的相关方法、预定义汇总 - 查看数据库的基本操作请阅读下方连接文章:
超全!Mysql数据库 常用基本操作总结(含快速索引目录)
利用PDO.so连接数据库并读取Mysql数据库数据有两种编程方式可以考虑:
- 结构化编程,即面向过程编程(适合基础理解)
- 面向对象编程(推荐使用)
在开始之前,需要格外注意的是从结果集中取出数组的格式!因为这关乎到如何从由结果集fetch出的数组中取出数据!
本文详细讲解两种格式:
- PDO::FETCH_ASSOC
- PDO::FETCH_OBJ
- 上述两种格式在我的上一篇文章:PDO.so中PDO类以及PDOStatement类的相关方法、预定义汇总 中有解释,推荐进入该页面后使用 Ctrl+F 输入相应条目快速查找!
本文采用的数据表样例信息如下:
- 数据表结构:
- 数据表内容:
测试连接
随手附上一个测试连接的代码(看不懂没关系,先往下看):
<?php
$dbms='mysql'; //数据库类型
$host='localhost'; //数据库主机名
$dbName='n192204'; //使用的数据库
$user='A192204'; //数据库连接用户名
$pass='123456'; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
echo "connect successfully!<br/>";
/*你还可以进行一次搜索操作
foreach ($dbh->query('SELECT * from FOO') as $row) {
print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
}
*/
$dbh = null;
} catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "<br/>");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
?>
废话不多说,上代码讲解!
1. 结构化编程
代码 <1.1>
利用ASSOC格式读取数据库数据 (注:精髓都在注释里)
<?php
//结构化编程样例
$dbms='mysql'; //数据库类型
$host='localhost'; //数据库主机名
$dbName='n192204'; //使用的数据库名称
$user='A192204'; //数据库连接用户名
$pass='123456'; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
//注意$dsn的格式不能有空格!
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
echo "connect successfully!<br/>";
$sth = $dbh->prepare('SELECT * FROM hobbyID WHERE seq > ?');//预处理
$sth->execute(array(0)); //返回一个PDOStatement结果集类
//注意,该数组array(0)是为了给sql语句中”?“部分赋值,在本代码中sql语句为:SELECT * FROM hobbyID WHERE seq > ?
//如果sql中有多个”?“,即有多个筛选参数值,那么该数组应该有相应多的元素
//echo $sth; 该语句会返回:Catchable fatal error: Object of class PDOStatement could not be converted to string
//用于查看预取到的数组
//$re=$sth->fetchAll(PDO::FETCH_ASSOC);
//print_r($re);
/* ASSOC格式输出结果:
* Array (
* [0] => Array ( [seq] => 1 [hid] => 1 [hobby] => shopping )
* [1] => Array ( [seq] => 2 [hid] => 2 [hobby] => basketball )
* [2] => Array ( [seq] => 3 [hid] => 3 [hobby] => coding )
* [3] => Array ( [seq] => 4 [hid] => 4 [hobby] => sleeping )
* )
*/
//注意fetch和fetchAll都有一个指针,对同一个结果集fetchAll之后(该指针指向结果集的末尾),再fetch则无法获取任何内容
echo "sequnce \\thid \\thobby".PHP_EOL;
echo "<br/>";
while($o = $sth->fetch(PDO::FETCH_ASSOC))
{
print_r($o);
echo $o['seq']." ".$o['hid']." ".$o['hobby']; echo "<br/>";
}
?>
让我们来看看代码1的输出结果:
- 注意留意代码<1>注释部分标明的ASSOC输出:
用fetchAll取出数据并存入$re数组中,用print_r()输出该数组得到:
Array (
[0] => Array ( [seq] => 1 [hid] => 1 [hobby] => shopping )
[1] => Array ( [seq] => 2 [hid] => 2 [hobby] => basketball )
[2] => Array ( [seq] => 3 [hid] => 3 [hobby] => coding )
[3] => Array ( [seq] => 4 [hid] => 4 [hobby] => sleeping )
)
可以看到ASSOC各式输出的是简单二维数组,所以在输出的时候我们使用【数组名+下标】的方式:如 $o[‘seq’]
为什么要注意这个呢?如果你还不太理解的话,不急,咱们来看下一段代码。
代码 <1.2>
利用OBJ格式读取数据库数据 (注:精髓都在注释里)
<?php
//结构化编程样例
$dbms='mysql'; //数据库类型
$host='localhost'; //数据库主机名
$dbName='n192204'; //使用的数据库
$user='A192204'; //数据库连接用户名
$pass='123456'; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
echo "connect successfully!<br/>";
/* 通过数组值向预处理语句传递值 */
$sth = $dbh->prepare('SELECT * FROM hobbyID WHERE seq > ?');
$sth->execute(array(0)); //返回一个PDOStatement结果集类
//注意,该数组array(0)是为了给sql语句中”?“部分赋值,在本代码中sql语句为:SELECT * FROM hobbyID WHERE seq > ?
//如果sql中有多个”?“,即有多个筛选参数值,那么该数组应该有相应多的元素
//用于查看预取到的数组
//$re=$sth->fetchAll(PDO::FETCH_OBJ);
//print_r($re);
/* OBJ格式输出结果:
* Array (
* [0] => stdClass Object ( [seq] => 1 [hid] => 1 [hobby] => shopping )
* [1] => stdClass Object ( [seq] => 2 [hid] => 2 [hobby] => basketball )
* [2] => stdClass Object ( [seq] => 3 [hid] => 3 [hobby] => coding )
* [3] => stdClass Object ( [seq] => 4 [hid] => 4 [hobby] => sleeping )
* )
*/
echo "sequnce \\thid \\thobby".PHP_EOL;
echo "<br/>";
while($o = $sth->fetch(PDO::FETCH_OBJ))
{
echo $o->seq." ".$o->hid." ".$o->hobby; echo "<br/>";
}
?>
让我们来看看代码2的输出结果:
- 注意留意代码<2>注释部分标明的OBJ输出:
用fetchAll取出数据并存入**$re数组**中,用print_r()输出该数组得到:
Array (
[0] => stdClass Object ( [seq] => 1 [hid] => 1 [hobby] => shopping )
[1] => stdClass Object ( [seq] => 2 [hid] => 2 [hobby] => basketball )
[2] => stdClass Object ( [seq] => 3 [hid] => 3 [hobby] => coding )
[3] => stdClass Object ( [seq] => 4 [hid] => 4 [hobby] => sleeping )
)
可以看到ASSOC各式输出的并不是简单二维数组! 而是stdClass类的对象组成的数组!所以在输出的时候我们使用引用对象变量的方式,即【->】,如 $o->seq
相信看到这里之后你应该理解了ASSOC格式和OBJ格式的区别,那就让我们进入到——面对对象编程!
2. 面对对象编程
代码 <2.1>
利用OBJ格式和ASSOC格式读取数据库数据(注:精髓都在注释里)
- 该代码比对了两种格式,以便于加深理解
<?php
class my_db{
private static $databases;
private $connection;
public function __construct($connDetails){
if(!is_object(self::$databases[$connDetails])){
list($host,$user,$pass,$dbname) = explode('|',$connDetails);
$dsn="mysql:host=$host;dbname=$dbname";
//$dsn = "mysql:host = $host;dbname = $dbname";注意该DSN语句不能写成这样!!即不能有空格!!!!!!!!
self::$databases[$connDetails]=new PDO($dsn,$user,$pass);
}
$this->connection=self::$databases[$connDetails];
}
public function fetchAll_test_ASSOC($sql){
$this->connection->query("set names gb2312");
$args=func_get_args();
$statement=$this->connection->prepare($sql);
$statement->execute();
return $statement->fetchAll(PDO::FETCH_ASSOC);
/* PDO::FETCH_ASSOC:
* 指定获取方式,将对应结果集中的每一行作为一个由列名索引的数组返回。
* 如果结果集中包含多个名称相同的列,则PDO::FETCH_ASSOC每个列名只返回一个值
*/
}
public function fetchAll_test_OBJ($sql){
$this->connection->query("set names gb2312");
$args=func_get_args();
$statement=$this->connection->prepare($sql);
$statement->execute();
return $statement->fetchAll(PDO::FETCH_OBJ);
/* PDO::FETCH_OBJ:
* 指定获取方式,将对应结果集中的每一行作为一个属性名对应列名的对象返回
*/
}
}
define('DB_MAIN','localhost|A192204|123456|n192204');
$db1=new my_db(DB_MAIN);
$row=$db1->fetchAll_test_ASSOC('select * from hobbyID');
//echo count($row);echo "<br/>";
print_r($row);
/* 利用ASSOC格式下的输出:
* Array (
* [0] => Array ( [seq] => 1 [hid] => 1 [hobby] => shopping )
* [1] => Array ( [seq] => 2 [hid] => 2 [hobby] => basketball )
* [2] => Array ( [seq] => 3 [hid] => 3 [hobby] => coding )
* [3] => Array ( [seq] => 4 [hid] => 4 [hobby] => sleeping )
* )
*/
$db2=new my_db(DB_MAIN);
$row=$db2->fetchAll_test_OBJ('select * from hobbyID');
//echo count($row);echo "<br/>";
print_r($row);
/* 利用OBJ格式输出结果:
* Array (
* [0] => stdClass Object ( [seq] => 1 [hid] => 1 [hobby] => shopping )
* [1] => stdClass Object ( [seq] => 2 [hid] => 2 [hobby] => basketball )
* [2] => stdClass Object ( [seq] => 3 [hid] => 3 [hobby] => coding )
* [3] => stdClass Object ( [seq] => 4 [hid] => 4 [hobby] => sleeping )
* )
*/
?>
- 结果已经写在注释里了就不在放图了,为大家节省流量【抱拳】
代码 <2.2>
利用OBJ格式读取数据库数据(注:精髓都在注释里)
- 该代码利用了PDO的子类MyPDO,MyPDO通过重写父类PDO的__construct($ options=null)、query($ query)、insecureQuery($ query)方法实现了更便捷的封装。
<?php
class MyPDO extends PDO{
const PARAM_host='localhost';
const PARAM_port='3306';
const PARAM_db_name='n192204';
const PARAM_user='A192204';
const PARAM_db_pass='123456';
public function __construct($options=null){
parent:: __construct('mysql:host='.MyPDO::PARAM_host. ';port='.MyPDO::PARAM_port. ';dbname='.MyPDO::PARAM_db_name,MyPDO::PARAM_user,MyPDO::PARAM_db_pass,$options);
}
public function query($query){
$args = func_get_args();
array_shift($args);
$reponse = parent::prepare($query);
$reponse->execute($args);
return $reponse;
}
public function insecureQuery($query){
return parent::query($query);
}
}
$db = new MyPDO();
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ);
$t1 = isset($_GET["seq"])?$_GET["seq"]:0;
$ret = $db->query("select * from hobbyID where seq > ?",$t1);
echo "sequnce \\thid \\thobby".PHP_EOL;
echo "<br/>";
/*
$o = $ret->fetchAll();
print_r($o);
以上语句会输出:
Array (
[0] => stdClass Object ( [seq] => 1 [hid] => 1 [hobby] => shopping )
[1] => stdClass Object ( [seq] => 2 [hid] => 2 [hobby] => basketball )
[2] => stdClass Object ( [seq] => 3 [hid] => 3 [hobby] => coding )
[3] => stdClass Object ( [seq] => 4 [hid] => 4 [hobby] => sleeping )
)
*/
while($o = $ret->fetch())
/*这里是没写预取到数组的格式,但在上面的代码中已经通过$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ)完成了设置
注:setAttribute的作用在我的上一篇文章也有讲解,点击本文开头第一个连接并Ctrl+F即可快速查看*/
{
echo $o->seq." ".$o->hid." ".$o->hobby; echo "<br/>";
}
?>
- 运行结果:
结束,撒花!
码字不易
若有幸有所帮助,不妨留下您的一键三联再走呐 o^ _ ^o
以上是关于利用PDO.so连接并读取Mysql数据库 核心代码实现讲解的主要内容,如果未能解决你的问题,请参考以下文章
php7.2安装pgsql和pdo_pgsql报错/usr/lib64/libldap_r-2.4.so.2: undefined symbol: ber_sockbuf_io_udp的处理...(代