pdo连接mysql数据库_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扩展将被作为辅助 。

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连接数据库:<?php

class Index

{

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->type}:host={$this->hostname};port={$this->hostport};";

$dsn.= "dbname={$this->database};charset={$this->charset}";

$pdo = new PDO($dsn, $this->username, $this->password);

$pdo->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$this->pdo = $pdo;

unset($dsn);

}

public function demo()

{

$sql = 'select id,name from goods';

$goods = $this->pdo->query($sql);

$goods = $goods->fetchAll(PDO::FETCH_ASSOC);

#  打印输出数据

print_r($goods);

}

}

3、PDO设置属性:

PDO有三种错误处理方式:

1、PDO::ERrmODE_SILENT不显示错误信息,只设置错误码

2、PDO::ERrmODE_WARNING显示警告错

3、PDO::ERrmODE_EXCEPTION抛出异常$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 '

';

print_r(get_class_methods('PDO'));

echo '

';

结果: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 '

';

print_r($data);

echo '

';

# 设置返回数据类型方法2:

while($row = $res->fetch(\PDO::FETCH_ASSOC)){

$data[] = $row;

}

echo '

';

print_r($data);

echo '

';

# 【示例2:添加数据】:添加数据到company表中,并返回数据在表中的ID是多少!

$res = $pdo->exec("insert into xc_company(name) values('小川编程添加111')");

if($res){

echo '11添加成功数据ID为:'.$pdo->lastinsertid().'
';

}

$res = $pdo->query("insert into xc_company(name) values('小川编程添加222')");

if($res){

echo '22添加成功数据ID为:'.$pdo->lastinsertid().'
';

}

# 【示例3:更新数据】:

$res = $pdo->exec("update xc_company set name='小川编程更新111' where id=26");

if($res){

echo '更新数据成功
';

}

$res = $pdo->query("update xc_company set name='小川编程更新222' where id=26");

if($res){

echo '成功更新数据【'.$res->rowCount().'】条
';

}

# 【示例4:删除数据】:

$res = $pdo->exec("delete from xc_company where id=38");

if($res){

echo '删除数据成功
';

}

$res = $pdo->query("delete from xc_company where id=38");

if($res){

echo '成功删除数据【'.$res->rowCount().'】条
';

}

# 【示例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 '

';

print_r($data);

echo '

';

$pdo = null;

?>

浏览器启用弹出窗口过滤功能,将无法跳转到下载页。在浏览器地址栏右边符号提示处点击允许就可以了!

【温馨提示】源码包解压密码:www.youhutong.com

郑重声明:

1、本站源码仅供个人学习研究和交流使用,请于下载后二十四小时内删除

2、本站大多资源来源于互联网、用户分享,仅供学习交流使用,本站不提供任何技术支持

3、本站联系方式Email:admin@youhutong.com ,收到邮件会第一时间处理。

4、如侵犯到任何版权问题,请立即告知本站(立即在线告知),本站将及时删除并致以最深的歉意

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值