【问题标题】:How can I rename files on a server using PHP with filenames from that are stored in a databse?如何使用 PHP 重命名服务器上的文件,文件名存储在数据库中?
【发布时间】:2013-01-28 16:03:34
【问题描述】:

我在数据库中有一个表,其中包含以下字段 current_filenamenew_filename,我想将目录中的当前文件名重命名为新文件名。我还想确保如果目录中已经存在新的文件名,那么用新重命名的文件覆盖现有文件。

还有几点需要说明:

  • current_filename 与即将新建的文件在同一目录中 重命名文件
  • 目录中有一些我没有的文件 想改名
  • 我想我需要更改 文件夹和或文件?我目前将目录文件夹设置为 777,将 (PDF) 文件权限设置为 644

这是我拥有的 PHP 脚本,但作为 PHP 的新手,我不确定它是否可以工作(或者我什至需要将这些 new_filenames 上传到数据库中开始)。

<?php

require_once "config.php";
$dbh = new PDO($dsn, $dbuser, $dbpass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$current_filename = $dbh->query("SELECT current_filename FROM a_temp_rename");
$new_filename = $dbh->query("SELECT new_filename FROM a_temp_rename");

foreach($array as $current_filename=>$new_filename){
rename($current_filename,$new_filename);}

?>

新代码

根据下面的答案,我已经更正了 PHP,并且还为目录添加了一个变量。我有以下未回答的问题:

  1. 我必须将文件和/或文件夹权限从当前的 644 更改为 777,我必须对所有文件和文件夹还是只对文件夹执行此操作? (文件夹当前设置为 777,但 PDF 文件设置为 644
  2. 我是否必须将这些 current_filenames 和 new_filenames 上传到数据库中,或者是否有办法仅使用 PHP 并在 PHP 中定义 key => value 对?
  3. 我为路径设置的$dir 变量在我将它与重命名函数中来自db 的值连接时会起作用吗?我必须将此目录设为绝对路径还是相对路径?我将 PHP 与要重命名的文件放在同一目录中。

这是修改后的 PHP 脚本:

<?php

require_once "config.php";
$dbh = new PDO($dsn, $dbuser, $dbpass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$filename = $dbh->query("SELECT current_filename,new_filename FROM a_temp_rename");

$dir = "./"

foreach($filename as $file){
rename($dir . $file['current_filename'],$dir . $file['new_filename']);}

?>

问题解答

  1. 我只需要将文件夹权限(不是每个单独的文件)更改为 777
  2. 未答复。
  3. 设置一个等于目录的变量并在重命名函数中连接字符串将起作用,我可以使用相对或绝对路径来重命名文件。

错误!

我运行了测试代码,得到如下错误:

Parse error: syntax error, unexpected T_FOREACH in /public_html/_documents/test_rename/test_rename.php on line 12

这是我运行的代码,上面提到了所有的更正:

<?php

require_once "config.php";
$dbh = new PDO($dsn, $dbuser, $dbpass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$filename = $dbh->query("SELECT current_filename, new_filename FROM a_temp_rename");

$dir = ("./_documents/test_rename/");

foreach ($filename as $file) {
    rename($dir . $file['current_filename'], $dir . $file['new_filename']);
    }

?>

【问题讨论】:

    标签: php file-rename


    【解决方案1】:
    <?php
    
    require_once "config.php";
    $dbh = new PDO($dsn, $dbuser, $dbpass);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    $filename = $dbh->query("SELECT current_filename,new_filename FROM a_temp_rename");
    
    
    foreach($filename as $file){
    rename($file['current_filename'],$file['new_filename']);}
    
    ?>
    

    rename 的源和目标应该是正确的路径(不仅仅是文件名)

    参考:http://php.net/manual/en/function.rename.php

    【讨论】:

    • 谢谢@prasanthbendra。为了完成您的答案,您能否评论一下我是否需要将这些 new_filenames 上传到数据库中,或者是否有其他方法可以做到这一点?我目前在 Excel 电子表格中有姓名列表。我读到重命名函数将用我正在寻找的 new_filename 覆盖任何现有文件,所以这很好。另外,我是否需要更改文件夹和文件的权限或仅更改文件夹以及必须将其设置为什么权限?最后,我可以为目录使用一个变量吗?
    • @BenJones :由于您已经拥有此代码,因此您将 excel 工作表导入 mysql 数据库(将其转换为 csv,然后在 phpmyadmin 中有一个导入选项)。在这种情况下,您可以将目录名称添加为变量,您的重命名将为 rename($dir_name."/".$file['current_filename'],$dir_name."/".$file['new_filename']);您授予该文件夹的写入权限。
    • 我已经按照您的描述完成了 - 将 excel 文件保存为 csv,然后使用 PHP MyAdmin 将文件导入 MySQL。在我看来,这似乎是进行这种改变的最佳方式。我想我也可以在 PHP 脚本中包含文件名,就像上面我对问题的修订中描述的 key=>value 对一样。我剩下的唯一问题是:我必须使用文件的直接路径(即“www.website.com/...”)还是可以使用相对于 PHP 文件所在位置的路径,即当前目录(即“ ./")。答案已被接受。非常感谢您的帮助。
    • 我已经在测试目录中的测试文件上运行了您提供的代码,但由于意外的T_FOREACH,它在第 12 行产生了语法错误。我研究了这个错误并且检查了代码,我认为我没有丢失 ant ;。请让我知道为什么代码会产生此错误。提前致谢。
    • print_r($filename);在 foreach 上方,看看那里会发生什么
    【解决方案2】:

    您可以使用 PHP 中的rename 函数来重命名服务器目录中的文件。示例请参考以下链接。

    http://php.net/manual/en/function.rename.php

    Bulk Rename Files in a Folder - PHP

    【讨论】:

    • 谢谢,我知道 PHP 中的 rename 函数,但手册中只有一个示例,其中一个文件被重命名。您提供的示例(我已经阅读过)显示了如何创建一个循环来访问所有文件并重命名它们,但该示例包含一个常量 new_filename (“SKU”),而我想使用关联数组来重命名文件和foreach current_name rename 文件到他们的新文件名。这个问题与您提供的示例大不相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    相关资源
    最近更新 更多