时间:2021-07-01 10:21:17 帮助过:5人阅读
2.开启对相应数据库的扩展
extension=php_pdo_mysql.dll
3.通过查看phpinfo查看PDO扩展的详细信息
配置完后需要重启PHP-FPM让其重新加载配置文件和生效
service php-fpm restart
通过配置文件连接数据库
<?php
//通过参数形式连接数据库
try{
//dsn 即data source name 数据源
$dsn=‘mysql:host=localhost;dbname=test‘;
$username=‘root‘;
$passwd=‘root‘;
$pdo=new PDO($dsn, $username, $passwd);
var_dump($pdo);
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
//通过uri的形式连接数据库
try{
$dsn=‘uri:file://H:\wamp\PHPnow-1.5.6.1428396605\htdocs\pdo\dsn.txt‘;
$username=‘root‘;
$passwd=‘root‘;
$pdo=new PDO($dsn,$username,$passwd);
var_dump($pdo);
}catch(PDOException $e){
echo $e->getMessage();
}
dsn.txt
mysql:dbname=test;host=localhost
先在php.ini中配置,然后重启apache加载配置,如下所示
[PHP]
;在php.ini中配置,然后重启apache加载配置
pdo.dsn.test="mysql:host=localhost;dbname=test"
;;;;;;;;;;;;;;;;;;;
; About php.ini ;
;;;;;;;;;;;;;;;;;;;
<?php
/**
*通过配置文件链接数据库
*在php.ini中配置,然后重启apache加载配置
*/
try{
$dsn=‘test‘;
$username=‘root‘;
$passwd=‘root‘;
$pdo=new PDO($dsn,$username,$passwd);
var_dump($pdo);
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
//exec():执行一条sql语句并返回其受影响的记录的条数,如果没有受影响的记录,他返回0
//exec对于select没有作用
$sql=<<<EOF
CREATE TABLE IF NOT EXISTS user(
id INT(10) UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
password CHAR(32) NOT NULL,
email VARCHAR(30) NOT NULL
);
EOF;
$res=$pdo->exec($sql);
var_dump($res);
$sql=‘INSERT user(username,password,email) VALUES("king","‘.md5(‘king‘).‘","imooc@qq.com")‘;
//echo $sql;
$res=$pdo->exec($sql);
echo $res;
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
//exec():执行一条sql语句并返回其受影响的记录的条数,如果没有受影响的记录,他返回0
//exec对于select没有作用
//插入多条记录
// $sql=<<<EOF
// INSERT user(username,password,email) VALUES("king1","king1","imooc1@qq.com"),
// ("king2","king2","imooc1@qq.com"),
// ("king3","king2","imooc1@qq.com")
//
//EOF;
//echo $sql;
$sql=‘INSERT user(username,password,email) VALUES("king6","king6","imooc6@qq.com")‘;
$res=$pdo->exec($sql);
echo ‘受影响的记录的条数为:‘.$res,‘<br/>‘;
//$pdo->lastInsertId():得到新插入记录的ID号
echo ‘最后插入的ID号为‘.$pdo->lastInsertId();
if(!$res)
throw new PDOException("<br/>插入数据失败");
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
//$sql=‘update user set username="king" where id=1‘;
//$sql=‘delete from userwhere id=1‘;
$sql=‘select * from user‘;
$res=$pdo->exec($sql);
//echo $res.‘条记录被影响‘;
var_dump($res);
// echo ‘<hr/>‘;
// echo $pdo->lastInsertId();
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql=‘delete from user12 where id=1‘;
$res=$pdo->exec($sql);
//echo $res.‘条记录被影响‘;
//var_dump($res);
if($res===false){
//$pdo->errorCode():SQLSTATE的值
echo $pdo->errorCode();
echo ‘<hr/>‘;
//$pdo->errorInfo():返回的错误信息的数组,数组中包含3个单元
//0=>SQLSTATE,1=>CODE,2=>INFO
$errInfo=$pdo->errorInfo();
print_r($errInfo);
}
// echo ‘<hr/>‘;
// echo $pdo->lastInsertId();
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
//$sql=‘select * from user where id=2‘;
$sql=‘select id,username,email from user‘;
//$pdo->query($sql),执行SQL语句,返回PDOStatement对象
$stmt=$pdo->query($sql);
var_dump($stmt);
echo ‘<hr/>‘;
foreach($stmt as $row){
//print_r($row);
echo ‘编号:‘.$row[‘id‘],‘<br/>‘;
echo ‘用户名:‘.$row[‘username‘],‘<br/>‘;
echo ‘邮箱:‘.$row[‘email‘],‘<br/>‘;
echo ‘<hr/>‘;
}
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=imooc‘,‘root‘,‘root‘);
$sql=‘INSERT user(username,password,email) VALUES("king11","‘.md5(‘king11‘).‘","imooc11@qq.com")‘;
$stmt=$pdo->query($sql);
var_dump($stmt);
}catch(PDOException $e){
echo $e->getMessage();
}
fetch()方法使用
<?php
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql=‘select * from user where username="king11"‘;
//prepare($sql):准备SQL语句
$stmt=$pdo->prepare($sql);
//execute():执行预处理语句
$res=$stmt->execute();
//var_dump($res);
//fetch():得到结果集中的一条记录
$row=$stmt->fetch();
print_r($row);
//var_dump($stmt);
}catch(PDOException $e){
echo $e->getMessage();
}
setFetchMode()方法和fetchAll()方法使用
<?php
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql=‘select * from user‘;
$stmt=$pdo->prepare($sql);
$res=$stmt->execute();
// if($res){
// while($row=$stmt->fetch(PDO::FETCH_OBJ)){
// print_r($row);
// echo ‘<hr/>‘;
// }
// }
// $rows=$stmt->fetchAll(PDO::FETCH_ASSOC);
// print_r($rows);
echo ‘<hr/>‘;
$stmt->setFetchMode(PDO::FETCH_ASSOC); //设置返回结果集的模式
//var_dump($stmt);
$rows=$stmt->fetchAll();
print_r($rows);
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
/**
*getAttribute() 检索一个语句属性
*setAttribute()设置一个语句属性
*/
header(‘content-type:text/html;charset=utf-8‘);
try{
$dsn=‘mysql:host=localhost;dbname=test‘;
$username=‘root‘;
$passwd=‘root‘;
$pdo=new PDO($dsn, $username, $passwd);
echo ‘自动提交:‘.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
echo ‘<br/>‘;
echo ‘PDO默认的错误处理模式:‘.$pdo->getAttribute(PDO::ATTR_ERRMODE);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
echo ‘<br/>‘;
echo ‘自动提交:‘.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
}catch(PDOException $e){
echo $e->getMessage();
}
批量获取和设置PDO连接属性
<?php
/**
*批量获取PDO属性
*/
header(‘content-type:text/html;charset=utf-8‘);
try{
$dsn=‘mysql:host=localhost;dbname=test‘;
$username=‘root‘;
$passwd=‘root‘;
$pdo=new PDO($dsn, $username, $passwd);
$attrArr=array(
‘AUTOCOMMIT‘,‘ERRMODE‘,‘CASE‘,‘PERSISTENT‘,‘TIMEOUT‘,‘ORACLE_NULLS‘,
‘SERVER_INFO‘,‘SERVER_VERSION‘,‘CLIENT_VERSION‘,‘CONNECTION_STATUS‘
);
foreach($attrArr as $attr){
echo "PDO::ATTR_$attr: ";
echo $pdo->getAttribute(constant("PDO::ATTR_$attr")),‘<br/>‘;
}
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
header(‘content-type:text/html;charset=utf-8‘);
try{
$dsn=‘mysql:host=localhost;dbname=imooc‘;
$username=‘root‘;
$passwd=‘root‘;
$options=array(PDO::ATTR_AUTOCOMMIT=>0,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
$pdo=new PDO($dsn, $username, $passwd, $options);
echo $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
echo ‘<br/>‘;
echo $pdo->getAttribute(PDO::ATTR_ERRMODE);
}catch(PDOException $e){
echo $e->getMessage();
}
下方的例子用简单登录模块演示:
login.php
<!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>Insert title here</title>
</head>
<body>
<form action=‘doAction.php‘ method=‘post‘>
用户名:<input type=‘text‘ name=‘username‘ /><br/>
密码:<input type=‘password‘ name=‘password‘/><br/>
<input type=‘submit‘ value=‘登陆‘/>
</form>
</body>
</html>
doAction.php
<?php
header(‘content-type:text/html;charset=utf-8‘);
$username=$_POST[‘username‘];
$password=$_POST[‘password‘];
try{
echo $username;
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
//下方SQL是有存在SQL注入问题的。当用户在用户名中输入 ‘ or 1=1 # 时,会返回所有结果
//当然如果php.ini开启了magic_quotes_gpc 则会自动转义,但是不建议这样使用
$sql="select * from user where username=‘{$username}‘ and password=‘{$password}‘";
echo $username;
echo $sql;
//通过quote():返回带引号的字符串,过滤字符串中的特殊字符
// $username=$pdo->quote($username);//转义特殊字符串
//$sql="select * from user where username={$username} and password=‘{$password}‘";
echo $sql;
$stmt=$pdo->query($sql);
//PDOStatement对象的方法:rouCount():对于select操作返回的结果集中记录的条数,
//对于INSERT、UPDATE、DELETE返回受影响的记录的条数
echo $stmt->rowCount();
}catch(PDOException $e){
echo $e->getMessage();
}
常用的过滤用户输入的三种方法
1、addslashes
2、mysql_real_escape_string
3、开启php.ini中的魔法引号magic_quotes_gpc (不建议使用)
但是以上三种都不是好的解决办法,参考文档
login.php
<!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>Insert title here</title>
</head>
<body>
<form action=‘doAction1.php‘ method=‘post‘>
用户名:<input type=‘text‘ name=‘username‘ /><br/>
密码:<input type=‘password‘ name=‘password‘/><br/>
<input type=‘submit‘ value=‘登陆‘/>
</form>
</body>
</html>
doAction1.php
<?php
/*
*预处理语句中第一种占位符的使用
*/
header(‘content-type:text/html;charset=utf-8‘);
$username=$_POST[‘username‘];
$password=$_POST[‘password‘];
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql="select * from user where username=:username and password=:password";
$stmt=$pdo->prepare($sql);
$stmt->execute(array(":username"=>$username,":password"=>$password));
echo $stmt->rowCount();
}catch(PDOException $e){
echo $e->getMessage();
}
doAction2.php
login.php用上方的,action改成doAction2.php即可
<?php
/*
*预处理语句中第二种占位符的使用 ?
*/
header(‘content-type:text/html;charset=utf-8‘);
$username=$_POST[‘username‘];
$password=$_POST[‘password‘];
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql="select * from user where username=? and password=?";
$stmt=$pdo->prepare($sql);
$stmt->execute(array($username,$password));
echo $stmt->rowCount();
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
/**
*bindParam()绑定一个参数到指定的变量名
*/
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
//写预处理语句,推荐使用命名参数占位符的方式,不要使用?号占位符
//?号占位符的索引默认是从1开始的,采用索引的方式不利于代码阅读
//============命名参数占位符方式============
$sql="INSERT user(username,password,email) VALUES(:username,:password,:email)";
$stmt=$pdo->prepare($sql);
$stmt->bindParam(":username",$username,PDO::PARAM_STR);//指定类型
$stmt->bindParam(":password",$password,PDO::PARAM_STR);
$stmt->bindParam(":email",$email);
//============?占位符方式============
// $sql="INSERT user(username,password,email) VALUES(?,?,?)";
// $stmt=$pdo->prepare($sql);
// $stmt->bindParam(1,$username,PDO::PARAM_STR);//指定类型
// $stmt->bindParam(2,$password,PDO::PARAM_STR);
// $stmt->bindParam(3,$email);
//=========================
$username=‘imooc2‘;
$password=‘imooc2‘;
$email=‘imooc2@imooc.com‘;
$stmt->execute();
$username=‘MR.KING2‘;
$password=‘MR.KING2‘;
$email=‘MR.KING2@imooc.com‘;
$stmt->execute();
echo $stmt->rowCount();
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql=‘DELETE FROM user WHERE id<:id‘;
$stmt=$pdo->prepare($sql);
$stmt->bindParam(":id",$id,PDO::PARAM_INT);
$id = 3;//删除id小于3的记录
$stmt->execute();
echo $stmt->rowCount();
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
/**
*bindValue()把一个值绑定到一个参数
*/
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql=‘INSERT user(username,password,email) VALUES(?,?,?)‘;
$stmt=$pdo->prepare($sql);
$username=‘imooc_king‘;
$password=‘imooc_king‘;
//参数标识符。对于使用命名占位符的预处理语句,应是类似 :name 形式的参数名。对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。
$stmt->bindValue(1,$username);
$stmt->bindValue(2,$password);
$stmt->bindValue(3,‘imooc@imooc.com‘);
$stmt->execute();
echo $stmt->rowCount();
$username=‘imooc_king1‘;
$password=‘imooc_king1‘;
$stmt->bindValue(1,$username);
$stmt->bindValue(2,$password);
$stmt->execute();
echo $stmt->rowCount();
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
//bindColumn 绑定一列到一个 PHP 变量
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql=‘SELECT username,password,email FROM user‘;
$stmt=$pdo->prepare($sql);
$stmt->execute();
//返回结果集中的列数,不是行数
echo ‘结果集中的列数一共有:‘.$stmt->columnCount();
echo ‘<hr/>‘;
//getColumnMeta此函数是实验性的。此函数的表象,包括名称及其相关文档都可能在未来的 PHP 发布版本中未通知就被修改。使用本函数风险自担 。
//print_r($stmt->getColumnMeta(0));
echo ‘<hr/>‘;
//bindColumn 绑定一列到一个 PHP 变量
//这里总共三列(username,password,email),索引从1开始
//如下
$stmt->bindColumn(1, $username);
$stmt->bindColumn(2,$password);
$stmt->bindColumn(3, $email);
//PDO::FETCH_BOUND:返回 TRUE ,并分配结果集中的列值给 PDOStatement::bindColumn() 方法绑定的 PHP 变量。
while($stmt->fetch(PDO::FETCH_BOUND)){
echo ‘用户名:‘.$username.‘-密码:‘.$password.‘-邮箱:‘.$email.‘<hr/>‘;
}
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
//fetchColumn — 从结果集中的下一行返回单独的一列。
header(‘content-type:text/html;charset=utf-8‘);
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql=‘SELECT username,password,email FROM user‘;
$stmt=$pdo->query($sql);
echo $stmt->fetchColumn(0),‘<br/>‘;
echo $stmt->fetchColumn(1),‘<br/>‘;
echo $stmt->fetchColumn(2);
}catch(PDOException $e){
echo $e->getMessage();
}
?号占位符方式打印
<?php
//debugDumpParams()方法打印一条预处理语句
//?号占位符方式
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql=‘INSERT user(username,password,email) VALUES(?,?,?)‘;
$stmt=$pdo->prepare($sql);
$stmt->bindParam(1, $username,PDO::PARAM_STR);
$stmt->bindParam(2,$password,PDO::PARAM_STR);
$stmt->bindParam(3,$email,PDO::PARAM_STR);
$username=‘testParam‘;
$password=‘testParam‘;
$email=‘testParam@imooc.com‘;
$stmt->execute();
$stmt->debugDumpParams();
}catch(PDOException $e){
echo $e->getMessage();
}
命名参数占位符方式打印
<?php
//debugDumpParams()方法打印一条预处理语句
//命名参数占位符方式
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql=‘SELECT * FROM user WHERE username=:username AND password=:password‘;
$stmt=$pdo->prepare($sql);
$stmt->bindParam(‘:username‘, $username,PDO::PARAM_STR);
$stmt->bindParam(‘:password‘,$password,PDO::PARAM_STR);
$username=‘testParam‘;
$password=‘testParam‘;
$stmt->execute();
$stmt->debugDumpParams();
}catch(PDOException $e){
echo $e->getMessage();
}
先创建一个存储过程,获取两个结果集
CREATE TABLE IF NOT EXISTS userAccount(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
money DECIMAL(10,2)
)ENGINE=INNODB;
INSERT userAccount(username,money) VALUES(‘imooc‘,10000),(‘king‘,5000);
#创建一个存储过程
DELIMITER //#定界符
CREATE PROCEDURE test1()
BEGIN
SELECT * FROM user;
SELECT * FROM userAccount;
END
//#定界符结束
DELIMITER ;#恢复定界符
获取多个结果集中的下一个结果集
<?php
//nextRowset
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
$sql=‘call test1()‘;
$stmt=$pdo->query($sql);
$rowset=$stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($rowset);//只获取到了第一个结果集
echo ‘<hr color="red"/>‘;
//想获取多个结果集中的下一个结果集
$stmt->nextRowset();//在一个多行集语句句柄中推进到下一个行集
$rowset=$stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($rowset);
}catch(PDOException $e){
echo $e->getMessage();
}
<?php
/*
PDO::ERRMODE_SLIENT:默认模式,静默模式
PDO::ERRMODE_WARNING:警告模式
PDO::ERRMODE_EXCEPTION:异常模式---推荐使用
*/
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘root‘);
//$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql=‘SELECT * FROM noneTable‘;
$pdo->query($sql);
echo $pdo->errorCode();
echo ‘<br/>‘;
print_r($pdo->errorInfo());
}catch(PDOException $e){
echo $e->getMessage();
}
先创建一个测试表
CREATE TABLE IF NOT EXISTS userAccount(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
money DECIMAL(10,2)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT userAccount(username,money) VALUES(‘imooc‘,10000),(‘king‘,5000);
<?php
//PDO事务处理
//事务处理的表,必须为INNODB
header(‘content-type:text/html;charset=utf-8‘);
try{
$dsn=‘mysql:host=localhost;dbname=test‘;
$username=‘root‘;
$passwd=‘root‘;
//PDO::ATTR_AUTOCOMMIT (integer)如果此值为 FALSE ,PDO 将试图禁用自动提交以便数据库连接开始一个事务。
$options=array(PDO::ATTR_AUTOCOMMIT,0);//关闭自动提交事物
$pdo=new PDO($dsn, $username, $passwd, $options);
var_dump($pdo-&