【小白专用】PHP基础知识 - PHP 使用 PDO

1.2 PDO介绍

1.2.1 连接数据库方式

方法一:mysql扩展【这种方式php7已经淘汰】
方法二:mysqli扩展
方法三:PDO扩展

1.2.2 PDO介绍

PDO(PHP Data Object)扩展为PHP访问各种数据库提供了一个轻量级,一致性的接口。无论访问什么数据库,都可以通过一致性的接口去操作。

1.2.3 开启PDO扩展

开启PDO连接MySQL扩展,在php.ini文件里面.

extension=pdo_mysql

1.3 PDO核心类

1、PDO类:表示PHP和数据库之间的一个连接
2、PDOStatement 类
​ 第一:表示执行数据查询语句(select ,show)后的相关结果集
​ 第二:预处理对象
3、PDOException类:表示PDO的异常

1.4 实例化PDO对象

语法

1.4.1 DSN

DSN:data source name,数据源名称,包含的是连接数据库的信息,格式如下:

$dsn=数据库类型:host=主机地址;port=端口号;dbname=数据库名称;charset=字符集

数据库类型:

MySQL数据库	=>	mysql:
oracle数据库	=>	oci:
SQL Server 		=>sqlsrv:
具体驱动类型参见手册“PDO驱动”

1.4.2 实例化PDO

实例化PDO的过程就是连接数据库的过程

<?php
$dsn='mysql:host=localhost;port=3306;dbname=dbalisys;charset=utf8';
$pdo=new PDO($dsn,'root','a56');
var_dump($pdo); //object(PDO)#1 (0) { } 

?>

1.4.3 注意事项

1、如果连接的是本地数据库,host可以省略
<?php
$dsn='mysql:port=3306;dbname=data;charset=utf8';
$pdo=new PDO($dsn,'root','root');
var_dump($pdo); //object(PDO)#1 (0) { } 


2、如果使用的是3306端口,port可以省略

<?php
$dsn='mysql:dbname=data;charset=utf8';
$pdo=new PDO($dsn,'root','root');
var_dump($pdo); //object(PDO)#1 (0) { } 




3、charset也省略,如果省略,使用的是默认字符编码
<?php
$dsn='mysql:dbname=data';
$pdo=new PDO($dsn,'root','root');
var_dump($pdo); 


4、dbname也可以省略,如果省略就没有选择数据库
<?php
$dsn='mysql:';
$pdo=new PDO($dsn,'root','root');
var_dump($pdo); 

5、host、port、dbname、charset不区分大小写,没有先后顺序

6、驱动名称不能省略,冒号不能省略(因为冒号是驱动名组成部分),数据库驱动只能小写

1.5 使用PDO
1.5.1 执行数据操作语句
方法:p d o − > e x e c ( pdo->exec(pdo−>exec(sql),执行数据增、删、改语句,执行成功返回受影响的记录数,如果SQL语句错误返回false。
 

1.5.2 执行数据查询语句
方法:p d o − > q u e r y ( pdo->query(pdo−>query(sql),返回的是PDOStatement对象
 

<?php
$dsn='mysql:dbname=mysql;charset=utf8';
$pdo=new PDO($dsn,'root','alibaba123456');
//1、执行数据查询语句
$stmt=$pdo->query('select * from user');
//var_dump($stmt);        //object(PDOStatement)
//2、获取数据
//2.1  获取二维数组
//$rs=$stmt->fetchAll();  //默认返回关联和索引数组
//$rs=$stmt->fetchAll(PDO::FETCH_BOTH);     //返回关联和索引数组
//$rs=$stmt->fetchAll(PDO::FETCH_NUM);      //返回索引数组
//$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);    //返回关联数组
//$rs=$stmt->fetchAll(PDO::FETCH_OBJ);        //返回对象数组

//2.2  获取一维数组,匹配完成后指针下移一条
//$rs=$stmt->fetch();     //关联和索引数组
//$rs=$stmt->fetch(PDO::FETCH_NUM);   //索引数组
//例题:通过while循环获取所有数据
/*
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
    $rs[]=$row;
}
echo '<pre>';
var_dump($rs);
 */

//3.3  匹配列:匹配当前行的第n列,列的编号从0开始,匹配完毕后指针下移一条
//echo $stmt->fetchColumn();  //获取当前行的第0列
//echo $stmt->fetchColumn(1);  //获取当前行的第1列

//3.4  总行数,总列数
/*
echo '总行数:'.$stmt->rowCount(),'<br>';
echo '总列数:'.$stmt->columnCount();
*/

//3.5 遍历PDOStatement对象(PDOStatement对象是有迭代器的)
foreach($stmt as $row){
    echo $row['Host'],'-',$row['User'],'<br>';
}

1.7 单例模式封装MyPDO类

1.7.1 步骤

1、单例模式

2、初始化参数

3、连接数据库

4、执行增删改

5、执行查询

​ a)返回二维数组

​ b)返回一维数组

​ c)返回一行一列

1.7.2 代码实现

第一部分:单例、初始化参数、实例化PDO

<?php
class MyPDO{
    private $type;      //数据库类别
    private $host;      //主机地址
    private $port;      //端口号
    private $dbname;    //数据库名
    private $charset;   //字符集
    private $user;      //用户名
    private $pwd;       //密码
    private $pdo;       //保存PDO对象
    private static $instance;
    private function __construct($param) {
        $this->initParam($param);
        $this->initPDO();
    }
    private function __clone() {
    }
    public static function getInstance($param=array()){
        if(!self::$instance instanceof self)
            self::$instance=new self($param);
        return self::$instance;
    }
    //初始化参数
    private function initParam($param){
        $this->type=$param['type']??'mysql';
        $this->host=$param['host']??'127.0.0.1';
        $this->port=$param['port']??'3306';
        $this->dbname=$param['dbname']??'data';
        $this->charset=$param['charset']??'utf8';
        $this->user=$param['user']??'root';
        $this->pwd=$param['pwd']??'alibaba123456';
    }
    //初始化PDO
    private function initPDO(){
        try{
            $dsn="{$this->type}:host={$this->host};port={$this->port};dbname={$this->dbname};charset={$this->charset}";
            $this->pdo=new PDO($dsn, $this->user, $this->pwd);
        } catch (PDOException $ex) {
            echo '错误编号:'.$ex->getCode(),'<br>';
            echo '错误行号:'.$ex->getLine(),'<br>';
            echo '错误文件:'.$ex->getFile(),'<br>';
            echo '错误信息:'.$ex->getMessage(),'<br>';
            exit;
        }
    }



//显示异常
private function showException($ex,$sql=''){
    if($sql!=''){
        echo 'SQL语句执行失败<br>';
        echo '错误的SQL语句是:'.$sql,'<br>';
    }
    echo '错误编号:'.$ex->getCode(),'<br>';
    echo '错误行号:'.$ex->getLine(),'<br>';
    echo '错误文件:'.$ex->getFile(),'<br>';
    echo '错误信息:'.$ex->getMessage(),'<br>';
}
//设置异常模式
private function initException(){
    $this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}

//执行增、删、改操作
public function exec($sql){
    try{
        return $this->pdo->exec($sql);
    } catch (PDOException $ex) {
        $this->showException($ex, $sql);
        exit;
    }
}
//获取自动增长的编号
public function lastInsertId(){
    return $this->pdo->lastInsertId();
}



//判断匹配的类型
private function fetchType($type){
    switch ($type){
        case 'num':
            return PDO::FETCH_NUM;
        case 'both':
            return PDO::FETCH_BOTH;
        case 'obj':
            return PDO::FETCH_OBJ;
        default:
             return PDO::FETCH_ASSOC;
    }
}
//获取所有数据 ,返回二维数组
public function fetchAll($sql,$type='assoc'){
    try{
        $stmt=$this->pdo->query($sql);  //获取PDOStatement对象
        $type= $this->fetchType($type); //获取匹配方法
        return $stmt->fetchAll($type);
    } catch (Exception $ex) {
        $this->showException($ex, $sql);
    }
}




//获取一维数组
public function fetchRow($sql,$type='assoc'){
    try{
        $stmt=$this->pdo->query($sql);  //获取PDOStatement对象
        $type= $this->fetchType($type); //获取匹配方法
        return $stmt->fetch($type);
    } catch (Exception $ex) {
        $this->showException($ex, $sql);
        exit;
    }
}
//返回一行一列
public function fetchColumn($sql){
    try{
         $stmt=$this->pdo->query($sql);
        return $stmt->fetchColumn();
    } catch (Exception $ex) {
        $this->showException($ex, $sql);
        exit;
    }
    
}









}
//测试
$param=array(
   
);
$mypdo= MyPDO::getInstance($param);
//echo $mypdo->exec('delete from news where id=6');
/*
if($mypdo->exec("insert into news values (null,'11','1111',unix_timestamp())"))
    echo '自动增长的编号是:'.$mypdo->lastInsertId ();
 */

//$list=$mypdo->fetchAll('select * from news');
//$list=$mypdo->fetchRow('select * from news where id=1');
$list=$mypdo->fetchColumn('select count(*) from news');
echo '<pre>';
var_dump($list);

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Swoole来开发高性能的PHP网络应用程序。Swoole是一个PHP扩展,它提供了异步、并发和协程支持,可以大幅度提升PHP应用程序的性能和吞吐量。使用Swoole,可以轻松地开发出高并发的TCP/UDP服务器、HTTP服务器、WebSocket服务器等网络应用程序。同时,Swoole还提供了丰富的网络通信协议支持,如HTTP、WebSocket、Redis、MySQL、MongoDB等,可以方便地进行网络编程。 ### 回答2: PHP使用Swoole是指在PHP编程语言使用Swoole扩展库,Swoole是一个基于事件驱动的高性能网络通信引擎,它专门为PHP语言设计而成。通过在PHP使用Swoole,可以实现更高效的异步编程和多进程模型。 首先,PHP是一种脚本语言,通常情况下是通过Apache或Nginx等web服务器来解释执行。但是传统的PHP在处理高并发请求时存在性能瓶颈,每个请求都需要创建一个新的进程来处理。而使用Swoole可以将PHP变成一个异步非阻塞的服务器,通过事件驱动的方式实现高并发。 其次,PHP的传统模型是同步阻塞的,即每个请求需要等待前一个请求的处理完毕才能继续执行,这样会导致请求之间的处理速度较慢。而使用Swoole可以实现异步非阻塞的编程,每个请求可以独立处理,不会阻塞其他请求。 另外,使用Swoole还可以充分利用多核处理器的优势。传统的PHP在处理高并发请求时只能通过多进程的方式来提高并发能力,而使用Swoole可以通过多线程或协程的方式来实现,从而更好地利用多核处理器的性能。 总之,通过在PHP使用Swoole,可以提高PHP的性能和并发能力,实现更高效的编程和服务器架构设计。使用Swoole不仅可以实现更好的性能,还可以简化代码的编写和维护,提高开发效率。因此,在PHP开发使用Swoole是一种不错的选择。 ### 回答3: PHP 使用 Swoole 是一种基于事件驱动的高性能网络通信扩展库。它可以使 PHP 成为一种可编写高性能服务端应用程序的语言,提供了一些常用的网络协议如 TCP、UDP、HTTP、WebSocket 等的支持。 PHP 使用 Swoole 可以带来以下几个好处: 1. 高性能:Swoole 是用 C++ 编写的,通过异步、非阻塞的方式来处理网络请求,能够大幅提高服务器的并发处理能力,提供更高的吞吐量和低延迟。 2. 容易上手:Swoole 提供了简洁易用的 API,与传统的 PHP 开发方式兼容,开发者可以用类似传统 PHP 编程的方式来编写高性能的服务端应用程序。 3. 强大的功能支持:Swoole 提供了丰富的功能支持,如多进程/多线程模式、异步任务处理、进程间通信、数据库连接池、HTTP 服务器等。这些功能可以大大简化开发过程,提高开发效率。 4. 高可靠性:使用 Swoole 可以提供更稳定可靠的服务,因为其异步非阻塞的特性使得服务器能够更好地处理并发请求,避免出现服务阻塞或崩溃的问题。 5. 生态丰富:Swoole 生态圈相对成熟,拥有庞大的用户群体和活跃的社区,提供了大量的第三方扩展库和框架,可用于实现各种不同类型的应用。 总之,PHP 使用 Swoole 可以提供高性能、高可靠性以及丰富的功能支持,使 PHP 开发者能够更好地应对高并发、大流量的网络应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值