php操作mysql【mysqli、pdo】
一、什么是pdo
PHP数据对象(PDO)扩展为PHP访问数据库定义了一个轻量级的一致接口。
PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用,无法运行于之前的PHP版本。
二、安装pdo
你可以通过PHP的phpinfo()函数来查看是否安装了PDO扩展。【环境中基本上都已经安装了】
三、常用的方法和属性
预定义常量
PHP PDO连接连接管理
PHP PDO事务与自动提交
PHP PDO预处理语句与存储过程
PHP PDO错误与错误处理
PHP PDO大对象(LOB)
PDO类:
PDO :: beginTransaction - 启动一个事务
PDO :: commit - 提交一个事务
PDO :: __ construct - 创建一个表示数据库连接的PDO实例
PDO :: errorCode - 获取跟数据库句柄上一次操作相关的SQLSTATE
PDO :: errorInfo - 返回最后一次操作数据库的错误信息
PDO :: exec - 执行一条SQL语句,并返回受影响的行数
PDO :: getAttribute - 取回一个数据库连接的属性
PDO :: getAvailableDrivers - 返回一个可用驱动的数组
PDO :: inTransaction - 检查是否在一个事务内
PDO :: lastInsertId - 返回最后插入行的ID或序列值
PDO :: prepare - 备要执行的SQL语句并返回一个PDOStatement对象
PDO :: query - 执行SQL语句,返回PDOStatement对象,可以理解为结果集
PDO :: quote - 为SQL语句中的字符串添加引号。
PDO :: rollBack - 回滚一个事务
PDO :: setAttribute - 设置属性
PDOStatement类:
PDOStatement :: bindColumn - 绑定一列到一个PHP变量
PDOStatement :: bindParam - 绑定一个参数到指定的变量名
PDOStatement :: bindValue - 把一个值绑定到一个参数
PDOStatement :: closeCursor - 关闭游标,使语句能再次被执行。
PDOStatement :: columnCount - 返回结果集中的列数
PDOStatement :: debugDumpParams - 打印一条SQL预处理命令
PDOStatement :: errorCode - 获取跟上一次语句句柄操作相关的SQLSTATE
PDOStatement :: errorInfo - 获取跟上一次语句句柄操作相关的扩展错误信息
PDOStatement :: execute - 执行一条预处理语句
PDOStatement :: fetch - 从结果集中获取下一行
PDOStatement :: fetchAll - 返回一个包含结果集中所有行的数组
PDOStatement :: fetchColumn - 从结果集中的下一行返回单独的一列。
PDOStatement :: fetchObject - 获取下一行并作为一个对象返回。
PDOStatement :: getAttribute - 检索一个语句属性
PDOStatement :: getColumnMeta - 返回结果集中一列的元数据
PDOStatement :: nextRowset - 在一个多行集语句句柄中推进到下一个行集
PDOStatement :: rowCount - 返回受上一个SQL语句影响的行数
PDOStatement :: setAttribute - 设置一个语句属性
PDOStatement :: setFetchMode - 为语句设置默认的获取模式。
四、连接数据库
php异常处理的连接
// 创建一个有异常处理的函数
function checkNum($number)
{
if($number>1)
{
throw new Exception("你传递的值必须大于1");//throw 抛出 new 实例对象的关键字 Exception 异常
}
return true;
}
// 触发异常
checkNum(2);
Try、throw 和 catch
- Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
- Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
- Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
总结:觉得会出错的代码,放置在try当中
如果try当中有异常,就走到catch
// 创建一个有异常处理的函数
function checkNum($number)
{
if($number>1)
{
throw new Exception("你传递的值必须大于1");//throw 抛出 new 实例对象的关键字 Exception 异常
}
return true;
}
// 触发异常
/*checkNum(2);*/
try{
checkNum(2);
}catch(Exception $e){
echo $e->getMessage();
}
- 建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
- 在 "try" 代码块中调用 checkNum() 函数。
- checkNum() 函数中的异常被抛出。
- "catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
- 通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息。
然而,为了遵循 "每个 throw 必须对应一个 catch" 的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。
pdo使用异常处理的方法
PDO
一、PDO 的三种连接方式
1. 通过参数的方式链接
try {//try尝试
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");//new实例化对象的关键字 pdo对象
// mysql 数据库的类型 host 服务器的地址 dbname数据库名称 $user 用户名 $pass 密码
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
2.通过uri形式连接数据库
新建文件 dsn.text
注释:uri;
3.通过PHP的配置文件
修改php配置文件
使用
注释:
二、PDO对象的方法
exec 执行一条sql语句并返回受影响的行数,对select 无效
query 执行一条查询语句,返回一个PDOStatement对象
prepare 准备要执行的sql语句,返回PDOstatement对象
lastInsertId 返回最后插入的id
errorCode 错误码
errorInfo 错误信息 返回数组 0 错误码 1 错误编号 2 错误信息
quote(); 为SQL语句中的字符串添加引号,并且转义特殊字符
讲解
1.exec 执行添加删除修改 返回受影响的行数 对select无效
<?php
//php操作mysql需要几步
//建立mysql的建立并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', 'root', 'root');
//设置字符集
$dbh->exec('set names utf8');//执行添加删除修改 非查询
//组织sql语句
//$insert="insert into type value(null,'测试数据') ";//组织插入语句
//$sql="delete from type where type_id=7";//组织删除语句
$sql="update type set type_name='测试数据' where type_id=6";//组织修改语句
//执行sql语句
$res=$dbh->exec($sql);
if($res){
echo "成功";
}else{
echo "失败";
}
//关闭连接
$dbh="";
2.query 执行一条sql语句返回一个pdostatement对象
<?php
//php操作mysql需要几步
//建立mysql的建立并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', 'root', 'root');
//设置字符集
$dbh->exec('set names utf8');//执行添加删除修改
$sql="select * from type";//组织查询语句
$stmt=$dbh->query($sql);//查询语句的返回值是一个结果集 返回值是一个PDOStatement 对象
/*PDOStatement->fetch 获取一条数据*/
/*print_r($stmt->fetch(PDO::FETCH_ASSOC));//(PDO::FETCH_NUM 返回值是一个索引数组 PDO::FETCH_ASSOC 关联数组 PDO::FETCH_BOTH混合数组*/
/*PDOStatement->fetchAll 获取所有的数据*/
print_r($stmt->fetchAll(PDO::FETCH_ASSOC));//fetchAll 获取所有的数据
3.quote 防止sql注入 返回一个添加引号的字符串 用于sql语句当中
//php操作mysql需要几步
//建立mysql的建立并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', 'root', 'root');
//设置字符集
$dbh->exec('set names utf8');//执行添加删除修改
$user_name=$_POST['user_name'];//接收用户名
$user_pwd=$_POST['user_pwd'];//接收密码
//防止sql注入quote
$user_name=$dbh->quote($user_name);//给用户名添加单引号
$user_pwd=$dbh->quote($user_pwd);//给密码添加单引号
$sql="select * from user where user_name=$user_name and user_pwd=$user_pwd";
/*$sql="select * from user where user_name='' or 1=1 # and user_pwd='12345'";//sql注入*/
$stmt=$dbh->query($sql);//执行查询语句 返回值是一个pdostatment对象
$data=$stmt->fetch(PDO::FETCH_ASSOC);//从结果集中获取一条数据
if($data){
echo "登录成功";
}else{
echo "用户名或密码输入有误";
}
预处理语句防止sql注入
4、事务的操作
$dbh->beginTransaction();//开启一个事务
$dbh->commit();//提交事务
$dbh->rollBack();//回滚
//转账功能能
/*庄浩然的账户-500元 查询韩天宇的账户的状态 如果韩天宇的账户状态正常 +500元 提交事务 如果不正常 回滚事务*/
$dsn="mysql:host=127.0.0.1;dbname=1803A";
$dbh = new PDO($dsn, "root", "root");//建立与数据库的连接并选择数据
$dbh->exec("set names utf8");//设置字符集
$dbh->setAttribute(PDO::ATTR_ERRMODE,1);//开启错误调试
$dbh->beginTransaction();//开启一个事务
$sql1="update user_money set money=money-500 where id=4";//庄浩然=500元
$dbh->exec($sql1);//执行第一个修改
$select="select static from user_money where id=3";//查询韩天宇的状态
$reslut=$dbh->query($select);
$data=$reslut->fetch(PDO::FETCH_ASSOC);
if($data['static']==1){//如果韩天宇的状态等于1 正常状态正常
$sql2="update user_money set money=money+500 where id=3";//执行+500
$dbh->exec($sql2);//执行第一个修改
$dbh->commit();//提交事务
echo "执行成功";
}else{//不是1 那就是不正常的状态
$dbh->rollBack();//事务回滚
echo "执行失败,事务回滚";
}
5、errorcode 获取跟数据库句柄上一次操作相关的 SQLSTATE
获取错误编码
//php操作mysql需要几步
//建立mysql的建立并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', 'root', 'root');
//设置字符集
$dbh->exec('set names utf8');//执行添加删除修改
$sql="insert into user";
$dbh->exec($sql);
echo $dbh->errorCode();
6、errorinfo 获取跟mysql句柄上一次操作的错误信息 返回错误信息 返回值是一个数组
Array
(
[0] => 42000
[1] => 1064
[2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
)
0 错误码 1 错误编号 2 错误信息
//php操作mysql需要几步
//建立mysql的建立并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', 'root', 'root');
//设置字符集
$dbh->exec('set names utf8');//执行添加删除修改
$sql="insert into user";
$dbh->exec($sql);
print_r($dbh->errorInfo());
7、prepare 准备要执行sql语句,返回值是一个pdostatement对象
预处理的sql语句可以重复会用
命名参数占位符
//php操作mysql需要几步
//建立mysql的建立并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', 'root', 'root');
//设置字符集
$dbh->exec('set names utf8');//执行添加删除修改
$sql="select * from user where user_name='张三' and user_pwd='123456'";//住址一条查询语句
$stmt=$dbh->prepare($sql);//准备执行sql语句 返回值也是一个pdostatment对象
$stmt->execute();//执行一条预处理语句
$res=$stmt->fetch(PDO::FETCH_ASSOC);//从结果集中获取数据
print_r($res);
//php操作mysql需要几步
//建立mysql的建立并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', 'root', 'root');
//设置字符集
$user_name=$_POST['user_name'];
$user_pwd=$_POST['user_pwd'];
$dbh->exec('set names utf8');//执行添加删除修改
//占位符 : 命名参数占位符 ?问号占位符
$sql="select * from user where user_name=:user_name and user_pwd=:user_pwd";//住址一条查询语句
$stmt=$dbh->prepare($sql);//准备执行sql语句 返回值也是一个pdostatment对象
$stmt->execute([':user_name'=>$user_name,':user_pwd'=>$user_pwd]);//执行一条预处理语句
$res=$stmt->fetch(PDO::FETCH_ASSOC);//从结果集中获取数据
print_r($res);
if($res){
echo "登录成功";
}else{
echo "登录失败";
}
$stmt->execute([':user_name'=>'李四',':user_pwd'=>'123456']);//执行一条预处理语句
$res1=$stmt->fetch(PDO::FETCH_ASSOC);//从结果集中获取数据
print_r($res1);
?问号占位符
//php操作mysql需要几步
//建立mysql的建立并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', 'root', 'root');
//设置字符集
$user_name=$_POST['user_name'];
$user_pwd=$_POST['user_pwd'];
$dbh->exec('set names utf8');//执行添加删除修改
//占位符 : 命名参数占位符 ?问号占位符
$sql="select * from user where user_name=? and user_pwd=?";//住址一条查询语句
$stmt=$dbh->prepare($sql);//准备执行sql语句 返回值也是一个pdostatment对象
$stmt->execute([$user_name,$user_pwd]);//执行一条预处理语句
$res=$stmt->fetch(PDO::FETCH_ASSOC);//从结果集中获取数据
print_r($res);
if($res){
echo "登录成功";
}else{
echo "登录失败";
}
8/getAttribute 获取属性
设置数据库句柄属性。下面列出了一些可用的通用属性;有些驱动可能使用另外的特定属性。
- PDO::ATTR_CASE:强制列名为指定的大小写。
- PDO::CASE_LOWER:强制列名小写。
- n PDO::CASE_NATURAL:保留数据库驱动返回的列名。
- n PDO::CASE_UPPER:强制列名大写。
- l PDO::ATTR_ERRMODE:错误报告。
- n PDO::ERRMODE_SILENT: 仅设置错误代码。
- n PDO::ERRMODE_WARNING: 引发 E_WARNING 错误
- n PDO::ERRMODE_EXCEPTION: 抛出 exceptions 异常。
- l PDO::ATTR_ORACLE_NULLS (在所有驱动中都可用,不仅限于Oracle): 转换 NULL 和空字符串。
- n PDO::NULL_NATURAL: 不转换。
- n PDO::NULL_EMPTY_STRING: 将空字符串转换成 NULL。
- n PDO::NULL_TO_STRING: 将 NULL 转换成空字符串。
- l PDO::ATTR_STRINGIFY_FETCHES: 提取的时候将数值转换为字符串。 需要 bool。
- l PDO::ATTR_STATEMENT_CLASS: 设置从PDOStatement派生的用户提供的语句类。 不能用于持久的PDO实例。 需要 array(string 类名, array(mixed 构造函数的参数))。
- l PDO::ATTR_TIMEOUT: 指定超时的秒数。并非所有驱动都支持此选项,这意味着驱动和驱动之间可能会有差异。比如,SQLite等待的时间达到此值后就放弃获取可写锁,但其他驱动可能会将此值解释为一个连接或读取超时的间隔。 需要 int 类型。
- l PDO::ATTR_AUTOCOMMIT (在OCI,Firebird 以及 MySQL中可用): 是否自动提交每个单独的语句。
- l PDO::ATTR_EMULATE_PREPARES 启用或禁用预处理语句的模拟。 有些驱动不支持或有限度地支持本地预处理。使用此设置强制PDO总是模拟预处理语句(如果为 TRUE ),或试着使用本地预处理语句(如果为 FALSE)。如果驱动不能成功预处理当前查询,它将总是回到模拟预处理语句上。 需要 bool 类型。
- l PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (在MySQL中可用): 使用缓冲查询。
- l PDO::ATTR_DEFAULT_FETCH_MODE: 设置默认的提取模式。关于模式的说明可以在 PDOStatement::fetch()文档找到。
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");
$dbh->exec("set names utf8");//设置字符集
//开启报错 ATTR_ERRMODE errmode error mode (错误的模式)
//$dbh->setAttribute(PDO::ATTR_ERRMODE,1);//开启错误调试
echo $dbh->getAttribute(PDO::ATTR_ERRMODE);//getAttribute 获取属性 0 代表静默模式(不报错)
$user_name=$dbh->quote($_POST['user_name']);//会给字符串添加一个当引号 所以下面的sql语句就不用添加单引号了
$user_pwd=$dbh->quote($_POST['user_pwd']);
$sql="select * from user user_name=$user_name and user_pwd=$user_pwd";//组织一条查询语句
$reslut=$dbh->query($sql);//执行查询返回的结果是 pdostatement 结果集
lastInsertId 返回最后插入的id
//exec()方法的复习
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");
$dbh->exec("set names utf8");//设置字符集
$sql="insert into user values(null,'懒羊羊','123456')";//组织sql语句
//$sql="update user set user_name='灰太狼' where id=2";//组织一条修改语句
//$sql="delete from user where id=2";//组织一条删除语句
$res=$dbh->exec($sql);//exec 执行一条sql语句 返回受影响的行数 对select 无效
echo $dbh->lastInsertId();
var_dump($res);
三、PDOStatement对象的方法
什么是预处理?
成熟的数据库都支持预处理语句(Prepared Statements)的概念。
它们是什么东西?你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。
预处理语句具有两个主要的优点:
1 查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划。
对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢。
通过使用一个预处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。
2 传给预处理语句的参数不需要使用引号,底层驱动会为你处理这个。
如果你的应用独占地使用预处理语句,你就可以确信没有SQL注入会发生。
预处理防止sql注入
一共有两种占位符
第一种是:?占位符
//预处理和问号占位符
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");
$dbh->exec("set names utf8");//设置字符集
$dbh->setAttribute(PDO::ATTR_ERRMODE,1);//开启错误调试
$user_name=$_POST['user_name'];
$user_pwd=$_POST['user_pwd'];
//?号占位符
$sql="select * from user where user_name=? and user_pwd=?";
$stmt=$dbh->prepare($sql);//准备执行预处理 返回 pdostatement对象
//预处理也可以防止sql注入
$stmt->execute([$user_name,$user_pwd]);//执行预处理
//execute 里面的参数必须是数组形式
echo $stmt->rowCount();//影响的行数
第二种是 命名参数占位符
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");
$dbh->exec("set names utf8");//设置字符集
$dbh->setAttribute(PDO::ATTR_ERRMODE,1);//开启错误调试
$user_name=$_POST['user_name'];
$user_pwd=$_POST['user_pwd'];
//命名参数占位符 :占位符 【命名参数占位符】
$sql="select * from user where user_name=:user_name and user_pwd=:user_pwd";
$stmt=$dbh->prepare($sql);//准备执行预处理 返回 pdostatement对象
//预处理也可以防止sql注入
$stmt->execute([':user_name'=>$user_name,':user_pwd'=>$user_pwd]);//执行预处理
//execute 里面的参数必须是数组形式
echo $stmt->rowCount();//影响的行数
三、PDOStatement对象
execute()方法
//预处理和问号占位符
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");
$dbh->exec("set names utf8");//设置字符集
$dbh->setAttribute(PDO::ATTR_ERRMODE,1);//开启错误调试
$user_name=$_POST['user_name'];
$user_pwd=$_POST['user_pwd'];
//?号占位符
$sql="select * from user where user_name=? and user_pwd=?";
$stmt=$dbh->prepare($sql);//准备执行预处理 返回 pdostatement对象
//预处理也可以防止sql注入
$stmt->execute([$user_name,$user_pwd]);//执行预处理
//execute 里面的参数必须是数组形式
echo $stmt->rowCount();//影响的行数
bindParam 绑定一个参数到指定的变量名
//预处理和问号占位符
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");
$dbh->exec("set names utf8");//设置字符集
$dbh->setAttribute(PDO::ATTR_ERRMODE,1);//开启错误调试
$user_name=$_POST['user_name'];
$user_pwd=$_POST['user_pwd'];
//?号占位符
$sql="select * from user where user_name=:user_name and user_pwd=:user_pwd";
$stmt=$dbh->prepare($sql);//准备执行预处理 返回 pdostatement对象
//预处理也可以防止sql注入
$stmt->bindParam(':user_name',$user_name,PDO::PARAM_STR);//绑定一个参数到指定的变量名
$stmt->bindParam(':user_pwd',$user_pwd,PDO::PARAM_STR);//绑定一个参数到指定的变量名
//参数1 占位符语法(命名参数占位符 或?占位符) 参数2绑定的变量的值 参数3 明确指定参数的类型
//PDO::PARAM_STR 字符串 PDO::PARAM_BOOL 布尔类型 PDO::PARAM_INT 整型 PDO::PARAM_NULL 空
$stmt->execute();//执行预处理
//execute 里面的参数必须是数组形式
echo $stmt->rowCount();//影响的行数
?号占位符
//预处理和问号占位符
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");
$dbh->exec("set names utf8");//设置字符集
$dbh->setAttribute(PDO::ATTR_ERRMODE,1);//开启错误调试
$user_name=$_POST['user_name'];
$user_pwd=$_POST['user_pwd'];
//?号占位符
$sql="select * from user where user_name=? and user_pwd=?";
$stmt=$dbh->prepare($sql);//准备执行预处理 返回 pdostatement对象
//预处理也可以防止sql注入
//?索引是从1开始的
$stmt->bindParam(1,$user_name,PDO::PARAM_STR);//绑定一个参数到指定的变量名
$stmt->bindParam(2,$user_pwd,PDO::PARAM_STR);//绑定一个参数到指定的变量名
//参数1 占位符语法(命名参数占位符 或?占位符) 参数2绑定的变量的值 参数3 明确指定参数的类型
//PDO::PARAM_STR 字符串 PDO::PARAM_BOOL 布尔类型 PDO::PARAM_INT 整型 PDO::PARAM_NULL 空
$stmt->execute();//执行预处理
//execute 里面的参数必须是数组形式
echo $stmt->rowCount();//影响的行数
四、bindvalue()方法 将一个值绑定到一个参数
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");
$dbh->exec("set names utf8");//设置字符集
$dbh->setAttribute(PDO::ATTR_ERRMODE,1);//开启错误调试
$sql="insert into user value(null,?,?)";
$stmt=$dbh->prepare($sql);//准备执行一个预处理 prepare 也是pdostatement对象
$stmt->bindValue(1,"塞班");//绑定一个值
$stmt->bindValue(2,'123456');
$stmt->execute();//执行预处理
echo $stmt->rowCount();//影响的行数
五、fetchcolumn()方法 从结果集中返回一列数据 取回数据,则没有办法返回同一行的另外一列fetchcolumn()函数使用一次,指针向下移动一位
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");
$dbh->exec("set names utf8");//设置字符集
$dbh->setAttribute(PDO::ATTR_ERRMODE,1);//开启错误调试
$sql="select * from user";//组织sql语句
$stmt=$dbh->query($sql);//执行查询语句
echo $stmt->fetchColumn(1);//获取一列的值 0是第一列 1 是第二列 2
echo $stmt->fetchColumn(1);
echo $stmt->fetchColumn(1);
echo $stmt->fetchColumn(1);
此处要注意的是fetchColumn方法执行一次指针向下移动。注意从0开始数
六、debugDumpParams()打印一条 SQL 预处理命令
//建立与数据库的连接并选择数据库
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1803A', "root", "root");
$dbh->exec("set names utf8");//设置字符集
$dbh->setAttribute(PDO::ATTR_ERRMODE,1);//开启错误调试
$sql="insert into user value(null,?,?)";
$stmt=$dbh->prepare($sql);//准备执行一个预处理 prepare 也是pdostatement对象
$stmt->bindValue(1,"塞班");//绑定一个值
$stmt->bindValue(2,'123456');
$stmt->execute();//执行预处理
print_r($stmt->debugDumpParams());
echo $stmt->rowCount();//影响的行数
PHP PDO预定义常量 详见网址:
PDO与mysql的效率
测试效率
注函数解释
运行结果
sql语句的执行速度
PDO的测试代码
//测试pdo与mysqli的效率
//通过插入1000条数据,比较效率
//建立与数据库的连接并选择数据库
$start=microtime(true);//返回当前的时间戳和微秒数 //参数 true返回时间戳加微秒数
for($i=0;$i<=1000;$i++){
$dsn="mysql:host=127.0.0.1;dbname=1803A";
$dbh = new PDO($dsn, "root", "root");
$dbh->exec("set names utf8");//设置字符集
$sql="insert into user values(null,'懒羊羊','123456')";//组织sql语句
$dbh->exec($sql);
}
$end=microtime(true);
$time=$end-$start;
echo "执行的时间为".$time;
/*echo "<br/>";
echo time();//时间戳 从1970年1月1日到现在所经历的秒数 厝里1970之前的和2038年之后*/
mysqli的测试代码
<?php
//测试pdo与mysqli的效率
//通过插入1000条数据,比较效率
//建立与数据库的连接并选择数据库
$start=microtime(true);//返回当前的时间戳和微秒数 //参数 true返回时间戳加微秒数
for($i=0;$i<=1000;$i++){
$link=mysqli_connect('127.0.0.1','root','root','1803A');
mysqli_query($link,'set names gbk');//设置字符集
$sql="insert into user values(null,'懒羊羊','123456')";//组织sql语句
mysqli_query($link,$sql);
}
$end=microtime(true);
$time=$end-$start;
echo "执行的时间为".$time;
/*echo "<br/>";
echo time();//时间戳 从1970年1月1日到现在所经历的秒数 厝里1970之前的和2038年之后*/
运行结果
get与post的区别
post与get的区别
get提交的数据会附加在url地址栏上(明文) 大小一般在2kb左右
post提交的数据会http协议包的方式发送,默认是没有大小限制的,受环境配置文件(php.ini)的影响
post比较安全一些,get提交速度快

浙公网安备 33010602011771号