我需要列出给定父文件夹中的所有文件/文件夹,并将其转储到mysql。
到目前为止,我有:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$dir = '/home/kevinpirnie/www';
function dirToArray( $dir ) {
$result = array();
$cdir = scandir($dir);
foreach ($cdir as $key => $value) {
if (!in_array($value, array(".", ".."))) {
if (is_dir($dir . DIRECTORY_SEPARATOR . $value)){
$result[$value] = dirToArray($dir . DIRECTORY_SEPARATOR . $value);
} else {
$result[] = $value;
}
}
}
return $result;
}
$res = dirToArray($dir);
echo '<hr />';
echo '<pre>';
print_r($res);
echo '</pre>';
我坚持的是如何将ID
分配给目录,然后将它们与父ID
相关联。
现在,这段代码完成了我需要它的工作,我只需要能够将它转换为mysql插入语句,同时保持关联结构,并且我在长时间的工作中脑力激荡。 / p>
最后,我希望有一个类似于:
的表结构FileID,FolderID,ParentFolderID,FileName
我该怎么做?
答案 0 :(得分:4)
尝试这样的事情:
function dirToDb($res, $parentId = 0)
{
foreach ($res as $key => $value) {
if (is_array($value)) {
$db->exec("insert into table (path, parentId) VALUES (?, ?)", [$key, $parentId]);
dirToDb($value, $db->fetch("SELECT LAST_INSERT_ID()"));
} else {
$db->exec("insert into table (path, parentId) VALUES (?, ?)", [$value, $parentId]);
}
}
}
$res = dirToArray($dir);
dirToDb($res);
答案 1 :(得分:1)
我稍微修改了你的代码。现在为每个目录,
索引0指向目录索引
索引1指向父目录索引
索引2,3,.... n指向文件
$listoftests = array($quizzes[30],$quizzes[51]);
您现在可以使用类似的递归循环直接将数据插入到mysql表中(如果您不想使用mysql自动生成的id)
如果你想使用自动生成的mysql id,你应该在两遍中插入。在第一遍中插入文件夹数据并从mysql插入id函数中获取id。然后创建一个关联数组映射
$ array_map [$ current_folder_id] = mysqli_insert_id()
然后在第二次递归传递中更新此id
答案 2 :(得分:0)
我认为您需要将文件夹名称作为记录插入到数据库中,否则您将无法获得父ID。但是,在您的结果中,文件夹名称作为记录项缺失。我修改了你的代码,假设你不需要将结果作为数组而只需要SQL语句。
<?php
$qry = array();
$result = $conn->query("SELECT MAX(FileID) as lastid FROM YOUR-TABLE-NAME-HERE");
$row = $result->fetch_assoc();
$id = $row['lastid'];
function dirToSql($dir, $parent) {
global $qry;
global $id;
$result = array();
$cdir = scandir($dir);
foreach($cdir as $key => $value) {
if(!in_array($value, array('.', '..'))) {
$id++;
$qry[] = "('".$id."', '".$dir."', '".$parent."', '".$value."')";
if(is_dir($dir . DIRECTORY_SEPERATOR . $value)) {
dirToSql($dir . DIRECTORY_SEPERATOR . $value, $id);
}
}
}
return $qry;
}
$dir = '/home/kevinpirnie/www';
$sql = dirToSql($dir, 0);
//Here is your SQL Statement
echo $qry = "INSERT INTO YOUR-TABLE-NAME-HERE (`FileID`, `FolderID`, `ParentFolderID`, `FileName`) VALUES ".implode(',', $sql);
您可以优化代码&amp;如果需要,查询
答案 3 :(得分:0)
Mysql目录表中的每一行都有三列 -
目录ID,目录名称,父ID
对于每个插入,父ID将指定行中当前目录的父级。对于根目录,父ID为0
答案 4 :(得分:0)
构建数据库的一种非常有用的方法是使用嵌套集。 Joomla将此用于文章类别等内容。这些可以无限地嵌套在一起。
答案 5 :(得分:-1)
json_encode整个数组并将其插入数据库......你还需要一列......