我有一个包含三个输入的HTML表单:
用户提交表单后,php脚本将:
我想要的最重要的是,将由php文件创建的文件夹增加1。我的意思是:folder1(txt文件+图像),folder2(txt文件+图像),folder3(txtfile +图像)和等等...
答案 0 :(得分:0)
有几种不同的方法可以完成您描述的内容。当您尝试创建一个新文件夹并确定下一个最高编号时,一种选择是查看所有现有文件夹(目录)。
您可以通过在父输出目录上使用scandir
来找到现有文件来实现此目的。
示例:
$max=0;
$files=scandir("/path/to/your/output-directory");
$matches=[];
foreach($files as $file){
if(preg_match("/folder(\d+)/", $file, $matches){
$number=intval($matches[1]);
if($number>$max)
$max=$number;
}
}
$newNumber=$max+1;
这是一个简单的示例,可让您获得下一个号码。还有许多其他因素需要考虑。例如,如果两个用户同时提交表单怎么办?您将需要一些同步隐喻(例如信号量或文件锁定),以确保一次只能进行插入。
您可以使用一个单独的锁定文件来存储当前号码并用作同步方法。
我强烈建议您找到一种不同的方式来存储数据。使用数据库存储此数据可能是一个更好的选择。
如果需要将文件存储在本地磁盘上,则可以考虑使用其他选项来生成目录名称。例如,您可以使用时间戳,数据散列或它们的组合。您也许还可以通过uniqid
之类的东西来度过难关。任何文件系统选项都需要某种形式的同步来解决竞争状况。
这是一个更完整的示例,该示例使用锁定文件进行顺序和同步来顺序创建目录。这省略了应为生产代码添加的一些错误处理,但应提供核心功能。
define("LOCK_FILE", "/some/file/path"); //A file for synchronization and to store the counter
define("OUTPUT_DIRECTORY", "/some/directory"); //The directory where you want to write your folders
//Open the lock file
$file=fopen(LOCK_FILE, "r+");
if(flock($file, LOCK_EX)){
//Read the current value of the file, if empty, default to 0
$last=fgets($file);
if(empty($last))
$last=0;
//Increment to get the current ID
$current=$last+1;
//Write over the existing value(a larger number will always completely overwrite a smaller number written from the same position)
rewind($file);
fwrite($file, (string)$current);
fflush($file);
//Determine the path for the next directory
$dir=OUTPUT_DIRECTORY."/folder$current";
if(file_exists($dir))
die("Directory $dir already exists. Lock may have been reset");
//Create the next directory
mkdir($dir);
//TODO: Write your content to $dir (You'll need to provide this piece)
//Release the lock
flock($file, LOCK_UN);
}
else{
die("Unable to acquire lock");
}
//Always close the file handle
fclose($file);