1、PHP PDO连接连接管理
$dbms='mysql'; //数据库类型
$host='localhost'; //数据库主机名
$dbName='test'; //使用的数据库
$user='root'; //数据库连接用户名
$pass=''; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
echo "连接成功
";
/*你还可以进行一次搜索操作
foreach ($dbh->query('SELECT * from FOO') as $row) {
print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
}
*/
// 现在运行完成,在此关闭连接
$dbh = null;
} catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "
");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
//注意:如果想使用持久连接,必须在传递给 PDO 构造函数的驱动选项数组中设置 PDO::ATTR_PERSISTENT 。如果是在对象初始化之后用 PDO::setAttribute() 设置此属性,则驱动程序将不会使用持久连接。
$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
//很多 web 应用程序通过使用到数据库服务的持久连接获得好处。
//持久连接在脚本结束后不会被关闭,且被缓存,当另一个使用相同凭证的脚本连接请求时被重用。
//持久连接缓存可以避免每次脚本需要与数据库回话时建立一个新连接的开销,从而让 web 应用程序更快。
2、PDO事务与自动提交
用 PDO::beginTransaction() 方法来启动。如果底层驱动不支持事务,则抛出一个 PDOException 异常(不管错误处理设置是怎样的,这都是一个严重的错误状态)。
当脚本结束或连接即将被关闭时,如果尚有一个未完成的事务,那么 PDO 将自动回滚该事务
try {
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//设置在调试期间也非常有用
//也可以在构造时修改错误模式
//$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
$dbh->beginTransaction();
$dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
$dbh->exec("insert into salarychange (id, amount, changedate)
values (23, 50000, NOW())");
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
echo "Failed: " . $e->getMessage();
}
3、预处理语句与存储过程
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// 插入一行
$name = 'one';
$value = 1;
$stmt->execute();
// 用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();
?>
$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);
// 调用存储过程
$stmt->execute();
print "procedure returned $return_value\n";
?>
3、大对象 (LOBs)
"大"通常意味着"大约 4kb 或以上",尽管某些数据库在数据达到"大"之前可以轻松地处理多达 32kb 的数据。大对象本质上可能是文本或二进制。
在 PDOStatement::bindParam() 或 PDOStatement::bindColumn()) 调用中使用 PDO::PARAM_LOB 类型码可以让 PDO 使用大数据类型。
PDO::PARAM_LOB 告诉 PDO 作为流来映射数据,以便能使用 PHP Streams API 来操作
//读取
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("select contenttype, imagedata from images where id=?");
$stmt->execute(array($_GET['id']));
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
header("Content-Type: $type");
fpassthru($lob);
?>
//写入
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
$id = get_new_id(); // 调用某个函数来分配一个新 ID
// 假设处理一个文件上传
// 可以在 PHP 文档中找到更多的信息
$fp = fopen($_FILES['file']['tmp_name'], 'rb');
$stmt->bindParam(1, $id);
$stmt->bindParam(2, $_FILES['file']['type']);
$stmt->bindParam(3, $fp, PDO::PARAM_LOB);
$db->beginTransaction();
$stmt->execute();
$db->commit();
?>
PDO对预处理语句的支持需要使用PDOStatement类对象,所以PDOStatement类只是PDO的一部分,这个类比较大作用是防止sql注入
4、接口详细
PDO::__construct //就是new PDO调用的函数,创建一个表示数据库连接的 PDO 实例(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::beginTransaction ( void )//启动一个事务(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::commit//提交一个事务(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::rollBack // 回滚一个事务(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::inTransaction // 检查是否在一个事务内(PHP 5 >= 5.3.3, Bundled pdo_pgsql)
PDO::setAttribute // 设置属性(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::getAttribute // 取回一个数据库连接的属性(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::errorCode //获取跟数据库句柄上一次操作相关的 SQLSTATE(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::getAvailableDrivers // 返回一个可用驱动的数组(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::lastInsertId // 返回最后插入行的ID或序列值(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::quote // 为SQL语句中的字符串添加引号。(PHP 5 >= 5.1.0, PECL pdo >= 0.2.1)
PDO::errorInfo //返回最后一次操作数据库的错误信息(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::exec //执行一条 SQL 语句,并返回受影响的行数(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::prepare //预处理 准备要执行的SQL语句并返回一个 PDOStatement 对象(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO::query // 执行 SQL 语句,返回PDOStatement对象,可以理解为结果集(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
//PDOStatement对象由PDO->query()和PDO->prepare()返回
PDOStatement::setAttribute //设置一个语句属性(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
PDOStatement::rowCount // 返回受上一个 SQL (DELETE、INSERT、 或 UPDATE )语句影响的行数(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDOStatement::execute // 执行一条预处理语句(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDOStatement::columnCount // 返回结果集中的列数。(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
PDOStatement::bindValue // 把一个值绑定到一个参数(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDOStatement::bindParam// 绑定一个参数到指定的变量名(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDOStatement::bindColumn // 绑定一列到一个 PHP 变量(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDOStatement::closeCursor // 关闭游标,使语句能再次被执行。(PHP 5 >= 5.1.0, PECL pdo >= 0.9.0)
PDOStatement::debugDumpParams // 打印一条 SQL 预处理命令(PHP 5 >= 5.1.0, PECL pdo >= 0.9.0)
PDOStatement::fetch // 从结果集中获取下一行(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDOStatement::fetchAll// 返回一个包含结果集中所有行的数组(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDOStatement::fetchColumn // 从结果集中的下一行返回单独的一列。(PHP 5 >= 5.1.0, PECL pdo >= 0.9.0)
PDOStatement::fetchObject // 获取下一行并作为一个对象返回。(PHP 5 >= 5.1.0, PECL pdo >= 0.2.4)
PDOStatement::getColumnMeta // 返回结果集中一列的元数据(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
PDOStatement::nextRowset // 在一个多行集语句句柄中推进到下一个行集(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
PDOStatement::setFetchMode //为语句设置默认的获取模式。(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
PDOStatement::getAttribute // 检索一个语句属性(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDO中包含三个预定义的类,它们分别是PDO、PDOStatement、PDOException
PDO:
PDO->setAttribute();
全局属性设置,包括:列名格式和错误提示类型
PDO->query($sql);
常用于执行有返回的sql查找语句,但执行之前要手动转义,返回PDOStatement对象
PDO->exec($sql);
执行没有返回的sql语句,同样要手动转义,有插入、修改、删除操作。返回影响的行数
PDO->lastInsertId();
返回最后一次执行插入的主键值,如果一条语句多次插入则返回第一个主键值:id+rows-1
PDO->beginTransaction();
事务的开启,中间加入多条关联的可执行sql语句,进行块化处理,也叫(回滚起点)
PDO->commit();
事务结束,即回滚结束
PDO->rollback();
事务的回滚处理,即回滚到原起点
PDO->quto($sql);
将$sql语句手动转义,进而进入下一次的处理
PDO->prepare($sql);
生成一个新的编译模板,用于以后的多次重复执行,返回一个PDOStatement对象
PDO->__construct();
建立一个PDO数据库连接对象实例
PDO->errorCode();
捕获PDO错误代码
PDO->errorInfo();
捕获PDO错误信息,返回信息数组
PDO->getAttribute();
获取一个数据库连接对象的属性信息
PDO->getAvailableDriver();
获取有效PDO连接的驱动名称
PDOStatement对象由PDO->query()和PDO->prepare()返回:
PDOStatement->fetch();
以指定格式每次返回一条记录,通常和while配合遍历出内容
PDOStatement->fetchAll();
以指定格式一次性返回所有内容
PDOStatement->fetchColumn(intnum);
返回指定字段索引的一个值,每次返回指定字段的一行,即一个内容值。配合while遍历
PDOStatement->fetchObject();
以面向对象的风格每次返回一条记录,配合while遍历
PDOStatement->bindColumn();
将查找记录集中的列与变量相绑定,进而用变量获取相应列的行内容,用$smt->fetch(::BOUBD)进行遍历
PDOStatement->bindParam();
以引用方式绑定一个变量到占位符,从而完成编译!因为是引用所以可以重复多次
PDOStatement->bindValue();
同上,但只能绑定一次
PDOStatement->closeCursor();
关闭当前的模板编译链接,为下次创建好的模板链接做好准备。(即模板只能有一个链接)
PDOStatement->excute();
执行编译模板,有两种格式。1.先编译后执行,2.边编译边执行
PDOStatement->columnCount();
返回PDOStatement结果集列的总数
PDOStatement->rowCount();
返回PDOStatement结果集行的总数
PDOStatement->nextRowset();
常配合fetch()和fetchAll()判断下一条记录是否存在,以便继续遍历出下一条记录
PDOStatement->errorCode();
返回错误代码
PDOStatement->errorInfo();
返回错误信息