У меня есть форма HTML, в которой есть PHP pgm для записи результатов в файл. Я в основном скопировал его из Интернета. Это не ракетная операция. Он работает с PHP 7 на Raspberry Pi с самым последним Raspbian. ПГМ PHP сообщает, что файл доступен для записи, что он успешно выполнен и т. Д., Но файл остается пустым. Я изменил разрешения на 777 (для тестирования), и это не помогает. Я в тупике. Вот HTML:
<!DOCTYPE html>
<html>
<head>
<title>Update</title>
</head>
<body>
<FORM NAME ="form1" METHOD ="POST" action="filewrite.php">
<INPUT TYPE = "TEXT" VALUE ="memory" NAME="memory">
<INPUT TYPE = "TEXT" VALUE ="desc" NAME="desc">
<INPUT TYPE = "TEXT" VALUE ="comm" NAME="comm">
<INPUT TYPE = "TEXT" VALUE ="reset" NAME="reset">
<INPUT TYPE = "Submit" Name = "Submit1" VALUE = "Create">
</FORM>
</body>
</html>
Вот PHP (в filewrite. php):
<?php
ini_set('display_errors', true);
if(isset($_POST['memory']) && isset($_POST['desc']) && isset($_POST['comm']) && isset($_POST['reset']))
{
# $data = $_POST['memory'] . '\t' . $_POST['desc'] . '\t' . $_POST['comm'] . '\t' . $_POST['reset'] . "\n";
$data = "testing";
$file = "/tmp/data.txt";
var_dump($_POST);
if (is_writable($file)) {
echo nl2br("\n\nThe file is writable\n\n");
} else {
echo nl2br("The file is not writable\n\n");
}
touch($file);
$ret = file_put_contents($file, $data, LOCK_EX);
if($ret === false)
{
die('There was an error writing this file');
}
else
{
echo nl2br("$ret bytes written to file\n");
echo nl2br("data = $data\n");
echo nl2br("file = $file\n");
}
}
else
{
die('no post data to process');
}
?>
Вот что я получаю в качестве вывода:
array(5) { ["memory"]=> string(4) "fred" ["desc"]=> string(6) "barney" ["comm"]=> string(5) "wilma" ["reset"]=> string(5) "betty" ["Submit1"]=> string(6) "Create" }
The file is writable
7 bytes written to file
data = testing
file = /tmp/data.txt
и вот файл:
-rwxrwxrwx 1 pi pi 0 Mar 29 16:43 /tmp/data.txt
Я пробовал без существующего файла и с ним там. Сначала я пытался записать данные формы в файл, но затем переключился на то, чтобы просто написать «тестирование». Я пробовал другие каталоги для файла, но они (как и ожидалось) потерпели неудачу из-за разрешений.
Редактировать: Когда я попытался записать файл в / home / pi (который я ожидал потерпеть неудачу, поскольку веб-сервер www-data), я получил эту ошибку в / var / log / apache2 / error.log:
[Sun Mar 29 17:04:24.648150 2020] [php7:warn] [pid 12075] [client fe80::cceb:ba3c:da1d:6b2a:53052] PHP Warning: file_put_contents(/home/pi/data.txt): failed to open stream: Permission denied in /var/www/html/filewrite.php on line 19, referer: http://devberry-pi.local/rwupdate.html
Установка его обратно в /tmp/data.txt очистила эту ошибку (и другие ошибки не генерируются.)
Редактировать 2: Я скопировал файл 6k в / tmp, чтобы убедиться, что места достаточно, и это сработало нормально. На данный момент я пишу только 7 байтов («тестирование») и действительно хочу записать <80b, как только я получу его работу. Кроме того, это новая установка, на которой есть только несколько небольших страниц (которые я написал). </p>
Редактировать 3: Совершенно новая карта, новая установка, те же результаты. 8 ^ (Я думаю, что мой следующий шаг - это другой Raspberry Pi, хотя я не уверен, каким может быть проблема с оборудованием. Примечание: я могу создавать файлы в / tmp из командной строки.
Ооо, новая разработка - я создал новую папку, / home / www, установил ее права доступа 777 и он успешно создал файл там . Разрешения для / tmp: drwxrwxrwt и он принадлежит пользователю root / root. Пользователь веб-сервера / php www-data. Я могу использовать это в качестве обходного пути, но в моей книге это не идеально. Есть ли лучшее место, чем / tmp, чтобы поместить материал, который Разные пользователи / программы должны иметь доступ?
Есть мысли? На что мне смотреть?