利用PDO.so连接并读取Mysql数据库 核心代码实现讲解

Pre. 准备

利用PDO.so连接数据库并读取Mysql数据库数据有两种编程方式可以考虑:

  1. 结构化编程,即面向过程编程(适合基础理解)
  2. 面向对象编程(推荐使用)

在开始之前,需要格外注意的是从结果集中取出数组的格式!因为这关乎到如何从由结果集fetch出的数组中取出数据!

本文详细讲解两种格式:

  1. PDO::FETCH_ASSOC
  2. PDO::FETCH_OBJ

本文采用的数据表样例信息如下:

  • 数据表结构:
    在这里插入图片描述
  • 数据表内容:
    在这里插入图片描述

测试连接

随手附上一个测试连接的代码(看不懂没关系,先往下看):

<?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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狱典司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值