这个厉害了,PDO可以连接12种不同的数据库,但是因为电脑只装了MySQL,Access似乎没有驱动,所以只有MySQL的例子了。
Note:要使用PDO这个类还要将驱动安装上,就是修改你PHP安装目录下的 php.ini 文件,直接Ctrl+F 查找
extension=php_pdo.dll
将它前面的分号去掉! 这一步在PHP 5.3或更高版本中不是必须的。然后把具体数据库DLL前面分号也去掉。对于这些扩展功能,我建议全部都去掉前面的分号,说不定以后用的着。
还有重要一点是,重启你的PHP服务,这些东西才会生效!!!!
extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_informix.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
<html>
<body>
<h2>PDO 连接数据库</h2>
<?php
// PDO 方式操作适用多种数据库 PDO 应用在 12 种不同数据库中
$servername = "localhost";
$username = "root";
$password = "";
$myDb = "mydbPDO";
try {
// 创建MySQL链接对象
$conn = new PDO("mysql:host=$servername;dbname=$myDb", $username, $password);
echo "连接成功!";
} catch (PDOException $e) {
echo $e -> getMessage();
}
?>
<h2>创建数据库</h2>
<?php
try {
// 设置 PDO 错误模式为异常
$conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "create database " . $myDb;
// 使用exec(),因为没有结果返回
// $conn -> exec($sql);
echo "数据库创建成功!<br>";
echo "<h2>新建表</h2>";
$sql2 = "create table myGuests (
id int(6) unsigned auto_increment primary key,
firstname varchar(30) not null,
lastname varchar(30) not null)";
// 执行 sql 语句
// $conn -> exec($sql2);
echo "数库表 myGuests 创建成功!";
echo "<h2>插入 数据 </h2>";
//$sql3 = "insert into myGuests (id, firstname, lastname) values (0,'Json','Doe')";
// $sql3 = "insert into myGuests (id, firstname, lastname) values (0,'范','玮琪')"; // 插入
// $sql3 = "delete from myGuests where firstname = 'John0'"; // 删除
$sql3 = "update myGuests set firstname = 'John0' where id = 5"; // 更新
$conn -> exec($sql3);
echo "插入数据成功!";
echo "<h2>插入多条数据</h2>";
// 开始事务
$conn -> beginTransaction();
// sql语句
for ($i = 0; $i < 5; $i++) {
// $conn -> exec("insert into myGuests (id, firstname, lastname) values (0, 'John$i','Deo')");
}
// 提交事务
$conn -> commit();
echo "新记录插入成功";
} catch (PDOException $e) {
// 如果执行失败回滚
$conn -> rollback();
echo "<br>" . $e -> getMessage();
}
?>
<h2>预处理语句</h2>
<?php
try {
$conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql4 = "insert into myGuests(firstname, lastname) values (:firstname, :lastname)";
// 预处理 sql 并绑定参数
$stmt = $conn -> prepare($sql4);
$stmt -> bindParam(':firstname', $fname);
$stmt -> bindParam(':lastname', $lname);
// 插入行
$fname = "MD";
$lname = "EF";
// $stmt -> execute();
// 插入其他行
$fname = "Mary";
$lname = "Moe";
// $stmt -> execute();
echo "插入新记录成功!";
} catch (PDOException $e) {
echo "ERROR:" . $e -> getMessage();
}
?>
<h2>PDO+(预处理)</h2>
<?php
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th></tr>";
/**
*
*/
class TableRows extends RecursiveIteratorIterator // 继承递归迭代器
{ // 加一个下划线的函数为私有的
// 加两个下划线的函数一般都是系统默认的,系统预定义的 包括 __construct、__destruct、__clone、__toString
// __construct 构造方法,当一个对象创建时调用此方法
function __construct($it)
{
// ::引用类里面的静态方法或者属性,而且不需要实例化!
// parent::__construct 调用父类的 __construct 方法
// self 表示调用自身
parent::__construct($it, self::LEAVES_ONLY);
}
function current()
{
return "<td style='width:150px; border:1px solid black;''>" . parent::current() . "</td>";
}
function beginChildren()
{
echo "<tr>";
}
function endChildren()
{
echo "</tr>" . "\n";
}
}
try {
$conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt2 = $conn -> prepare('select id, firstname, lastname from myGuests');
$stmt2 -> execute();
// 设置结果集为关联数组
$result = $stmt2 -> setFetchMode(PDO::FETCH_ASSOC);
// print_r($stmt2 -> fetchAll());
foreach (new TableRows(new RecursiveArrayIterator($stmt2 -> fetchAll())) as $key => $value) {
echo $value;
}
} catch (PDOException $e) {
echo "ERROR" . $e -> getMessage();
}
echo "</table>";
?>
<?php
// 关闭连接 这好习惯要有
$conn = null;
?>
</body>
</html>