Mysql-pdo 最好教程:En

老版本 (php5-): mysql扩展: mysql_* 如: mysql-connect() 打开数据库连接.已过时. 新版本 (php5+): mysqli / pdo 扩展.

PDO 启用: 默认都是自动开启的.

修改 php.ini 文件. Mac 自带php 路径: /usr/local/etc/php/php7.1/php.ini MAMP php路径: /Applications/MAMP/bin/php/php5.6.10/conf/php.ini

PDO 扩展 给php 访问各种数据库定义了一个轻量级的一致接口 适用 mysql sqlserver…

PDO拥有更好的编程接口,你可以使用它写出更加简洁,高效,安全的代码。

安全方面: 可以防止 sql 注入 .因为 预先编译了 任何命令都传不进sql.

PDO是类. 所以php里面只要 new 就能新建了.

PDO 连接数据库:

只需要一行 就能连接到 mysql. db = new PDO(‘mysql:host=localhost;dbname=test;charset=utf8’, ‘username’, ‘password’);

*- 创建一个PDO对象,参数包括 DSN, username, password 。 DSN 告诉PDO该使用哪一种数据库驱动 和 一些连接信息的字符串 注意:确保DSN中设置了字符编码信息,否则将可能返回字符编码设置错误的信息,

PDO 常用方法

PDO::query 有结果返回的操作 如: select PDO::exec 没有结果返回的操作 如: insert update .. PDO::lastinsertid 返回上传插入操作. 自增ID PDOStatement::fetch 获取一条记录. PDOStatement::fetchAll 获取所有记录集中到一个.

获取数据行数(Getting Row Count)

获取最后操作ID(Getting the Last Insert Id)

执行 INSERT, UPDATE, DELETE 操作

1 affected_rows = db->exec(“UPDATE table SET field=’value’”); 2 echo affected_rows.’ were affected’

$dbms=’mysql’ // 数据库类型 $host=’localhost’ // 数据库主机名 $dbName=’test’; // 要使用的数据库名字 $user=’root’; // 数据库连接用户名 $pass=’’; // 用户名对应密码
$dsn=”$dbms:host=$host;dbname=$dbName”;

try { $dbh = new PDO{$dsn, $user, $pass}; echo “connect succesfull “;

foreach ($dbh->query(‘SELECT * from FOO’) as $row) { print_r($row);} echo($GLOBAL); //来看到这些值.

$dbh = null; }

catch (PDOException $e) { die (“Error!: “ . $e->getMessage() . “<br/>”); } //默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样: $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

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 — 为语句设置默认的获取模式。

既然PDO实例的prepare方法比query方法要多一步,为什么不直接用query呢?parepare还有什么用呢?

用处可大了,事实上我们大多数情况,都是用prepare,而不是query,原因就是prepare可以写带”参数“的sql语句。 例如 $ps = $obj->prepare(“SELECT * FROM article WHERE id = ?”); 大家看到区别了吗?我后面那个id = 1, 换乘 id = ?了,这个问号就代表一个参数,这个参数是可以修改的。 例如我们这样写  $ps->bindValue(1 , 10); 这句代码的意思就是把sql语句中的第一个问号,替换成10,这样一来,我们执行$ps->execute(); 实际上是执行了 SELECT * FROM article WHERE id = 10。 需要注意的是,bindValue这里的第二个参数已经过滤的敏感字符,无需再次过滤,更不需要加引号什么的,直接用字符串或数字的值就行。 执行查询语句之后,我们可以通过fetch或fetchAll函数来获得查询结果,两个函数,一个是返回一条记录,一个是返回所有记录。

我说了一大堆,也不知道说清楚没有,写一个完整的实例吧。

<?php try{ $obj = new PDO(‘mysql:host=localhost;dbname=localhost’ ,  ‘root’  ,  ‘123456’);//生成PDO示例 $obj ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//设置以异常的形式报错 $obj ->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );//设置fetch时返回数据形式为数组 $ps = $obj->prepare(“SELECT *  FROM article WHERE type = ? and menu = ?”);//生成一个PDOStatement实例 $ps->bindValue(1 , “文章”);//第一个?处的参数换成 文章,不需要附加任何处理 $ps->bindValue(2 , 2);//第二个?处的参数换成2,不需要附加任何处理 $ps->execute(); //正式执行。 $res = $ps->fetchAll();//得到查询结果 } catch(Exception $e){ exit($e->getMessage()); } ?>

pdo 2

创建实例子:

$obj = new PDO(‘mysql:host=localhost;dbname=数据库名;charset=utf8’ , 用户名 , 密码); obj 变量名 可自取. 可以看成一大串代码的 缩写. 方便之后使用. 因为可以连接多个数据库. 所以要取名 来区分. new pdo 新建连接 来连接一个数据库 mysql: 数据库类型 : mysql sql sqlserver … 等等 host= 主机名: 一般是 localhost 或者 localhost:33060 daname= 要连接数据库的名字. 之后的操作 都是在这个数据库下执行的. charset=  编码!! 用户名,密码 连接数据库的帐号密码..

实例: $db = new PDO( 'mysql:host=localhost;dbname=bbs;charset=utf8', 'root', 'root' );

执行数据库命令 exec()

$db -> exec(sql 语句)

php 设置参数:

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

PDOStatement操作

PDOStatement是另一个类,其实例可以由PDO实例的prepare或query方法生成, 通常我们操作数据库都是用这个类,而不是直接用PDO类,这个类方法很完善,也很安全。