CodeIgniter3遍历多维数组插入数据库(控制器与模型)求助
解决CodeIgniter中遍历文件夹并存入MySQL的问题
嘿,别担心!作为CodeIgniter新手加上PHP基础薄弱,遇到这种多维数组的问题太正常了,我来一步步帮你搞定~
首先,先搞清楚directory_map('./mydirectory/')返回的结构:这个函数会生成一个多维数组,文件夹名作为数组的键,对应的子文件夹或文件就存在这个键的数组里;如果是文件的话,会直接以文件名作为数组元素的值。
我们需要用递归函数来遍历这个嵌套的数组,因为子文件夹可能还有更深的层级,递归能自动处理所有层级的内容。接下来结合CodeIgniter的数据库操作,把遍历到的文件夹和文件名存入数据库。
步骤1:确认数据库表结构
确保你的表(比如叫file_system)有这两列:
folder_name:VARCHAR类型,用来存文件夹路径(比如mydirectory/subfolder1)file_name:VARCHAR类型,用来存文件名
步骤2:在CodeIgniter控制器中写代码
下面是一个完整的示例,你可以直接放到你的控制器里:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class File_uploader extends CI_Controller { public function index() { // 加载数据库库 $this->load->database(); // 调用directory_map获取文件夹结构,第二个参数设为TRUE会保留完整路径 $dir_map = directory_map('./mydirectory/', TRUE); // 开始递归遍历数组,初始文件夹路径设为根目录'mydirectory/' $this->traverse_directory($dir_map, 'mydirectory/'); echo "所有文件和文件夹已成功存入数据库!"; } // 递归遍历函数 private function traverse_directory($directory_array, $current_folder) { foreach ($directory_array as $key => $value) { // 如果是文件夹(值是数组) if (is_array($value)) { // 拼接当前文件夹路径 $new_folder = $current_folder . $key . '/'; // 遍历这个子文件夹 $this->traverse_directory($value, $new_folder); } else { // 如果是文件,准备插入数据库的数据 $data = array( 'folder_name' => $current_folder, 'file_name' => $value ); // 使用CodeIgniter的Active Record插入数据,自动防SQL注入 $this->db->insert('file_system', $data); } } } } ?>
一些重要的提醒
- 文件夹权限:确保CodeIgniter运行的服务器用户(比如www-data)有读取
./mydirectory/文件夹的权限,否则directory_map会返回空数组。 - directory_map参数:如果不想存完整路径,可以把第二个参数设为FALSE,这样返回的数组里只有文件名/文件夹名,你需要自己拼接路径。
- 重复数据:如果需要避免重复插入,可以在插入前先查询数据库,或者给表的
folder_name和file_name加联合唯一索引。
如果还有不清楚的地方,随时问我,不用不好意思~
内容的提问来源于stack exchange,提问作者Chris_It
相关产品推荐
相关产品推荐

