开启mysql扩展为例
前期:php文件中的ext文件夹中包含php_pdo_mysql.dll扩展文件修改php.ini文件,把extension = php_pdo_mysql.dll(extension=pdo_mysql)前的;去掉,然后重新启动php.exe程序(或重启apache);使用phpinfo()进行检查是否已启动PDO扩展语法:PDO::__construct ( string d s n ‘ [ , s t r i n g ‘ dsn` [, string ` dsn‘[,string‘username[, string p a s s w o r d ‘ [ , a r r a y ‘ password` [, array ` password‘[,array‘driver_options]]] )
$dsn 数据源$username 用户名$password 密码代码实现
<?php /* 创建一个连接mysql数据库的pdo对象 */ $dsn = 'mysql:dbname=testdb;host=127.0.0.1;charset=utf8'; $user = 'dbuser'; $password = 'dbpass'; try { $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); } ?>描述:设置数据库句柄的属性
语法:bool PDO::setAttribute(int $attribute,mixed $value)
注意:PDO内置了以下可用的通用属性,使用参考 手册
PDO::ATTR_CASE 强制列名为指定的大小写PDO::ATTR_ERRMODE 错误报告PDO::ATTR_DEFAULT_FETDH_MODE 默认的提取模式返回值:成功返回true,失败返回false
<?php //创建一个连接mysql数据库的PDO对象 $dsn = 'mysql:dbname=pdotest;host=127.0.0.1;charset=utf8'; $user = 'root'; $password = 'root'; try{ $pdo = new PDO($dsn,$user,$password); //设置PDO属性 设置从结果集中提取值 FETCH_ASSOC为关联数组 FETCH_NUM枚举 $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC); //查询结果集 $sql = "SELECT * FROM user ORDER BY id DESC"; $rel = $pdo->query($sql); //遍历结果集 foreach($rel as $v){ echo "<pre>"; var_dump($v); } }catch(PDOException $e){ echo "Connection faile:".$e->getMessage(); }输出结果如下:
array(4) { ["id"]=> string(1) "4" ["name"]=> string(6) "xiaode" ["age"]=> string(2) "99" ["sex"]=> string(1) "1" }示例1:使用命名参数方式示例
<?php //创建一个连接mysql数据库的PDO对象 $dsn = 'mysql:dbname=pdotest;host=127.0.0.1;charset=utf8'; $user = 'root'; $password = 'root'; try{ $pdo = new PDO($dsn,$user,$password); //设置异常捕捉 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //使用命名参数进行绑定 $sql = "INSERT INTO user(name,age,sex) VALUES(:name,:age,:sex)"; //对内容进行预编译 $stmt = $pdo->prepare($sql); //对占位数据进行绑定 $stmt->bindValue(':name','rufeike'); $stmt->bindValue(':age',30); $stmt->bindValue(':sex',0); //执行已预编译的sql $rel=$stmt->execute(); //获取最后插入的id $id=$pdo->lastInsertId(); var_dump($id); }catch(PDOException $e){ echo "Connection faile:".$e->getMessage(); echo "错误编号:".$e->getCode(); echo "错误行号:".$e->getLine(); }示例2:使用问号参数绑定
<?php //创建一个连接mysql数据库的PDO对象 $dsn = 'mysql:dbname=pdotest;host=127.0.0.1;charset=utf8'; $user = 'root'; $password = 'root'; try{ $pdo = new PDO($dsn,$user,$password); //设置异常捕捉 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //使用问号参数绑定方式 $sql = "INSERT INTO user(name,age,sex) VALUES(?,?,?)"; //对sql语句进行预编译 $stmt = $pdo->prepare($sql); //对占位符进行数据绑定 $stmt->bindValue(1,'如非客2'); $stmt->bindValue(2,28); $stmt->bindValue(3,1); //执行已编译的sql $rel = $stmt->execute(); //获取最后出入的主键 $id = $pdo->lastInsertId(); var_dump($id); }catch(PDOException $e){ echo "Connection faile:".$e->getMessage(); echo "错误编号:".$e->getCode(); echo "错误行号:".$e->getLine(); }结果输出
array(4) { ["id"]=> string(1) "4" ["name"]=> string(6) "xiaode" ["age"]=> string(2) "99" ["sex"]=> string(1) "1" } array(4) { ["id"]=> string(1) "3" ["name"]=> string(6) "xiaode" ["age"]=> string(2) "99" ["sex"]=> string(1) "1" }输出结果
array(4) { [0]=> array(4) { ["id"]=> string(1) "4" ["name"]=> string(6) "xiaode" ["age"]=> string(2) "99" ["sex"]=> string(1) "1" } [1]=> array(4) { ["id"]=> string(1) "3" ["name"]=> string(6) "xiaode" ["age"]=> string(2) "99" ["sex"]=> string(1) "1" } }输出结果:
int(4)静默模式:错误发生后,不会主动报错
可以通过PDO::erroCode和PDO::errorInfo()两个方法获取默认为静默模式 <?php //创建一个连接mysql数据库的PDO对象 $dsn = 'mysql:dbname=pdotest;host=127.0.0.1;charset=utf8'; $user = 'root'; $password = 'root'; try{ $pdo = new PDO($dsn,$user,$password); //静默模式下获取错误信息 $sql = "SELECT * FROM user WHERE abc = 'abc'"; $stmt = $pdo->query($sql); echo "查询错误编号:".$pdo->errorCode(); echo "查询错误信息:".print_r($pdo->errorInfo()); }catch(PDOException $e){ echo "Connection faile:".$e->getMessage(); }错误信息打印结果:
查询错误编号:42S22Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'abc' in 'where clause' ) 查询错误信息:1没有错误是的打印结果 errorCode为00000时表示没有错误
查询错误编号:00000Array ( [0] => 00000 [1] => [2] => ) 查询错误信息:1警告模式:错误发生后,通过PHP标准来报错误
设置错误模式为警告模式,错误结果根据php错误模式,直接在页面中输出PDO::setAttribute(PDO::Attr_ERRMODE,PDO::ERRMODE_WARNING);这种方式不安全,会暴露系统相关信息 <?php //创建一个连接mysql数据库的PDO对象 $dsn = 'mysql:dbname=pdotest;host=127.0.0.1;charset=utf8'; $user = 'root'; $password = 'root'; try{ $pdo = new PDO($dsn,$user,$password); //设置警告模式 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); //警告模式下获取错误信息 数据库中没有i字段 $sql = "SELECT * FROM user WHERE i = 2"; $stmt = $pdo->query($sql); }catch(PDOException $e){ echo "Connection faile:".$e->getMessage(); }错误打印结果
Warning: PDO::query(): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'i' in 'where clause' in C:\Users\rufeike\Desktop\phasher\test\index.php on line 52异常模式:错误发生后,抛出异常,需要捕捉和处理
提示:可以通过PDO::setAttribute()更改模式 <?php //创建一个连接mysql数据库的PDO对象 $dsn = 'mysql:dbname=pdotest;host=127.0.0.1;charset=utf8'; $user = 'root'; $password = 'root'; try{ $pdo = new PDO($dsn,$user,$password); //设置异常模式 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //异常模式下获取错误信息 $sql = "SELECT * FROM user WHERE i = 2"; $stmt = $pdo->query($sql); }catch(PDOException $e){ echo "Connection faile:".$e->getMessage(); echo "错误编号:".$e->getCode(); echo "错误行号:".$e->getLine(); }错误打印结果
Connection faile:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'i' in 'where clause'错误编号:42S22错误行号:52