我有一个完整的图像目录(40,000 +),我需要排序。我已经设计了一个脚本来将它们分类为知道正确的目录,但是,我遇到了文件名的问题。
具有所属ID的图像URL存储在数据库中,我将数据库与脚本结合使用以对图像进行排序。
我的问题:
缩短了数据库中的图片网址。这种相应图像的一个例子是这样的:
dsc_0107-367.jpg
dsc_0107-367-5478-2354-0014.jpg
文件名的第一部分是相同的,但实际文件包含更多信息。我想要一种使用文件名的已知部分从数据库中移动文件的方法。
我有一个基本代码:
<?php
$sfiles = mysqli_query($dbconn, "SELECT * FROM files WHERE gal_id = '$_GET[id']");
while($file = mysqli_fetch_assoc($sfiles)){
$folder = $file['gal_id'];
$fileToMove = $file['filename'];
$origDir = "mypath/to/dir";
$newDir = "mypath/to/new/dir/$file['gal_id']";
mkdir "$newDir";
mv "$fileToMove" "$newDir";
}
我只是对如何根据数据库中的小部分选择文件感到困惑。
注意:这并不像更改数据库中的字符数那么简单,因为数据库是从已被删除的外部站点提供给我的。所以这就是我的所有数据。
答案 0 :(得分:2)
PHP可以使用函数glob()
打开文件。 Glob会在您的服务器或指定目录中搜索包含与您指定的模式“匹配”的任何文件。
像这样使用glob()
会从部分名称中提取您的图片。
与第二个分开运行此查询:
$update = mysqli($dbconn, "UPDATE files
SET filename = REPLACE(filename, '.info', ''));
filename
应该是数据库中包含图像列表的列。我们从db列中删除.jpg的原因是,如果您的名称是部分名称,则.jpg可能与您目录中的给定名称不匹配。删除它后,我们可以只搜索名称的模式。
构建查询以选择并移动文件夹:
$sfiles = mysqli_query($dbconn, "SELECT * FROM files");
while($file = mysqli_fetch_assoc($sfiles)){
$fileToMove = $file['filename'];
// because glob outputs the result set into an array,
// we will use foreach to run each result from the array individually.
foreach(glob("$fileToMove*") as filename){
echo "$filename <br>";
// I'm echoing this out to see that the results are being run
// one line at a time and to confirm the photo's are
// matching the pattern.
$folder = $file['gal_id'];
// pulling the id from the db of the gallery the photo belongs to.
// This will specify which folder to move the pic to.
// Replace gal_id with the name of your column.
$newDir = $_SERVER['DOCUMENT_ROOT']."/admin/wysiwyg/kcfinder/upload/images/gallery/old/".$folder;
copy($filename,$newDir."/".$filename);
// I would recommend copy rather than move.
// This will leave the original photo in its place.
// This measure is to ensure the photo made it to the new directory so you don't lose it.
// You could go back and delete the photos after if you'd prefer.
}
}
答案 1 :(得分:1)
您的MySQL查询对于SQL注入已经成熟,如果我使用类似于以下内容的页面访问您的页面,则需要对您的GET语句进行清理:
pagename.php?id=' DROP TABLE; #--
这对你来说非常糟糕。
因此;
OVerall使用Prepared Statements要好得多。有很多关于如何在SO和更广泛的互联网上使用它们的数据。我在下面显示的是 仅 一个权宜之计。
$id = (int)$_GET['id'] //This forces the id value to be numeric.
$sfiles = mysqli_query($dbconn, "SELECT * FROM files WHERE gal_id = ".$id);
另请注意关闭'
和"
引号,因为原始文件未关闭数组密钥包装引号。
我从未使用mysqli_fetch_assoc
并始终使用mysqli_fetch_array
因此会使用它,因为它符合相同的语法:
while($file = mysqli_fetch_array($sfiles)){
$folder = $id //same thing.
$fileToMove = $file['filename'];
$origDir = "mypath/to/dir/".$fileToMove;
//This directory shold always start with Server['DOCUMENT_ROOT'].
//Please read the manual for it.
$newDir = $_SERVER['DOCUMENT_ROOT']."/mypath/to/new/dir/".$folder;
if(!is_dir($newDir)){
mkdir $newDir;
}
// Now the magic happens, copies the file to the new directory.
// Then (optionally) delete the original.
copy($origDir,$newDir."/".$fileToMove);
unlink($origDir); //removes original.
// Add a flag to your Database to know that this file has been copied,
// ideally you should resave the filepath to the correct new one.
//MySQL update saving the new filepath.
}