数据管理函数
PHP提供了一系列函数,该等函数经设计用来告诉你你想知道的关于MySQL客户端和服务器的一切事情(比如,他们的版本号、可用数据库的总数、每个数据库中的表格数目、正在运行的进程数等等你命名的,可能都在那里)。下面是一个使用这些函数给你一幅关于MySQL关系数据库管理系统内部正在发生的事情的画面的例子。
<html> <head> <basefont face="Arial"> </head> <body> <?php // set server access variables $host = "localhost"; $user = "root"; $pass = "guessme"; $db = "testdb"; // open connection $connection = mysql_connect($host, $user, $pass) or die ("Unable to connect!"); // get database list $query = "SHOW DATABASES"; $result = mysql_query($query) or die ("Error in query: $query. ".mysql_error()); echo "<ul>"; while ($row = mysql_fetch_array($result)) { echo "<li>".$row[0]; // for each database, get table list and print $query2 = "SHOW TABLES FROM ".$row[0]; $result2 = mysql_query($query2) or die ("Error in query: $query2. ".mysql_error()); echo "<ul>"; while ($row2 = mysql_fetch_array($result2)) { echo "<li>".$row2[0]; } echo "</ul>"; } echo "</ul>"; // get version and host information echo "Client version: ".mysql_get_client_info()."<br />"; echo "Server version: ".mysql_get_server_info()."<br />"; echo "Protocol version: ".mysql_get_proto_info()."<br />"; echo "Host: ".mysql_get_host_info()."<br />"; // get server status $status = mysql_stat(); echo $status; // close connection mysql_close($connection); ?> </body> </html>
下面是输出结果可能看上去的样子:

这个脚本的第一部分相当简单:其运行SHOW DATABASES查询来获得数据库列表,然后对列表反复执行SHOW TABLES命令来获得每个数据库内的表格列表。接着,mysql_get_*_info()函数提供了客户端版本号、MySQL版本号、用于MySQL客户和服务器端之间通信的特殊MySQL客户-服务器协议的版本号、当前主机名称以及其如何连接到MySQL服务器等信息。最后,函数mysql_stat()是PHP4.3.0中的新特征,它返回一个包含MySQL服务器状态信息(包括关于服务器正常运行时间、打开的表格、每秒查询次数以及其他统计信息等信息)的字符串。
上面就是所有的内容吗?不,在你离开这里然后开始构建酷的以数据驱动的Web站点之前还没有完全结束,你应该意识到两个MySQL扩展都提供了强大的错误跟踪函数(这可以提高开发效率)。看一下下面的例子,它在SELECT查询字符串中包含了一个蓄意的错误:
<?php // connect $connection = mysql_connect("localhost", "test", "test") or die("Invalid server or user"); mysql_select_db("testdb", $connection) or die("Invalid database"); // query $query = "SELECT FROM symbols"; // result $result = mysql_query($query,$connection); // look for errors and print if(!$result) { $error_number = mysql_errno(); $error_msg = mysql_error(); echo "MySQL error $error_number: $error_msg"; } // disconnect mysql_close($connection); ?>
下面是例子的输出:

如果在你的SQL语句中出现错误,那么mysql_errno()函数显示被MySQL返回的该错误的代码,而mysql_error()函数返回实际的错误消息。将这两个都打开,然后你会发现它们可以明显的减少你花费在修理补丁上的时间。
ext/mysqli代码树包含两个用于连接错误的额外的mysqli_connect_errno()和mysqli_connect_error()函数,该等函数只包含关于连接错误(没有查询相关)的信息。像下面例子那样使用这些函数调试你的MySQL连接中的错误:
<?php // create mysqli object // open connection $mysqli = new mysqli("localhost", "test", "test", "testdb"); // check for connection errors if (mysqli_connect_errno()) { die("Unable to connect: ".mysqli_connect_error()); } // query $query = "SELECT FROM symbols"; // execute query $result = $mysqli->query($query); // look for errors and print if(!$result) { $error_number = $mysqli->errno; $error_msg = $mysqli->error; echo "MySQL error $error_number: $error_msg"; } // disconnect $mysqli->close(); ?>
如果你想知道我为什么没有在上述脚本中为这两个函数使用对象语法,实际上,原因很简单:我不能。如果在连接服务器时发生错误,那么mysqli()对象不会被创建,因此与其相关的方法和属性将不存在。正因为如此,为了在ext/mysqli中调式连接错误,你必须总是使用过程式而不是对象符号。
上面就是我为PHP 101这个主题所做的论述。在第九章中,我将会告诉你关于PHP 5的内建的另外一种数据库管理系统,非常酷的数据库引擎。不要错过!