PHP连接MYSQL数据库时有三种常见的方式:
PHP的mysql扩展
PHP的mysqli扩展
PHP数据对象(PDO)
mysql是PHP应用与MySQL数据库交互的早期扩展。mysql扩展提供了一个面向过程的接口,并且是针对MySQL4.1.3或更早版本设计的。因此,这个扩展虽然可以与MySQL4..1.3或更新的数据库服务端进行交互,但并不支持后期MySQL服务端提供的一些特性。
Note:
如果使用MySQL4.1.3或更新的服务端版本,强烈建议你使用mysqli扩展替代它。
mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用MySQL4.1.3或更新版本中新的高级特性。mysqli扩展在PHP 5及以后版本中包含。
mysqli在提供了面向对象接口的同时也提供了一个面向过程的接口。
mysqli扩展有一系列的优势,相对于mysql扩展的提升主要有:
面向对象接口
prepared语句支持
多语句执行支持
事物支持
增强的调试能力
嵌入式服务支持
Note:
如果你使用MySQL4.1.3或更新版本,强烈建议你使用这个扩展。
PDO数据对象,是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得你的PHP应用不去关心具体要连接的数据库服务器系统类型。也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器,比如从Firebrid到MySQL,仅仅需要修改很少的PHP代码。
其他数据库抽象层的例子包括Java应用中的JDBC以及Perl中的DBI。
当然,PDO也有它自己的先进性,比如一个干净的,简单的,可移植的API,它最主要的缺点是会限制让你不能使用 后期MySQL服务端提供所有的数据库高级特性。比如,PDO不允许使用MySQL支持的多语句执行。(这个有待考证,有回复表示PHP5.3以后PDO就支持多语句执行了)
下表比较了PHP中三种主要的MySQL连接方式的功能(可能并不是最新版本,比如官网写的PDO不支持多语句执行,但是更新的版本里似乎解决了这一问题。):
一些小细节:
mysqli扩展的持久化连接在PHP5.3中被引入。支持已经存在于PDO MYSQL和ext/mysql中。持久化连接背后的思想是客户端进程和数据库之间的连接可以通过一个客户端进程来保持重用,而不是多次的创建和销毁。着降低了每次需要创建一个新连接的开销,未使用的连接被缓存起来并且准备随时被重用。
不像mysql扩展,mysqli没有提供一个特殊的方法用于打开持久化连接。需要打开一个持久化连接时,你必须在连接时在主机名前增加p:。
使用持久化连接的问题在于它们可能在客户端处于不可预知的状态。比如,一个表锁可能在客户端意外终止之前被激活。一个新的客户端进程重用这个持久化连接就会“按照原样”得到这个连接。这样,一个新的客户端进程为了更好地使用持久化连接,就需要做任何可能的清理工作,这样就增加了对程序员的负担。
mysqli::query和mysqli_query
面向对象风格:mixed mysqli::query(string $query [, int $resultmode = MYSQLI_STORE_RESULT])
范例:
<?php
$mysqli = new mysqli("localhost","my_user","my_password","world");
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
/* Create table doesn't return a resultset */
if ($mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) {
printf("Table myCity successfully created.\n");
}
/* Select queries return a resultset */
if ($result = $mysqli->query("SELECT Name FROM City LIMIT 10")) {
printf("Select returned %d rows.\n", $result->num_rows);
/* free result set */
$result->close();
}
/* If we have to retrieve large amount of data we use MYSQLI_USE_RESULT */
if ($result = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT)) {
/* Note, that we can't execute any functions which interact with the
server until result set was closed. All calls will return an
'out of sync' error */
if (!$mysqli->query("SET @a:='this will not work'")) {
printf("Error: %s\n", $mysqli->error);
}
$result->close();
}
$mysqli->close();
if
>
过程化风格:mixed mysqli_query(mysql $link, string $query [, int $resultmode = MYSQLI_STORE_RESULT])
范例:
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Create table doesn't return a resultset */
if (mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) {
printf("Table myCity successfully created.\n");
}
/* Select queries return a resultset */
if ($result = mysqli_query($link, "SELECT Name FROM City LIMIT 10")) {
printf("Select returned %d rows.\n", mysqli_num_rows($result));
/* free result set */
mysqli_free_result($result);
}
/* If we have to retrieve large amount of data we use MYSQLI_USE_RESULT */
if ($result = mysqli_query($link, "SELECT * FROM City", MYSQLI_USE_RESULT)) {
/* Note, that we can't execute any functions which interact with the
server until result set was closed. All calls will return an
'out of sync' error */
if (!mysqli_query($link, "SET @a:='this will not work'")) {
printf("Error: %s\n", mysqli_error($link));
}
mysqli_free_result($result);
}
mysqli_close($link);
?>