PHP使用已知文件名

时间:2016-09-04 18:15:04

标签: php mysql

我有一个完整的图像目录(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";

}

我只是对如何根据数据库中的小部分选择文件感到困惑。

注意:这并不像更改数据库中的字符数那么简单,因为数据库是从已被删除的外部站点提供给我的。所以这就是我的所有数据。

2 个答案:

答案 0 :(得分:2)

PHP可以使用函数glob()打开文件。 Glob会在您的服务器或指定目录中搜​​索包含与您指定的模式“匹配”的任何文件。

像这样使用glob()会从部分名称中提取您的图片。

  1. 与第二个分开运行此查询:

    $update = mysqli($dbconn, "UPDATE files 
              SET filename = REPLACE(filename, '.info', ''));
    
  2. filename应该是数据库中包含图像列表的列。我们从db列中删除.jpg的原因是,如果您的名称是部分名称,则.jpg可能与您目录中的给定名称不匹配。删除它后,我们可以只搜索名称的模式。

    1. 构建查询以选择并移动文件夹:

       $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. 
    }

阅读PHP CopyPHP unlink

和;请使用准备好的语句进行PHP和数据库交互。!