本文整理PHP下PDO连接MySQL示例,打算把服务器PHP升级,之前的MySQL扩展已不再支持,所以只能把早前的程序作了大量修改,本文整理PDO连接MySQL简要实例,供MySQL PDO应用入门参考。全文代码均做测试,环境APACHE 2.4/PHP 5.5/MYSQL 5.6。
一、PHP PDO扩展支持
从PHP 5开始,已经支持sqlite、mysql、pgsql、mssql等数据的pdo扩展,此配置均可在php.ini配置文件中开启或关闭(;extension=php_pdo_mysql.dll),如果是CentOS、Ubuntu等系统安装最新PHP支持包,一般均会默认开启MySQL PDO扩展模块支持。
二、PDO连接MySQL
$dbhost="localhost";
$dbname="test";
$dbusr="root";
$dbpwd="";
$dbhdl=NULL;
$dbstm=NULL;
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',);
$dsn='mysql:host=' . $dbhost . ';port=3306;dbname=' . $dbname;
try {
$dbhdl = new PDO($dsn, $dbusr, $dbpwd, $opt);
//dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT);//Display none
//dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);//Display warning
$dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//Display exception
} catch (PDOExceptsddttrtion $e) {//return PDOException
print "Error!: " . $e->getMessage() . "
";
die();
}
上述代码中,PDO连接有两个需要注意地方:dsn和option,这两部分定义可参考:
http://www.php.net/manual/zh/pdo.construct.php
http://www.php.net/manual/zh/ref.pdo-mysql.php
关于PDO数据库的持久连接问题可参考:http://php.net/manual/zh/pdo.connections.php,大意就是在option中增设array(PDO_ATTR_PERSISTENT => true)。使用持久连接在脚本结束后不会被关闭,且被缓存,当另一个使用相同凭证的脚本连接请求时被重用。持久连接缓存可以避免每次脚本需要与数据库回话时建立一个新连接的开销,从而让 web 应用程序更快。
PDO连接数据库的关闭,参考下文说明。
三、PDO INSERT/UPDATE/DELETE
$dbhdl->exec("INSERT INTO foo(name, age) VALUES('Joe', '25')");
$dbhdl->exec("INSERT INTO foo(name, age) VALUES('Kate', '20')");
$dbhdl->exec("UPDATE foo SET name='Tom' WHERE Id='1'");
$dbhdl->exec("DELETE FROM foo WHERE Id='1'");
使用PDO::exec还可搭配事务批处理(PDO::beginTransaction和PDO::commit)使用,其大概意思就是从beginTransaction直到commit为止,中间的操作都是在内存中进行,直到我们执行commit才会提交到最终数据库修改,否则随时可以回滚动作。
执行DROP TABLE 或 CREATE TABLE等指令除外,此类操作会隐式commit提交,无法回滚。
四、PDO SELECT
PDO查询可以使用PDO::query也可使用PDOStatement::execute,实例如下:
//Query SELECT
$dbstm = $dbhdl->query('SELECT * from foo LIMIT 0,1');
$rows = $dbstm->fetchAll(PDO::FETCH_ASSOC);//$rows = $dbhdl->Fetch();
print_r($rows);
//execute testing
$name = "Johe";
$age="12";
//execute 1
$dbstm = $dbhdl->prepare("INSERT INTO foo(name, age) VALUES (:name,:age)");
$dbstm->execute(array(':name' => $name,'age'=>$age));
//execute 2
$dbstm = $dbhdl->prepare("INSERT INTO foo(name, age) VALUES (:name,:age)");
$dbstm->bindParam(':name', $name);
$dbstm->bindParam(':age', $age);
$dbstm->execute();
//execute 3
$dbstm = $dbhdl->prepare("INSERT INTO foo(name, age) VALUES (?, ?)");
$dbstm->bindParam(1, $name);
$dbstm->bindParam(2, $age);
$dbstm->execute();
//execute 4
$dbstm = $dbhdl->prepare("INSERT INTO foo(name, age) VALUES (?, ?)");
$dbstm->execute(array($name, $age));
代码中PDOStatement::execute操作方式有好几种,随个人爱好而定,最终执行结果均相同。
PDO SELECT有个问题就是读取行数没有直接的方法:
$stmt = $dbhdl->query(“SELECT count(*) from foo;”);
$row = $stmt->fetch();
$rowCount = $row[0];
以上这三句是目前主流的统计方法。
五、PDO关闭连接
PDO连接数据成功后,返回一个 PDO 类的实例给脚本(上文中的$dbhdl),此连接在 PDO 对象的生存周期中保持活动。要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个 NULL 值给对象变量。如果不赋值 NULL,PHP 也会在脚本结束时会自动关闭连接。