mysqli是专门访问MySQL数据库的,不能访问其它数据库。PDO可以访问多种的数据库,它把操作类合并在一起,做成一个数据访问抽象层,这个抽象层就是PDO,根据类操作对应的数据库。mysqli是一个类,PDO也是一个类,只不过PDO这个类功能更加强大。

PDO的功能
1.访问不同的数据库
2.自带事务功能。事务是指同时执行几条sql语句,但是其中1条语句出了错无法执行,那么所有的就都执行失败。
3.防止SQL注入攻击。

1.访问不同数据库

下面代码是访问MySQL数据库的,如果访问其它数据库,只需要在造对象中更改数据库驱动mysql,换成其它数据库的驱动。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head> <body>
<?php
//PDO的用法
//1.造对象
$dsn = "mysql:dbname=text1;host=localhost";
//mysql是指MySQL数据库的驱动名,加上冒号,冒号后面是数据库的名称。
//host是服务器的地址,为localhost。
//如果要使用其它数据库,要更改数据库的驱动名。可以从php手册开面找。
//写的驱动一定是配好环境的驱动。可以在浏览器地址栏里输入服务器地址localhost查找支持的数据库驱动。
$pdo = new PDO($dsn,"root","666");
//参数:1.服务器的地址2.数据库的名称3.服务器密码 //写sql语句
$sql = "update nation set name='兽族' where code='n003'"; //执行sql语句
//$r = $pdo->exec($sql);//返回受影响的条数
?>
</body>
</html>

2.事务功能

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head> <body>
<?php
//1.造对象
$dsn = "mysql:dbname=text1;host=localhost";
$pdo = new PDO($dsn,"root","666"); //设置异常模式,如果出现错误,抛个异常出来。2个参数不要加双引号。
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //写sql语句
$sql1 = "insert into nation values('noo5','人族')";
$sql2 = "insert into nation values('noo6','精灵族')"; //执行2条sql语句
try//try代表加事务
{
$pdo->beginTransaction();//启动事务 $pdo->exec($sql1);
$pdo->exec($sql2); $pdo->commit();//提交事务
}
catch(PDOException $e)//抓住出现的异常。$e代表抓住的异常,异常保存在$e里面。
{
//$e->getMessage();//获取错误信息。
$pdo->rollBack();//回滚,如果一个地方出现错误,回到总体操作之前。
} ?>
</body>
</html>

3.防止注入

(1)占位方式为?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head> <body>
<?php
//防止sql注入 //1.造对象
$dsn = "mysql:dbname=text1;host=localhost";
$pdo = new PDO($dsn,"root","666"); //写sql语句,预处理语句。
$sql = "insert into nation values(?,?)";//变量先不写,先用?占住位置。先把这条语句发过去。 //准备sql语句,返回statement对象。
$st = $pdo->prepare($sql); /*//绑定参数
$st->bindParam(1,$code);//从1开始索引。
$st->bindParam(2,$name); $code="n002";//也可以在前面赋值。
$name="矮人族"; //提交执行
$st->execute();//调用这个方法就可以执行了,括号里面不用给sql语句了,sql语句已经传过去了。
*/ $attr = array("n007","魔族");//造一个数组,数组里面要和添加的内容对应起来。这2行相当于上面/**/标记的4行内容。 //提交执行
$st->execute($attr);//直接把数组放在执行的里面。 //预处理里面用?占位的,给数组的时候要给索引数组,并且数组里的内容要和要添加的内容对应起来。 ?>
</body>
</html>

(2)占位方式为name

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head> <body>
<?php
//防止sql注入 //1.造对象
$dsn = "mysql:dbname=text1;host=localhost";
$pdo = new PDO($dsn,"root","666"); //写sql语句,预处理语句。使用name占位。
$sql = "insert into nation values(:code,:name)";//前面要加冒号,不加冒号会被当成普通的变量 //准备执行
$st = $pdo->prepare($sql); /*//绑定参数
$st->bindParam(":code",$code,PDO::PARAM_STR);//PDO::PARAM_STR表示必须是一个字符串
$st->bindParam(":name",$name,PDO::PARAM_STR); $code="no12";
$name="狼族"; //执行
$st->execute();*/ $attr = array("code"=>"n025","name"=>"虫族");//name占位,要用关联数组。 //执行
$st->execute($attr); ?>
</body>
</html>

4.读取数据

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head> <body>
<?php
//1.造对象
$dsn = "mysql:dbname=text1;host=localhost";
$pdo = new PDO($dsn,"root","666"); //写sql语句,预处理语句。使用name占位。
$sql = "select * from nation";//前面要加冒号,不加冒号会被当成普通的变量 //准备执行
$st = $pdo->prepare($sql); //执行
$st->execute(); //读数据
//var_dump($st->fetch());//输出结果为第一条,可以用while循环全部读取出来。
//var_dump($st->fetch(PDO::FETCH_ASSOC));//输出的是关联数组
//var_dump($st->fetch());//输出二维数组
//var_dump($st->fetch(PDO::FETCH_ASSOC));//输出关联的二维数组
?>
</body>
</html>

PDO访问方式操作数据库的更多相关文章

  1. 11月7日下午PHP----PDO访问方式操作数据库

    MySQLI是专门访问MySQL数据库的,不能访问其它数据库.PDO可以访问多种的数据库,它把操作类合并在一起,做成一个数据访问抽象层,这个抽象层就是PDO,根据类操作对应的数据库.mysqli是一个 ...

  2. Win10 64位系统ADO方式操作数据库失败解决方法

    VC操作Access数据库一般通过ODBC.ADO.DAO等方式,但在我的Win10 64位操作系统中,通过ADO方式操作数据库会失败,无法读取数据.解决方法:1.首先确保Win10操作系统ado目录 ...

  3. python_协程方式操作数据库

    # !/usr/bin/python3 # -*- coding: utf-8 -*- import requests import gevent import pymysql from gevent ...

  4. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

  5. 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...

  6. 作用JavaScript访问和操作数据库

    JS操作 Access 数据库 <SCRIPT LANGUAGE="JavaScript"> <!-- var filePath = location.href. ...

  7. 九、.net core用orm继承DbContext(数据库上下文)方式操作数据库

    一.创建一个DataContext普通类继承DbContext  安装程序集:Pomelo.EntityFrameworkCore.MySql   二.配置连接字符串(MySql/SqlServer都 ...

  8. JDBC方式操作数据库

    1.读取配置文件,我将配置信息写入配置文件(.properties)中,方便后期数据库变更后或者其他项目使用,扩展性好些,尽量避免硬编码. driver=oracle.jdbc.driver.Orac ...

  9. MFC,ADO方式实现数据库操作

    参考: MSDN数据访问编程 (MFC/ATL): https://msdn.microsoft.com/zh-cn/library/kd4ck1tt.aspx?f=255&MSPPError ...

随机推荐

  1. linux smem 查看各进程使用memory情况

    SMEM(8) SMEM(8) NAME smem - Report memory usage with shared memory divided proportionally. SYNOPSIS ...

  2. 使用Vundle管理Vim插件

    附:仓库地址 附:我自用的vim配置文件,里面注释很多,仅供参考. Vundle是一款Vim的插件管理软件(Linux),用起来很方便的原因有几点: 支持插件超多,可以来源于github.Vundle ...

  3. Springboot+RestTemplate 简单使用

        spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值 ...

  4. list(range())--------range创建一个list列表 遍历索引range(len()) 和 list(range())创建列表

    lst = list(range(15,26)) #注,list(range())用的是小括号哦print(lst)

  5. 手写阻塞队列(Condition实现)

    自己实现阻塞队列的话可以采用Object下的wait和notify方法,也可以使用Lock锁提供的Condition来实现,本文就是自己手撸的一个简单的阻塞队列,部分借鉴了JDK的源码.Ps:最近看面 ...

  6. [T-ARA][Goodbye, OK]

    歌词来源:http://music.163.com/#/song?id=22704437 作曲 : 안영민 , 이유진 [作曲 : a-nyeong-min , i-yu-jin] 作词 : 안영민 ...

  7. 取消centOS7虚拟机锁屏

    https://blog.csdn.net/ViJayThresh/article/details/81076622

  8. MongoDb 物理位置应用实现

    1代码实现 官方驱动2.7版本 1.1范围查找 /// <summary> /// 半径范围查找位置信息 /// </summary> /// <param name=& ...

  9. 8、Android---探究服务

    8.1.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案 非常适合执行那些不需要和用户交互而且要求长期的任务 服务的运行不依赖于任何用户界面 即使程序被切换到后台 或者用 ...

  10. JDBC通过配置文件(properites)读取数据库配置信息

    扫盲: Classloader 类加载器,用来加载 Java 类到 Java 虚拟机中.与普通程序不同的是.Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM( ...