>백엔드 개발 >PHP 튜토리얼 >PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

王林
王林앞으로
2019-08-26 11:02:193877검색

PDO—데이터베이스 추상화 계층

소개: PDO 확장은 PHP가 데이터베이스에 액세스할 수 있는 가볍고 일관된 인터페이스를 정의하여 일관성 없는 데이터베이스 연결 문제를 해결합니다.

1. PDO 소개

이 장에서는 주로 PDO의 설치 및 구성, PDO를 사용하여 데이터베이스에 연결하는 방법을 소개합니다.

1-1 PDO 소개

PDO는 PHP Data Object의 약자로 PHP5.1 버전과 함께 출시되었습니다. 현재 지원되는 데이터베이스로는 Firebird, FreeTDS, Interbase, MySQL, MS SQL Server, ODBC, Oracle이 있습니다. , Postgre SQL, SQLite 및 Sybase. 서로 다른 데이터베이스를 운영하는 경우 PDO의 DSN(데이터베이스 소스)만 수정하면 PDO의 통합 인터페이스를 사용하여 작동할 수 있습니다.

PDO 기능:

코딩 일관성: PDO는 다양한 데이터베이스에 사용할 수 있는 단일 인터페이스를 제공합니다.

유연성: PDO는 런타임에 데이터베이스 드라이버를 로드해야 하므로 데이터베이스가 업데이트될 때마다 이를 재구성할 필요가 없습니다. PHP를 사용하고 재컴파일

고성능: PDO는 C 언어로 작성되어 PHP로 컴파일됩니다. PHP로 작성된 다른 솔루션과 비교하면 다른 기능은 동일하지만 더 높은 성능을 제공합니다

객체 지향 기능: PDO는 PHP5의 객체 지향 기능을 사용하면 보다 효율적인 데이터베이스 통신을 달성할 수 있습니다.

참고: PDO 확장은 추상적인 인터페이스 계층일 뿐입니다. PDO 확장 자체를 사용하면 해당 특성을 표현하기 위해 특성 형식을 사용해야 합니다.

PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

1-2 PDO 구성 및 활성화

PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

1-3 PDO 연결 데이터베이스로

PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

1. 매개변수를 통해 데이터베이스에 연결합니다(이 방법 숙달에 집중하세요)

//通过参数形式连接数据库
try{
 $dsn='mysql:host=localhost;dbname=school';
 $username='root';
 $password='root';
 $pdo=new PDO($dsn,$username,$password);
 var_dump($pdo);
}catch (PDOException $e){
    echo $e->getMessage();
};

需要注意:dsn是你的数据源

输出结果:object(PDO)#1 (0) { }

2. PDO 객체 사용

主要介绍PDO对象方法的使用。

2-1 [PDO] exec()方法执行建表操作   PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

<?php
try{
    //驱动器的名称 mysql
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    //exec():执行一条sql语句并返回其受影响的行数;如果没有受影响的记录,它返回0
    //exec对于select没有作用
    //PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,
    //如果用传统的输出方法 ——按字符串输出的话,
    //肯定要有大量的转义符来对字符串中的引号等特殊字符进行转义,以免出现语法错误。
    //如果是一两处还可以容忍,但是要是一个完整的 html文本或者是一个200行的js我想是谁都会崩溃的。
    //这就是PHP为什么要引入一个定界符的原因——至少一大部分原因是这样的。

    /*    1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;
    2.在PHP定界符中的任何特殊字符都不需要转义;
    3.PHP定界符中的PHP变量会被正常的用其值来替换。
        PHP中的定界符格式是这样的:
    <<<Eof
    ……
    Eof;*/
    $sql=<<<EOF
    create table if not exists t_teacher(
   id int UNSIGNED auto_increment primary key,
   teaname varchar(20) not null UNIQUE,
   pwd char(32) not null,
   email varchar(30) not null
);
EOF;
   $res= $pdo->exec($sql);
    var_dump($res);
}catch (PDOException $e){
    echo $e->getMessage();
};

输出结果:int(0);

2-2 [PDO] exec()方法执行插入记录操作 

续上面:插入一条或多条记录

<?php
try{
    //驱动器的名称 mysql
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    $sql=&#39;insert into t_teacher values(default,"king5","&#39;.md5(&#39;king&#39;).&#39;","waly@qq.com");&#39;;
    $res=$pdo->exec($sql);
    echo $res;
}catch (PDOException $e){
    echo $e->getMessage();
};
<?php
try{
    //驱动器的名称 mysql
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    //$sql=&#39;insert into t_teacher values(default,"king6","&#39;.md5(&#39;king&#39;).&#39;","waly@qq.com");&#39;;
   $sql=<<<EOF
      insert into t_teacher values
      (default,"king7","&#39;.md5(&#39;king&#39;).&#39;","waly@qq.com"),
      (default,"king8","&#39;.md5(&#39;king&#39;).&#39;","waly@qq.com"),
      (default,"king9","&#39;.md5(&#39;king&#39;).&#39;","waly@qq.com")
EOF;

    $res=$pdo->exec($sql);
    echo &#39;受影响的记录的条数为:&#39;. $res."<br/>";
    //$pdo->lastInsertId():得到新插入记录的ID号
    //echo &#39;最后插入的ID号为:&#39;.$pdo->lastInsertId();
}catch (PDOException $e){
    echo $e->getMessage();
};

2-3 [PDO] exec()方法执行其他SQL操作

PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

本身是king,修改为king,会是0条记录被影响.

lastInsertId() 只能对插入有影响。

exec()对查询无作用

2-4 [PDO] errorCode()和errorInfo()方法查看错误信息 

<?php
try{
    //驱动器的名称 mysql
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
   //错误的表名
    $sql=&#39;insert into t_teacher1 values(default,"king6","&#39;.md5(&#39;king&#39;).&#39;","waly@qq.com");&#39;;
    $res=$pdo->exec($sql);
    if($res===false){
        //$pdo->errorCode(); SQLSTATE的值
        echo $pdo->errorCode();
        echo &#39;<hr/>&#39;;
      //$pdo->errorInfo():返回的错误信息的数组,数组中包含3个单元
     //0=>SQLSTATE(错误编号),1=>CODE(错误码),2=>INFO(错误信息)
        $errInfo=$pdo->errorInfo();
        print_r($errInfo);
    }
}catch (PDOException $e){
    echo $e->getMessage();
};

2-5 [PDO] query()方法执行查询语句

<?php
try{
    //驱动器的名称 mysql
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    //查询一条记录
    //$sql=&#39;select * from t_teacher where id=5&#39;;
    //查询多条记录
    $sql=&#39;select * from t_teacher&#39;;
    //$pdo->query($sql):执行sql语句,返回PDOStatement对象:需要遍历这个对象,将里面的内容取出来
    $stmt=$pdo->query($sql);
    var_dump($stmt); //只能看出这个语句返回的是一个对象
    echo &#39;<hr/>&#39;;
    foreach ($stmt as $row){
        print_r($row);
        echo &#39;<hr/>&#39;;
        echo &#39;编号:&#39;.$row[&#39;id&#39;].&#39;<br/>&#39;;
        echo &#39;用户名:&#39;.$row[&#39;teaname&#39;].&#39;<br/>&#39;;
        echo &#39;邮箱:&#39;.$row[&#39;email&#39;].&#39;<br/>&#39;;
        echo &#39;<hr/>&#39;;
    }
}catch (PDOException $e){
    echo $e->getMessage();
};
Query()用于插入数据

<?php
try{
    //驱动器的名称 mysql
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    //插入一条记录
    $sql=&#39;insert into t_teacher values(default,"king12","&#39;.md5(&#39;king&#39;).&#39;","waly@qq.com");&#39;;
    //$pdo->query($sql):执行sql语句,返回PDOStatement对象:需要遍历这个对象,将里面的内容取出来
    $stmt=$pdo->query($sql);
    var_dump($stmt); //只能看出这个语句返回的是一个对象
}catch (PDOException $e){
    echo $e->getMessage();
};

注意:更多的用query()查询数据,用exec()实现增删改

2-6 [PDO] prepare()和execute()方法执行查询语句 

PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

<?php

//查询单条语句

try{
    //驱动器的名称 mysql
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    //查询一条记录
   $sql=&#39;select * from t_teacher where id=5&#39;;
   //$pdo->prepare($sql);准备sql语句
    $stmt=$pdo->prepare($sql);
    //execute():执行预处理语句
    $res=$stmt->execute();
    //var_dump($res); //会返回bool(true)
    //查数据使用
    //fetch():得到结果集中的一条记录(作为索引+关联样式返回)
    $row=$stmt->fetch();
    print_r($row);
}catch (PDOException $e){
    echo $e->getMessage();
};
<?php
try{
    //驱动器的名称 mysql
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    //查询多条记录
    $sql=&#39;select * from t_teacher&#39;;
    //$pdo->prepare($sql);准备sql语句
    $stmt=$pdo->prepare($sql);
    //execute():执行预处理语句
    $res=$stmt->execute();
    //var_dump($res); //会返回bool(true)
    //查数据使用
    //fetch():得到结果集中的一条记录(作为索引+关联数组)
    /*if($res){
        while ($row=$stmt->fetch()){
            print_r($row);
            echo &#39;<hr/>&#39;;
        }
    }*/
    //fetchAll() 查询所有记录,以二维数组(索引+关联方式)
 $rows=$stmt->fetchAll();
print_r($rows);
}catch (PDOException $e){
    echo $e->getMessage();
};

指定类型:我们更多的是想得到关联数组,我们可以通过两种方式来获得,第一种方式:设置其取回数据的方式(设置参数、常量);第二种方式:通过方法

三、 PDOStatement对象的使用

本章主要介绍PDOStatement对象方法的使用,以及参数的绑定与预处识。

PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

3-1 [PDO] quote()方法防止SQL注入

带条件查询 登录实现的例子

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
$username=$_POST[&#39;username&#39;];
$password=$_POST[&#39;password&#39;];
try{
    //连接数据库
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    //向数据库表查找对应的用户信息//如果存在,证明有这个用户,登录成功;否则登录失败
    //输入 &#39;or 1=1 # 可以查看查到的数据
    //$sql="select * from t_user WHERE `name`=&#39;{$username}&#39; AND  `password`=&#39;{$password}&#39;";    //通过quote():返回带引号的字符串,过滤字符串中的特殊字符
    $username=$pdo->quote($username);
    $sql="select * from t_user WHERE `name`={$username} AND  `password`={$password}";
    echo $sql;
    $stmt=$pdo->query($sql);
    //PDOStatement对象的方法:rowCount() :对于select操作返回的结果集中记录的条数,
    //对于INSERT、UPDATE、DELETE返回受影响的记录的条数
    echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}

3-2 [PDO] 预处理语句中的占位符的使用 

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
$username=$_POST[&#39;username&#39;];
$password=$_POST[&#39;password&#39;];
try{
    //连接数据库
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    //占位符有两种方法
    //第一种方法
    $sql="select * from t_user WHERE `name`=:username and  `password`=:password";
    $stmt=$pdo->prepare($sql);
$stmt->execute(array(":username"=>$username,":password"=>$password));
    //PDOStatement对象的方法:rowCount() :对于select操作返回的结果集中记录的条数,
    //对于INSERT、UPDATE、DELETE返回受影响的记录的条数
   echo $stmt->rowCount();
    //第二种方法
    $sql="select * from t_user WHERE `name`=? and  `password`=?";
    $stmt=$pdo->prepare($sql);
    $stmt->execute(array($username,$password));
    echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}

3-3 [PDO] bindParam()方法绑定参数

两种方式:命名参数占位符,问号方式

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
try{
    //连接数据库
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
   // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
    $sql="insert into t_user VALUES (DEFAULT ,:username,:password,:sex)";
    $stmt=$pdo->prepare($sql);
    $stmt->bindParam(":username",$username,PDO::PARAM_STR);
    $stmt->bindParam(":password",$password,PDO::PARAM_STR);
    $stmt->bindParam(":sex",$sex,PDO::PARAM_STR);
    $username=&#39;张三&#39;;
    $password=&#39;123654&#39;;
    $sex=&#39;M&#39;;
   $stmt->execute();
   echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}
<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
try{
    //连接数据库
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
    $sql="insert into t_user VALUES (DEFAULT ,?,?,?)";
    $stmt=$pdo->prepare($sql);
    $stmt->bindParam(1,$username);
    $stmt->bindParam(2,$password);
    $stmt->bindParam(3,$sex);
    $username=&#39;张三1&#39;;
    $password=&#39;1236541&#39;;
    $sex=&#39;F&#39;;
    $stmt->execute();
    echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}

3-4 [PDO] bindValue()方法绑定参数

向用户表插入数据:命名参数占位符,问号方式类似

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
try{
    //连接数据库
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
    $sql="insert into t_user VALUES (DEFAULT ,?,?,?)";
    $stmt=$pdo->prepare($sql);
    $username=&#39;李四&#39;;
    $password=&#39;123654&#39;;
    $stmt->bindValue(1,$username);
    $stmt->bindValue(2,$password);
    $stmt->bindValue(3,&#39;M&#39;);
    $stmt->execute();
    echo $stmt->rowCount();
    $username=&#39;李四1&#39;;
    $password=&#39;1236541&#39;;
    $stmt->bindValue(1,$username);
    $stmt->bindValue(2,$password);
    $stmt->bindValue(3,&#39;M&#39;);
    $stmt->execute();
    echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}

3-5 [PDO] bindColumn()方法绑定参数 

PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
try{
    //连接数据库
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
    $sql="select `name`,`password`,`sex` from t_user";
    $stmt=$pdo->prepare($sql);
    $stmt->execute();

  echo &#39;结果集中的列数一共有:&#39;.$stmt->columnCount();

    echo "<hr/>";

    print_r($stmt->getColumnMeta(0));
    $stmt->bindColumn(1,$username);
    $stmt->bindColumn(2,$password);
    $stmt->bindColumn(3,$sex);
    while ($stmt->fetch(PDO::FETCH_BOUND)){
      echo &#39;用户名:&#39;.$username."-密码:".$password."-性别:".$sex."<hr/>";
    }
    echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}

3-6 [PDO] fetchColumn()方法从结果集中返回一列 

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
try{
    //连接数据库
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);    $sql="select `name`,`password`,`sex` from t_user";
    $stmt=$pdo->query($sql);
    //索引默认从0开始
    echo $stmt->fetchColumn(0),"<br/>";
    echo $stmt->fetchColumn(1),"<br/>";
    echo $stmt->fetchColumn(2);
}catch (PDOException $e){
    echo $e->getMessage();
}

3-7 [PDO] debugDumpParams()方法打印一条预处理语句 

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
try{
    //连接数据库
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
    $sql="insert into t_user VALUES (DEFAULT ,:username,:password,:sex)";
    $stmt=$pdo->prepare($sql);
    $stmt->bindParam(":username",$username,PDO::PARAM_STR);
    $stmt->bindParam(":password",$password,PDO::PARAM_STR);
    $stmt->bindParam(":sex",$sex,PDO::PARAM_STR);
    $username=&#39;张三&#39;;
    $password=&#39;123654&#39;;
    $sex=&#39;M&#39;;
    $stmt->execute();
    $stmt->debugDumpParams();
}catch (PDOException $e){
    echo $e->getMessage();
}

四、PDO事务处理

主要介绍如何使用PDO进行事务处理

4-1 PDO错误处理模式

3种错误处理模式

静默模式

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
 /*PDO::ERRMODE_SLIENT:默认模式,静默模式*/
try{
    //连接数据库
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
    $sql="select * from nonet_user";
    $stmt=$pdo->query($sql);
    echo $pdo->errorCode();
    echo &#39;<br/>&#39;;
    echo $pdo->errorInfo();
}catch (PDOException $e){
    echo $e->getMessage();
}
<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
 /*PDO::ERRMODE_SLIENT:默认模式,静默模式
 *PDO::ERRMODE_WARNING:警告模式
  * PDO::ERRMODE_EXCEPTION:异常模式
 */
try{
    //连接数据库
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;);
   //设置警告模式
    //$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
    //设置异常模式:推荐使用
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $sql="select * from nonet_user";
    $stmt=$pdo->query($sql);
    echo $pdo->errorCode();
    echo &#39;<br/>&#39;;
    echo $pdo->errorInfo();
}catch (PDOException $e){
    echo $e->getMessage();
}

4-2 PDO事务处理 

PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
try{
    $option=array(PDO::ATTR_AUTOCOMMIT,0);
    $pdo=new PDO(&#39;mysql:host=localhost;dbname=school&#39;,&#39;root&#39;,&#39;root&#39;,$option);
//开启事务
    $pdo->beginTransaction();
    var_dump($pdo->inTransaction());
    $sql="update account set money=money-200  WHERE username=&#39;king&#39;";
    $res=$pdo->exec($sql);
    if($res==0){
        throw new PDOException(&#39;转账失败&#39;);
    }
    $res1=$pdo->exec(&#39;update account set money=money+200  WHERE username="queen"&#39;);
    if($res1==0){
        throw new PDOException(&#39;接收失败&#39;);
    }
    $pdo->commit();
}catch (PDOException $e){
    $pdo->rollBack();
    echo $e->getMessage();
}

好了,以上就是关于本文介绍的关于PHP中PDO操作数据库的详细操作以及实例了,相了解更多相关问题请访问PHP中文网:

PHP视频教程

위 내용은 PHP에서 PDO를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 자습서 및 실제 데모의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제