Как я могу переименовать файлы на сервере с помощью PHP с именами файлов, которые хранятся в базе данных?

У меня есть таблица в базе данных со следующими полями current_filename и new_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?
  3. Будет ли работать переменная $dir, которую я настроил для пути, когда я объединяю ее со значениями из базы данных в функции переименования? И я должен сделать этот каталог абсолютным или относительным путем? У меня есть 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']);
    }

?>

person Ben    schedule 28.01.2013    source источник


Ответы (2)


<?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

person Prasanth Bendra    schedule 28.01.2013
comment
Спасибо @prasanthbendra. Чтобы завершить свой ответ, не могли бы вы прокомментировать, нужно ли было для начала загружать эти new_filenames в базу данных, или я мог сделать это другим способом? В настоящее время у меня есть список имен в таблице Excel. Я читал, что функция переименования перезапишет любые существующие файлы именем new_filename, что я и ищу, так что это хорошо. Кроме того, мне нужно изменить разрешения для папки и файлов или только для папки и какое разрешение я должен установить? Наконец, могу ли я использовать переменную для каталога? - person Ben; 28.01.2013
comment
@BenJones: поскольку у вас уже есть этот код, вы импортируете свой лист Excel в базу данных mysql (преобразуйте его в csv, затем в phpmyadmin есть возможность импортировать). Вы можете добавить имя каталога в качестве переменной, в этом случае ваше переименование будет rename($dir_name./.$file['current_filename'],$dir_name./.$file['new_filename']); Вы даете разрешение на запись в папку. - person Prasanth Bendra; 28.01.2013
comment
Я сделал, как вы описываете, - сохранил файл excel в формате csv, а затем импортировал файл в MySQL с помощью PHP MyAdmin. Мне кажется, это лучший способ сделать такое изменение. Я полагаю, что мог бы также включить имена файлов в PHP-скрипт, например, в виде пары ключ => значение, как описано выше в моем пересмотре вопроса. Мой единственный оставшийся вопрос: должен ли я использовать прямой путь к файлам (т.е. www.website.com/...) или я могу использовать путь относительно того, где находится файл PHP, текущий каталог (т.е. ./) . Ответ принят. Большое спасибо за Вашу помощь. - person Ben; 28.01.2013
comment
Я запустил предоставленный вами код для тестовых файлов в тестовом каталоге, но он вызвал синтаксическую ошибку в строке 12 из-за неожиданного T_FOREACH. Я исследовал эту ошибку и проверил код, и я не думаю, что пропустил муравей ;. Пожалуйста, дайте мне знать, почему код выдает эту ошибку. Заранее спасибо. - person Ben; 28.01.2013
comment
print_r ($ имя файла); над foreach и посмотреть, что там происходит - person Prasanth Bendra; 28.01.2013
comment
Вам не хватает ; в строке $dir = ./ - person Prasanth Bendra; 28.01.2013

Вы можете использовать функцию rename в PHP, чтобы переименовать файл в каталоге на сервере. Пожалуйста, обратитесь к следующим ссылкам для примеров.

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

Массовое переименование файлов в папке — PHP

person Edwin Alex    schedule 28.01.2013
comment
Спасибо, я знаю о функции rename в PHP, но в руководстве есть только пример с переименованием одного файла. В приведенном вами примере, который я уже прочитал, показано, как создать цикл для доступа ко всем файлам и их переименования, но пример включает константу new_filename (SKU), тогда как я хотел бы использовать ассоциативный массив для переименования файлов и foreach current_name rename файлы к их new_filename. Этот вопрос существенно отличается от приведенных вами примеров. - person Ben; 28.01.2013