值得注意的是,对于初学者来说,使用行计数来测试表的是否存在仅在表实际包含数据时才有效,否则即使表存在,测试也会返回 false。
(PHP 4, PHP 5)
mysql_list_tables — 列出 MySQL 数据库中的表
此函数在 PHP 4.3.0 中已弃用,它和整个 原始 MySQL 扩展 在 PHP 7.0.0 中被移除。请改用正在积极开发的 MySQLi 或 PDO_MySQL 扩展。另请参阅 MySQL:选择 API 指南。此函数的替代方法包括
SHOW TABLES FROM dbname
从 MySQL 数据库中检索表名列表。
此函数已弃用。建议使用 mysql_query() 来发出 SQL SHOW TABLES [FROM db_name] [LIKE 'pattern']
语句。
database
数据库的名称
link_identifier
MySQL 连接。如果未指定链接标识符,则假定为 mysql_connect() 最近打开的链接。如果找不到这样的链接,它将尝试创建链接,就好像 mysql_connect() 被调用时没有参数一样。如果未找到或建立连接,则会生成 E_WARNING
级别的错误。
使用 mysql_tablename() 函数遍历此结果指针,或使用任何用于结果表的函数,例如 mysql_fetch_array()。
版本 | 描述 |
---|---|
4.3.7 | 此函数已弃用。 |
示例 #1 mysql_list_tables() 替代示例
<?php
$dbname = 'mysql_dbname';
if (!mysql_connect('mysql_host', 'mysql_user', 'mysql_password')) {
echo '无法连接到 mysql';
exit;
}
$sql = "SHOW TABLES FROM $dbname";
$result = mysql_query($sql);
if (!$result) {
echo "数据库错误,无法列出表\n";
echo 'MySQL 错误:' . mysql_error();
exit;
}
while ($row = mysql_fetch_row($result)) {
echo "表: {$row[0]}\n";
}
mysql_free_result($result);
?>
注意:
为了向后兼容,可以使用以下已弃用的别名:mysql_listtables()
<?
// 这是一个更优雅的方法来检查表是否存在(不会产生错误)
if( mysql_num_rows( mysql_query("SHOW TABLES LIKE '".$table."'")))
{
//...
}
?>
PHP-Guy 为了确定表是否存在而给出的示例很有趣且有用(谢谢),除了一个很小的细节。函数 'mysql_list_tables()' 返回的表名是小写,即使表是以混合大小写创建的。为了解决这个问题,在最后一行添加 'strtolower()' 函数,如下所示
return(in_array(strtolower($tableName), $tables));
我需要一种方法来创建一个数据库,包括来自 .sql 文件的表。嗯,由于 PHP/mySQL 似乎不允许这样做,下一个最好的想法是创建一个空的模板数据库并“克隆并重命名它”。猜猜怎么了?没有 mysql_clone_db() 函数或任何 SQL 'CREATE DATABASE USING TEMPLATEDB' 命令。grrr...
所以,这就是我想出的解决方法
$V2DB = "V2_SL".$CompanyID;
$result = mysql_create_db($V2DB, $linkI);
if (!$result) $errorstring .= "创建 ".$V2DB." 数据库时出错<BR>\n".mysql_errno($linkI).": ".mysql_error($linkI)."<BR>\n";
mysql_select_db ($V2DB, $linkI) or die ("无法选择 ".$V2DB." 数据库");
// 您必须已经创建了 "V2_Template" 数据库。
// 这将克隆它,包括数据。
$tableResult = mysql_list_tables ("V2_Template");
while ($row = mysql_fetch_row($tableResult))
{
$tsql = "CREATE TABLE ".$V2DB.".".$row[0]." AS SELECT * FROM V2_Template.".$row[0];
echo $tsql."<BR>\n";
$tresult = mysql_query($tsql,$linkI);
if (!$tresult) $errorstring .= "创建 ".$V2DB.".".$row[0]." 表时出错<BR>\n".mysql_errno($linkI).": ".mysql_error($linkI)."<BR>\n";
}
mysql_list_tables() 的一个更好的替代方法是以下 mysql_tables() 函数。
<?php
/**
* mysql_list_tables 的更好替代方法(已弃用)
*/
function mysql_tables($database='')
{
$tables = array();
$list_tables_sql = "SHOW TABLES FROM {$database};";
$result = mysql_query($list_tables_sql);
if($result)
while($table = mysql_fetch_row($result))
{
$tables[] = $table[0];
}
return $tables;
}
# 用法示例
$tables = mysql_tables($database_local);
?>
好了,各位,最快速、最准确、最安全的方法
function mysql_table_exists($table, $link)
{
$exists = mysql_query("SELECT 1 FROM `$table` LIMIT 0", $link);
if ($exists) return true;
return false;
}
请注意“LIMIT 0”,我的意思是,拜托,人们,没有比这更快的了!:)
就查询而言,这完全没有意义。但它有能力在表不存在时失败,这就是你所需要的!
你也可以使用 mysql_query() 函数来实现。它更好,因为 mysql_list_tables 是一个旧函数,你可以停止显示错误。
function mysql_table_exists($dbLink, $database, $tableName)
{
$tables = array();
$tablesResult = mysql_query("SHOW TABLES FROM $database;", $dbLink);
while ($row = mysql_fetch_row($tablesResult)) $tables[] = $row[0];
if (!$result) {
}
return(in_array($tableName, $tables));
}
<?
/*
返回给定 MySQL 数据库的完整大小的函数
如果找不到该名称的数据库,则返回 false
*/
function getdbsize($tdb) {
$db_host='localhost';
$db_usr='USER';
$db_pwd='XXXXXXXX';
$db = mysql_connect($db_host, $db_usr, $db_pwd) or die ("连接到 MySQL 服务器时出错!\n");
mysql_select_db($tdb, $db);
$sql_result = "SHOW TABLE STATUS FROM " .$tdb;
$result = mysql_query($sql_result);
mysql_close($db);
if($result) {
$size = 0;
while ($data = mysql_fetch_array($result)) {
$size = $size + $data["Data_length"] + $data["Index_length"];
}
return $size;
}
else {
return FALSE;
}
}
?>
<?
/*
实现示例
*/
$tmp = getdbsize("DATABASE_NAME");
if (!$tmp) { echo "ERROR!"; }
else { echo $tmp; }
?>
获取数据库状态
<?
// 由 DtTvB 获取数据库状态
// 首先连接
mysql_connect ('*********', '*********', '********');
mysql_select_db ('*********');
// 获取表格列表
$sql = 'SHOW TABLES FROM *********';
if (!$result = mysql_query($sql)) { die ('获取表格列表时出错 (' . $sql . ' :: ' . mysql_error() . ')'); }
// 将表格列表转换为数组
$tablerow = array();
while ($row = mysql_fetch_array($result)) { $tablerow[] = $row; }
// 定义变量...
$total_tables = count($tablerow);
$statrow = array();
$total_rows = 0;
$total_rows_average = 0;
$sizeo = 0;
// 获取每个表格的状态
for ($i = 0; $i < count($tablerow); $i++) {
// 查询状态...
$sql = "SHOW TABLE STATUS LIKE '{$tablerow[$i][0]}';";
if (!$result = mysql_query($sql)) { die ('获取表格状态时出错 (' . $sql . ' :: ' . mysql_error() . ')'); }
// 获取此表格的状态数组
$table_info = mysql_fetch_array($result);
// 将它们添加到总结果中
$total_rows += $table_info[3];
$total_rows_average += $table_info[4];
$sizeo += $table_info[5];
}
// 用于计算文件大小的函数
function c2s($bs) {
if ($bs < 964) { return round($bs) . " 字节"; }
else if ($bs < 1000000) { return round($bs/1024,2) . " KB" ; }
else { return round($bs/1048576,2) . " MB" ; }
}
// 输出结果!!!!!!!!!
echo "{$total_rows} 行在 {$total_tables} 个表格中";
echo "<br>每行的平均大小: " . c2s($total_rows_average/$total_tables);
echo "<br>每个表格的平均大小: " . c2s($sizeo/$total_tables);
echo "<br>数据库大小: " . c2s($sizeo);
// 关闭连接
mysql_close();
?>
以下是如何显示所有表格并提供删除它们的函数...
<?php
echo "<p align=\"left\">";
// 这是数据库的连接文件....
$connectfile = "connect.php";
require $connectfile;
$dbname = 'DATABASE NAME';
$result = mysql_list_tables($dbname);
echo "<table width=\"75%\" border=\"0\">";
echo "<tr bgcolor=\"#993333\"> ";
echo "<td><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"-1\" color=\"#FFFFFF\">表格名称:</font></td>";
echo "<td><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"-1\" color=\"#FFFFFF\">删除?</font></td>";
echo "</tr>";
if (!$result) {
print "数据库错误,无法列出表格\n";
print 'MySQL 错误: ' . mysql_error();
exit;
}
while ($row = mysql_fetch_row($result)) {
echo "<tr bgcolor=\"#CCCCCC\">";
echo "<td>";
print "$row[0]\n";
echo "</td>";
echo "<td>";
echo "<a href=\"$PHP_SELF?action=delete&table=";
print "$row[0]\n";
echo "\">是?</a>";
echo "</td>";
echo "</tr>";
}
mysql_free_result($result);
// 删除
if($action=="delete")
{
$deleteIt=mysql_query("DROP TABLE $table");
if($deleteIt)
{
echo "表格 \"";
echo "$table\" 已成功删除!<br>";
}
else
{
echo "发生错误...请重试<br>";
}
}
?>
实际上,最初发布的 SELECT COUNT(*) 方法是完美的。SELECT COUNT(*) 将在响应中提供一个且只有一个行,除非你无法从表中选择任何内容。即使是全新的(空的)表也会用一行来响应,告诉你没有记录。
虽然这里其他方法当然可以工作,但当你想要执行类似检查数据库以确保所有需要的表都存在这样的操作时,主要问题就出现了,就像我今天早些时候需要做的那样。我编写了一个名为 tables_needed() 的函数,该函数将接受一个表名数组 - $check - 并返回一个不存在的表数组,或者如果所有表都存在,则返回 FALSE。使用 mysql_list_tables(),我在代码的中心块中得到了这个结果(在验证参数、打开连接、选择数据库以及执行大多数人认为过于繁琐的错误检查之后)
if($result=mysql_list_tables($dbase,$conn))
{ // $count 是数据库中的表格数量
$count=mysql_num_rows($result);
for($x=0;$x<$count;$x++)
{
$tables[$x]=mysql_tablename($result,$x);
}
mysql_free_result($result);
// 这里有更多比较
$exist=array_intersect($tables,$check);
$notexist=array_diff($exist,$check);
if(count($notexist)==0)
{
$notexist=FALSE;
}
}
这种方法的问题是性能会随着数据库中表格数量的增加而下降。使用“SELECT COUNT(*)”方法,性能只随着你*关心*的表格数量而下降
// $count 是你*需要*的表格数量
$count=count($check);
for($x=0;$x<$count;$x++)
{
if(mysql_query("SELECT COUNT(*) FROM ".$check[$x],$conn)==FALSE)
{
$notexist[count($notexist)]=$check[$x];
}
}
if(count($notexist)==0)
{
$notexist=FALSE;
}
虽然这里速度的提升对于拥有个人网站上的数据库驱动的后端来处理留言簿和论坛的普通用户来说几乎没有意义,这些网站每周可能只有几百次访问,但对于每天必须处理数千万次访问的专业人士来说,它意味着一切... 其中查询的额外毫秒会变成超过一天的处理时间。在它们不重要的时候养成良好的习惯,可以让你在它们*重要*的时候避免养成坏习惯。
尽管 php 程序员的解决方案可能是这里最快的,但这里还有另一个,只是为了好玩...
我使用这个函数来检查表是否存在。如果不存在,则创建它。
mysql_connect("server","usr","pwd")
or die("无法连接!");
mysql_select_db("mydb");
$tbl_exists = mysql_query("DESCRIBE sometable");
if (!$tbl_exists) {
mysql_query("CREATE TABLE sometable (id int(4) not null primary key,
somevalue varchar(50) not null)");
}
如果你考虑一个特殊情况,你也可以使用 mysql_fetch_object:对象的变量名称是
Tables_in_xxxxx
其中 xxxxx 是数据库的名称。
例如,使用
$result = mysql_list_tables($dbname);
$varname="Tables_in_".$dbname;
while ($row = mysql_fetch_object($result)) {
echo $row->$varname;
};