0

我有解析目录并生成 SQL 语句的 php 代码,该语句检查子目录名称是否存在作为特定数据库中的表,然后为目录中不存在的任何表生成 DROP TABLE 语句:

在 $DIR 的代码中前面调用了目录。

$directories = glob($DIR . '/*' , GLOB_ONLYDIR);
$dir2 = str_replace( "$DIR/"  , ""  , $directories);
$dirlist = implode("', '",$dir2);
$sql = "SELECT CONCAT('DROP TABLE ', table_name, ';') FROM information_schema.TABLES WHERE table_schema = 'streamer1' AND table_name NOT IN ('$dirlist');";
echo "$sql";

这会在我的浏览器窗口中生成一条 SQL 语句。当我使用 mysql 手动运行 sql 语句时,我得到了任何表名所需的 DROP TABLE 语句列表,这些表名在文件夹中未作为子目录名找到。

+----------------------------------------+
| CONCAT('DROP TABLE ', table_name, ';') |
+----------------------------------------+
| DROP TABLE jhtest;                     |
+----------------------------------------+
1 row in set (0.00 sec)

我想要完成的是获取这些结果并使用我的 php 代码在 mysql 中执行它们。我目前被困在用 php 返回结果,然后将每个结果作为 mysql 语句执行。

这是生成这些删除语句的正确方法,还是可能有一种更简单的方法来编辑我的 sql 语句以删除这些表,如果不在提供的列表中(使用 CONCAT 生成删除语句)?

4

2 回答 2

0

然后这样做:

[...]
$sql = "SELECT CONCAT('DROP TABLE ', table_name, ';') FROM information_schema.TABLES WHERE table_schema = 'streamer1' AND table_name NOT IN ('$dirlist');";

$result = mysql_query($sql, $connection);
while ($row = mysql_fetch_array($result))
    mysql_query($row[0], $connection);
于 2013-08-21T14:49:59.050 回答
0

首先,您需要连接到您的数据库并运行查询。在循环内部执行 drop 语句。

$con = mysql_connect("host","username","password");
mysql_select_db("information_schema", $con) or die(mysql_error());
$sql = "SELECT CONCAT('DROP TABLE ', table_name, ';') as q FROM information_schema.TABLES WHERE table_schema = 'streamer1' AND table_name NOT IN ('$dirlist');";

//run the query
$res = mysql_query($sql);
if(!$res){
  die(mysql_error());
} else {
  while($row = mysql_fetch_array($res)){
    echo $row['q']."\n"; //output the queries or run the drop statements like this
    mysql_query($row['q']);
  }
}
于 2013-08-21T14:58:48.717 回答