fopen() в PHP не создает и не записывает текстовый файл

Я получаю следующее предупреждение:

Предупреждение: fopen(Uploaded_Files/dataFile1.txt): не удалось открыть поток: Отказано в доступе в /opt/lampp/htdocs/PHP_Course_Practice/Superglobals/data_upload.php в строке 17

  • Я использую XAMPP для 7.4.8-0.
  • Использование моего MacBook в качестве локального хоста для изучения PHP. Я совсем новичок в кодировании.
  • I've tried:
    • writing the whole Path to the file dataFile1.txt in fopen() but it's not solving the problem
    • Проверено в PHP.ini, что включено значение allow_url_fopen.
    • включен весь путь вверху файла PHP, но также не решает проблему
    • Также попробовал chown -R www-data:www-data folder (где папка была полным путем к папке), и Терминал сказал chown: www-data: illegal group name
    • Также попробовал sudo dseditgroup -o edit -a daemon -t user wheel (сначала в папку Superglobals, а затем в корневую папку Xampp)
  • Полный путь, который fopen() пытается получить и записать в файл: /opt/lampp/htdocs/PHP_Course_Practice/Superglobals/Uploaded_Files/dataFile1.txt
  • Я не заинтересован в использовании 777, поскольку я читал в различных статьях, что это небезопасно.

Код:

<?php
$document_root = $_SERVER["DOCUMENT_ROOT"];
$fileRoot = $document_root . "/PHP_Course_Practice/Superglobals/Uploaded_Files/dataFile1.txt";
echo "Root: $document_root";
include($document_root . "/PHP_Course_Practice/Superglobals/Uploaded_Files/dataFile1.txt");
?>
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>

<?php
if (isset($_POST["submit"])) {
  $dataFile1 = fopen("Uploaded_Files/dataFile1.txt", "w");
  $dataFile1Txt = "My age is " . $_POST["age"] . ".";
  fwrite($dataFile1, $dataFile1Txt);
  echo $dataFile1;
  fclose($dataFile1);
}
?>

<form action="data_upload.php" method="post">
  <input type="text" name="age">
  <input type="submit" name="submit">
</form>

  </body>
</html>

person KodeMonk    schedule 15.08.2020    source источник
comment
Отвечает ли это на ваш вопрос? Отказано в доступе при открытии или создании файлов с помощью PHP   -  person Progman    schedule 15.08.2020
comment
Я не пользователь Mac, поэтому я не могу рассказать вам о лучших практиках на этой платформе, но почти никогда не бывает хорошей идеей хранить пользовательские данные прямо в каталоге приложения.   -  person Álvaro González    schedule 15.08.2020


Ответы (3)


Проверьте веб-пользователя.

<?php
echo exec("whoami");

И добавьте пользователя в свою группу.

sudo usermod -a -G <groupName> <userName>

Наконец, проверьте настройки разрешений для ваших файлов.

person LianSheng    schedule 15.08.2020
comment
Спасибо, ЛианШэн. Как я могу проверить настройки прав доступа к файлам? Это через терминал? И какую команду я должен написать, чтобы проверить настройки прав доступа к файлам, если они находятся в терминале? Еще раз спасибо. - person KodeMonk; 15.08.2020
comment
Использование эха exec(whoami); дал демон. Что мне написать внутри ‹groupName› ‹userName› в этом случае? Является ли daemon именем группы? - person KodeMonk; 15.08.2020
comment
Демон @KodeMonk — это имя пользователя, имя группы — это группа владельца вашего каталога. Вы можете ввести ls -l, чтобы проверить владельца и группу. - person LianSheng; 15.08.2020
comment
Спасибо за ваши подробные ответы. Я попробовал, и он попросил пароль. После ввода пароля MacBook пишет sudo: usermod: команда не найдена - person KodeMonk; 15.08.2020
comment
Извините, моя ошибка, я ошибочно подумал, что команды для mac и linux в основном одинаковы... Попробуйте? superuser.com/a/214311/1208900 - person LianSheng; 15.08.2020
comment
Не беспокойтесь :-) По ссылке я сделал следующее, но, к сожалению, проблема еще не решена: 1. «sudo dseditgroup -o edit -a daemon -t user wheel» (сначала я попробовал в папке Superglobals. Он запросил пароль и затем я подумал, что демон добавлен в папку Superglobals.Затем вышел из XAMPP, вошел в систему и перезагрузил страницу, но так же, как и раньше.) 2. 1. sudo dseditgroup -o edit -a daemon -t пользовательское колесо (пробовал в корневой папке XAMPP , Он запросил пароль, а затем я подумал, что демон добавил в корневую папку. Затем вышел из XAMPP, вошел в систему и перезагрузил страницу, но так же, как и раньше.) - person KodeMonk; 15.08.2020
comment
Извините, у меня нет Mac, поэтому я не знаю, что именно у вас происходит. Может быть, вы можете попробовать ссылку в комментариях под вашим вопросом? - person LianSheng; 15.08.2020

Вам следует попробовать проверить права доступа к файлам или каталогам, которые вы хотите открыть. после этого вы можете добавить разрешение на чтение и запись рекурсивно в этот каталог, как показано ниже

$ chmod -R 770 /path/toyour/directory
person Sam Kihika    schedule 15.08.2020
comment
Спасибо. Не могли бы вы рассказать, как проверить права доступа к файлам или каталогу? - person KodeMonk; 15.08.2020
comment
@KodeMonk используйте ls -l /directoryname или ls -l /path/to/filename - person Sam Kihika; 18.10.2020

Я мог бы решить эту проблему, загрузив и установив не-версию XAMPP для виртуальной машины. Кажется, что VM-версия XAMPP (LAMPP) не подходит для разрешений на localhost, если, возможно, вы не заинтересованы в небезопасном открытии 777.

person KodeMonk    schedule 17.08.2020