php之PDO连接mysql数据库,增删改查等等操作实例
我们使用传统的 mysql_connect 、mysql_query方法来连接查询数据库时,如果过滤不严就有SQL注入风险,导致网站被攻击。
虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷。
而使用PHP的PDO扩展的 prepare 方法,就可以避免sql injection 风险。
PDO(PHP Data Object) 是PHP5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理.
如 php_mysql.dll。 PHP6中也将默认使用PDO的方式连接,mysql扩展将被作为辅助 。
官方:http://php.net/manual/en/book.pdo.php
1、使用PDO连接前需要先确认PDO扩展是否已经打开。
使用PDO扩展之前,先要启用这个扩展,PHP.ini中。
去掉"extension=php_pdo.dll"前面的";"号,若要连接数据库,还需要去掉与PDO相关的数据库扩展前面的";"号。
(一般用的是php_pdo_mysql.dll),然后重启Apache服务器即可。
extension=php_pdo.dll
extension=php_pdo_mysql.dll
2、PDO连接数据库:
class MysqlPdo
{
private $config = [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'test',
// 用户名
'username' => 'root',
// 密码
'password' => 'root',
// 端口
'hostport' => '3306',
// 数据库编码默认采用utf8
'charset' => 'utf8',
];
private $pdo;
public function __construct()
{
$dsn = "{$this->config['type']}:host={$this->config['hostname']};";
$dsn.= "dbname={$this->config['database']};charset={$this->config['charset']}";
$pdo = new PDO($dsn, $this->config['username'], $this->config['password']);
$pdo->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$this->pdo = $pdo;
unset($dsn);
}
public function select($sql = '')
{
$res = $this->pdo->query($sql);
$res = $res->fetchAll(PDO::FETCH_ASSOC);
return $res;
}
}
3、PDO设置属性:
PDO有三种错误处理方式:
1、PDO::ERrmODE_SILENT 不显示错误信息,只设置错误码
2、PDO::ERrmODE_WARNING 显示警告错
3、PDO::ERrmODE_EXCEPTION 抛出异常
1
$pdo->setAttribute(\PDO::ATTR_ERrmODE, \PDO::ERrmODE_EXCEPTION);
1) :当设置为PDO::ERrmODE_SILENT时可以通过调用errorCode() 或errorInfo()来获得错误信息,当然其他情况下也可以。
2) :因为不同数据库对返回的字段名称大小写处理不同,所以PDO提供了PDO::ATTR_CASE设置项(包括PDO::CASE_LOWER,PDO::CASE_NATURAL,PDO::CASE_UPPER),来确定返回的字段名称的大小写。
3) :通过设置PDO::ATTR_ORACLE_NULLS类型(包括PDO::NULL_NATURAL,PDO::NULL_EmpTY_STRING,PDO::NULL_TO_STRING)来指定数据库返回的NULL值在php中对应的数值。
4、PDO常用方法及其应用:
PDO::query() 主要是用于有记录结果返回的操作,特别是SELECT操作
PDO::exec() 主要是针对没有结果集合返回的操作,如INSERT、UPDATE等操作
PDO::prepare() 主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大(防止sql注入就靠这个)
PDO::lastInsertId() 返回上次插入操作,主键列类型是自增的最后的自增ID
PDOStatement::fetch() 是用来获取一条记录
PDOStatement::fetchAll() 是获取所有记录集到一个集合
PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段
PDOStatement::rowCount() 主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。
5、PDO操作实例:
【示例6,说明】,防sql注入操作:
1、使用PDO访问MySQL数据库时,真正的real prepared statements 默认情况下是不使用的。
为了解决这个问题,你必须禁用 prepared statements的仿真效果。
2、设置禁用prepared statements:$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
它会告诉PDO禁用模拟预处理语句,并使用 real parepared statements 。
这可以确保SQL语句和相应的值在传递到mysql服务器之前是不会被PHP解析的(禁止了所有可能的恶意SQL注入攻击)。
虽然你可以配置文件中设置字符集的属性(charset=utf8),但是需要格外注意的是,老版本的 PHP( < 5.3.6)在DSN中是忽略字符参数的。
但是我们需要注意以下几种情况,PDO并不能帮助我们防范SQL注入的:
1、你不能让占位符 ? 代替一组值,如:
select * from xc_company where id in( ? );
2、你不能让占位符代替数据表名或列名,如:
select * from xc_company order by ?;
3、你不能让占位符 ? 代替任何其他SQL语法,如:
select EXTRACT( ? from date) as times from xc_company;
查看PDO都有那些方法
echo '<pre>';
print_r(get_class_methods('PDO'));
echo '</pre>';
结果:
Array
(
[0] => __construct
[1] => prepare
[2] => beginTransaction
[3] => commit
[4] => rollBack
[5] => inTransaction
[6] => setAttribute
[7] => exec
[8] => query
[9] => lastInsertId
[10] => errorCode
[11] => errorInfo
[12] => getAttribute
[13] => quote
[14] => __wakeup
[15] => __sleep
[16] => getAvailableDrivers
)
常用实例源码:
<?php # 【PDO连接mysql数据库】(数据库名:lmgg ,账户:root,密码:root)
$pdo = new \PDO('mysql:host=localhost;dbname=lmgg;charset=utf8','root','root');
# 设置数据库编码为utf-8(防止乱码)当然上面的连接设置了。
# 上面可设置也可不设置,有没有charset=utf8都可以连接上数据库
$pdo->exec('set names utf8'); # 【示例1:查询数据】:查询company表中的id和name字段。存到$data数组中去
$res = $pdo->query("select id,name from xc_company");
$data = []; # 1:FETCH_ASSOC 关联数组形式返回
# 2:FETCH_NUM 数字索引数组形式返回
# 设置返回数据类型方法1:
$res->setFetchMode(\PDO::FETCH_NUM);
while($row = $res->fetch()){
$data[] = $row;
}
echo '<pre>';
print_r($data);
echo '</pre>'; # 设置返回数据类型方法2:
while($row = $res->fetch(\PDO::FETCH_ASSOC)){
$data[] = $row;
}
echo '<pre>';
print_r($data);
echo '</pre>'; # 【示例2:添加数据】:添加数据到company表中,并返回数据在表中的ID是多少!
$res = $pdo->exec("insert into xc_company(name) values('小川编程添加111')");
if($res){
echo '11添加成功数据ID为:'.$pdo->lastinsertid().'<br/>';
}
$res = $pdo->query("insert into xc_company(name) values('小川编程添加222')");
if($res){
echo '22添加成功数据ID为:'.$pdo->lastinsertid().'<br/>';
} # 【示例3:更新数据】:
$res = $pdo->exec("update xc_company set name='小川编程更新111' where id=26");
if($res){
echo '更新数据成功<br/>';
}
$res = $pdo->query("update xc_company set name='小川编程更新222' where id=26");
if($res){
echo '成功更新数据【'.$res->rowCount().'】条<br/>';
} # 【示例4:删除数据】:
$res = $pdo->exec("delete from xc_company where id=38");
if($res){
echo '删除数据成功<br/>';
}
$res = $pdo->query("delete from xc_company where id=38");
if($res){
echo '成功删除数据【'.$res->rowCount().'】条<br/>';
} # 【示例5:统计数据】:统计company表有多少条数据
$num = $pdo->query("select count(*) from xc_company");
echo '共有数据:【'.$num->fetchColumn().'】条'; # 【示例6:防sql注入】:实例,使用前先看文字说明,会理解的更透彻!
# PDO连接mysql数据库(数据库名:lmgg ,账户:root,密码:root)
$pdo = new \PDO("mysql:host=localhost; dbname=lmgg", "root", "root");
# 禁用prepared statements的仿真效果
$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
$pdo->query("set names 'utf8'");
$sql="select * from xc_company where name = ?";
$res = $pdo->prepare($sql);
$name = '小川编程';
$exeres = $res->execute(array($name));
$data = [];
if($exeres){
while ($row = $res->fetch(\PDO::FETCH_ASSOC)){
$data[] = $row;
}
}
echo '<pre>';
print_r($data);
echo '</pre>';
$pdo = null; ?>
$dsn= "{$this->config['type']}:host={$this->config['hostname']};";
$dsn.= "dbname={$this->config['database']};charset={$this->config['charset']}";
$pdo = new PDO($dsn, $this->config['username'], $this->config['password']);
如果有帮到您,就给小编打个赏吧,谢谢哦!
php之PDO连接mysql数据库,增删改查等等操作实例的更多相关文章
- Java连接MySQL数据库增删改查通用方法
版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...
- python操作mysql数据库增删改查的dbutils实例
python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...
- jsp-2 简单的servlet连接mysql数据库 增删改查
连接mysql数据库的操作 有增删改查 用的包有 commons-lang3-3.5 mysql-connector-java-5.1.40-bin 但是实际上也就是 数据查询和数据处理两种 所以对数 ...
- java连接mysql数据库增删改查操作记录
1. 连接数据库.得到数据库连接变量 注意连接数据库的时候 (1)打开DB Browser 新建一个Database Driver,注意加入Driver JARs的时候加入的包,我的是mysql-co ...
- Asp.Net操作MySql数据库增删改查
Asp.Net操作MySql数据库增删改查,话不多说直接步入正题.git源码地址:https://git.oschina.net/gxiaopan/NetMySql.git 1.安装MySQL数据库 ...
- MySQL数据库(增删改查语句)
MySQL数据库(增删改查语句)一.登录数据库:----> mysql -uroot -proot;(对应用户名和密码)二.SQL语句: 数据定义语言DDL 用来定义数据库.表.列,关 ...
- python2.7入门---操作mysql数据库增删改查
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: G ...
- Python实现mysql数据库增删改查
利用python操作mysql数据库用法简单,环境配置容易,本文将实现对库增.删.改.查的简易封装! 1. 环境配置 安装第三方包 ,导入模块 mysql.connector pip inst ...
- java连接mysql以及增删改查操作
java连接数据库的代码基本是固定的,步骤过程觉得繁琐些,代码记起来对我来说是闹挺.直接上代码: (温馨提醒:你的项目提前导入连接数据库的jar包才有的以下操作 ) class DBConnectio ...
随机推荐
- 前端学习总结之——HTML
近期在找工作参加面试,想总结一下学过的东西,也会持续更新遇到的新问题.盲点. 什么是HTML? 超文本标记语言(英语:HyperText Markup Language,简称:HTML),由尖括号包围 ...
- 有序矩阵中第k小元素
有序矩阵中第k小元素 题目: 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 看到有序就会想 ...
- 转 linux终端 字符界面 显示乱码 .
方法一:配置SSH工具 SecureCRT中文版配置 [全局选项]→[默认会话]→[编辑默认设置]→[终端]→[外观]→[字体]→[新宋体 10pt CHINESE_GB2312]→[字符编码 UTF ...
- react项目中实现搜索关键字呈现高亮状态(一)
最近有个需求,在一个react项目中,实现搜索关键字呈现高亮状态.这个在普通的html文件中还好操作些,在react项目中有点懵逼了,因为react项目中很少操作dom,有点无从下手.但最后还是实现了 ...
- 冷饭新炒:理解Redisson中分布式锁的实现
前提 在很早很早之前,写过一篇文章介绍过Redis中的red lock的实现,但是在生产环境中,笔者所负责的项目使用的分布式锁组件一直是Redisson.Redisson是具备多种内存数据网格特性的基 ...
- 3D动漫人物代码
<div id="page_end_html"> <script src="https://eqcn.ajz.miesnfu.com/wp-conten ...
- [日常填坑系列]CAP食用指南-版本引用问题
一.前言 最近,由于好久没升级底层框架,一直用着netcore2.2版本,导致有些包没能更新到最新的版本,例如:CAP. 然而,在最近升级到CAP:3.1.2版本的时候,发现有点小坑,只能退回到CAP ...
- 【Linux】ssh远程连接到指定ip的指定用户上
通过ssh可以远程连接到其他的机器上,但是如果只想连接到指定的用户的话 需要这样做: -l 选项 (是L不是I,小写) ssh IP -l 用户名 这里的ip如果在hosts下就可以直接输入域名或者主 ...
- ctfhub技能树—信息泄露—目录遍历
打开靶机 查看页面 点击后发现几个目录 于是开始查找 在2/1目录下发现flag.txt 成功拿到flag 练习一下最近学习的requests库 附上源码 #! /usr/bin/env python ...
- 视图V_160M和表T_160M的维护
今天发现一个视图,通过SM30居然无法维护,这个视图就是V_160M,表为T_160M,是采购相关的系统消息, 不过别着急,有办法维护的,呵呵,看下面: 试一试OMCQ这个事物代码吧! 分享出来,给需 ...