Новый комментарий

Fox-24 15.08.2018 в 17:23

Супер, просто и понятно:)

RusTaylor 02.09.2018 в 21:24

У меня при таком же коде выдаёт ошибку
Warning: file_put_contents(D:\OSPanel\domains\myproject.loc\www\feedback../private/feedback.txt): failed to open stream: No such file or directory in D:\OSPanel\domains\myproject.loc\www\feedback\index.php on line 10

ivashkevich 05.09.2018 в 23:13

Исправил урок, была ошибка вот тут:

'/../private/feedback.txt'

не хватало слеша в начале

artemjeka 12.09.2018 в 07:14

Спасибо за урок.
Да просто скриншот не верно сделан там private внутри www а написано что надо рядом с www создавать.

ivashkevich 22.09.2018 в 09:49

Спасибо, удалил его =)

H3licoptero 13.10.2019 в 11:28

Получилось и работает) Спасибо за крутые уроки!)

ivashkevich 13.10.2019 в 12:13

Супер!

[email protected] 01.11.2019 в 23:44

Все понятно, но не могу понять что за ?? Два вопроса иногда ставятся, именно 2 что они значат?

eNergy 17.01.2020 в 20:54

Спасибо большое за урок!

ivashkevich 18.01.2020 в 07:30

Пожалуйста =)

OLEG-M 12.04.2020 в 09:01

Спасибо за урок.
Добавил email, думал как сделать проверку на пустой email и добавить в логику. В итоге просто в html-форму добавил required. И дописал email в логику. )

<?php
$result = null;
$text = $_POST['text'] ?? '';
$email = $_POST['email'] ?? '';

if (!empty($text)) {
    $datetime = date(DATE_ATOM);
    $isWrote = (bool) file_put_contents(
        __DIR__ . '/../feedback_private/feedback.txt',
        $datetime . PHP_EOL . $email . PHP_EOL . $text . PHP_EOL . PHP_EOL,
        FILE_APPEND
    );

<label for="email">Введите ваш email:</label><br>
<input type="email" name="email" id="email" required><br>

Вопрос. Проверка !empty может принимать только одну переменную?

ivashkevich 13.04.2020 в 12:55

Отлично.

Вопрос. Проверка !empty может принимать только одну переменную?

А что если в документации прочитать?)

studentDev 14.04.2020 в 11:11

Да, как и isset...

studentDev 14.04.2020 в 11:19
  • дополнил e-mail
    $result = null;
    $text = $_POST['text_feedback'] ?? '';
    $email = "This e-mail for answer >>> " . $_POST['email'] ?? '';
    if(isset($text)) {
        $dateTime = date(DATE_ATOM);
        $isWrote = (bool) file_put_contents(__DIR__ . '/../private/feedback.txt',
         $dataTime . PHP_EOL . $text . PHP_EOL . $email . PHP_EOL, FILE_APPEND);
    }

    Спасибо огромное за урок! :)

ivashkevich 14.04.2020 в 19:37

А для чего переменная write? И опечатка в слове datatime, на английском правильно date. Data - это данные.

Timurik 18.04.2020 в 17:42

Что-то типа того:

<?php
$result = null;
$text = $_POST['text'] ?? '';
$email = $_POST['email'] ?? '';

if (!empty($text)) {
    $datetime = date(DATE_ATOM);
    $isWrote = (bool) file_put_contents(
        __DIR__ . '/../private/feedback.txt',
        $datetime . PHP_EOL . $text . PHP_EOL . 'email: ' . $email . PHP_EOL. PHP_EOL,
        FILE_APPEND
    );
    if ($isWrote === false) {
        $result = 'Не удалось отправить сообщение, попробуйте ещё раз.';
    } else {
        $result = 'Ваше сообщение успешно отправлено!';
    }
}
?>
<html>
<head>
    <title>Обратная связь</title>
</head>
<body>
<div style="text-align: center">
    <h1>Форма обратной связи</h1>
    <?php if ($result !== null): ?>
        <div><b><?= $result ?></b></div><br>
    <?php endif; ?>
    <form action="feedback.php" method="post">
        <label for="text">Введите ваш текст:</label><br>
        <textarea name="text" id="text" cols="55" rows="5"></textarea><br>
        <label for="text">Введите ваш email:</label><br>
        <textarea name="email" id="email" ></textarea><br>
        <input type="submit" value="Отправить">
    </form>
</div>
</body>
</html>
ivashkevich 18.04.2020 в 20:08

Отлично

X-Nick 18.04.2020 в 23:40

Далее мы видим приведение результата выполнения функции file_put_contents к типу boolean. Дело в том, что эта функция возвращает число байт, записанных в файл, или false – если произошла ошибка при записи. Таким образом, если мы хоть что-то записали, то после преобразования любого ненулевого числа к типу boolean мы получим true.

Функция file_put_contents возвращает либо false либо (int)количество записанных байт. Зачем делать явное приведение к булевому значению?
Проверка типа

$isWrote = file_put_contents(
        __DIR__ . '/../private/feedback.txt',
        $datetime . PHP_EOL . $text . PHP_EOL . PHP_EOL,
        FILE_APPEND
    );
if ($isWrote) {
    $result = 'Feedback is posted';
}
else {
    $result = 'Something went wrong';
}

в случае любого записанного количества байт сработает как true, в случае неудачи вернет false.
Или не?

ivashkevich 19.04.2020 в 15:41

Спасибо, я исправил некорректное приведение. Нужно сравнивать всегда с false. Потому что даже запись 0 байт - это успешная запись. А при предыдущем приведении 0 привёлся бы к false.

[email protected] 20.06.2020 в 23:18

Спасибо за помощь!
Есть два вопроса.

  1. Не совсем понятно назначение "!== false" в коде ниже. И без этого все работает.
    $isWrote = file_put_contents(
        __DIR__ . '/../private/feedback.txt',
        $datetime . PHP_EOL . $text . PHP_EOL . PHP_EOL,
        FILE_APPEND
    ) !== false;
  2. Не совсем понятна логика.
    $result мы определяем как null, иначе будет Undefined variable.
    Однако как понять, что нужно объявлять перед функцией, а что нет?
    Например, $isWrote и $datetime мы ведь не объявляем прежде.
ivashkevich 21.06.2020 в 08:37
  1. Прочитайте документацию по file_put_contents, что она возвращает и вопрос отпадёт.
  2. Нет тут никаких функций. $isWrote и $datetime используются только внутри блока, поэтому там они всегда будут определены.
    Мы можем не попасть в условие
    if (!empty($text)) {

    а переменная $result при этом дальше используется.

[email protected] 21.06.2020 в 17:57

Разобрался, спасибо.

[email protected] 07.11.2020 в 18:12
<?php
$result = null;
$text = $_POST['text'] ?? '';
$email = $_POST['e-mail'] ?? '';

if ((!empty($text)) & (!empty($email))) {
    $datetime = date(DATE_ATOM);
    $isWrote = file_put_contents(
        __DIR__ . '/feedback.txt',
        $datetime . PHP_EOL . $text . '          ' . $email . PHP_EOL . PHP_EOL,
        FILE_APPEND
    ) !== false;
    if ($isWrote === false) {
        $result = 'Не удалось отправить сообщение, попробуйте ещё раз.';
    } else {
        $result = 'Ваше сообщение успешно отправлено!';
    }
}
?>
<html>
<head>
    <title>Обратная связь</title>
</head>
<body>
<div style="text-align: center">
    <h1>Форма обратной связи</h1>
    <form action="feedback.php" method="post">
        <label for="text">Введите ваш текст:</label><br>
        <textarea name="text" id="text" cols="55" rows="5"></textarea><br>
        <label for="e-mail">Введите свой e-mail:</label><br>
        <textarea name="e-mail" id="e-mail" cols="25" rows="2"></textarea><br>
        <input type="submit" value="Отправить">
    </form>
</div>
</body>
</html>
[email protected] 07.11.2020 в 18:12

это я сделал емаил для обратки

ivashkevich 08.11.2020 в 15:32
!empty($text)) & (!empty($email)

это не то И!

pixel 12.11.2020 в 18:31

Сделал добавление в сообщение логина, того кто отправил и вывод всех сообщений на страницу

<?php
    require __DIR__ . '/auth.php';
    $login = getUserLogin();
    $text = $_POST['text'] ?? '';

    if ($login === null) {
        header('Location: /index.php');
    }
    if (!empty($text) && !empty($login)) {
        $text = $_POST['text'];
        $dateTime = date(DATE_ATOM);
        $isWrote = file_put_contents(__DIR__ . '/private/feedback.txt',
                $dateTime . PHP_EOL .
                $login . PHP_EOL .
                $text . PHP_EOL . PHP_EOL,
                FILE_APPEND) !== false;
        if ($isWrote === false) {
            $result = 'Не удалось отправить сообщение, попробуйте еще раз!';
        } else {
            $result = 'Ваше сообщение успешно отправлено!';
        }
    } else {
        $result = 'Введите текст сообщения!';
    }

    function viewFeedback()
    {
        $file = fopen(__DIR__ . '/private/feedback.txt', 'r');
        while (!feof($file)) {
            echo fgets($file);
        }
        fclose($file);
    }
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="style.css" type="text/css">
    <title>Обратная связь</title>
</head>
<body>
<div class="feedback">
    <h1>Форма обратной связи</h1>
    <a href="index.php">На главную</a>
    <?php if ($result !== null) : ?>
        <div><b><?= $result ?></b></div>
    <?php endif; ?>
    <form action="feedback.php" method="post">
        <label for="text">Введите ваш текст:</label><br>
        <textarea name="text" id="text" cols="55" rows="5"></textarea><br>
        <input type="submit" value="Отправить">
    </form>
    <div>
        <pre><?= viewFeedback() ?></pre>
    </div>
</div>
</body>
</html>
ivashkevich 13.11.2020 в 02:43
&& !empty($login)

Так уже проверили на null выше. Зачем опять?

$text = $_POST['text'];

Оно уже там.

В остальном всё ок

Deo 20.12.2020 в 22:05

Что-то мне не понятно - DIR (текущая директория, место нахождение моих файлов, в частности index.php) - это /myproject.loc/ или /myproject.loc/www/ или может быть /www/myproject.loc/ ?
Не в смысле, как у меня есть по факту, а как должно быть в плане приватности/доступности.

ivashkevich 21.12.2020 в 06:44

index.php должен лежать в папке www.
А про константу __DIR__ почитайте в документации, она вообще не про это.

dirty-monk 21.02.2022 в 20:41

Как всегда на высоте! Всё работает, и понятно. Спасибо за уроки!!!

ivashkevich 11.03.2022 в 05:06

Пожалуйста!

Levashev 19.03.2022 в 15:32

Уроки офигенные! Понятные и интересные! Пришло время приступать к следующему шагу - основам MySQL. Спасибо, Артём, за качественные обучающие уроки. Надеюсь, в скором времени смогу трудоустроиться в данной области.

ivashkevich 11.04.2022 в 10:00

Отлично! Успехов в дальнейшем обучении!

[email protected] 18.05.2022 в 13:53

Как сделать содержимое feedback, выводилось только в ЛК пользователя?

[email protected] 10.01.2023 в 20:43

Домашка! Перед датой добавить имя аккаунта.

Решение:

<?php

    require __DIR__ . '/auth.php';
    $login = getUserLogin();

    $result = null;
    $txt = $_POST['txt'] ?? '';

    $dateTime = date(DATE_ATOM);
    $isWrote = file_put_contents (
        __DIR__ . '/private.txt',
        $login . PHP_EOL . $dateTime . PHP_EOL . $txt . PHP_EOL . PHP_EOL,
        FILE_APPEND
    ) !== false;
    if ($isWrote === false) {
        $result = 'Не удалось отправить сообщение, попробуйте ещё раз.';
    } else {
        $result = 'Ваше сообщение успешно отправленно!';
    }
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>FeedBack form</title>
</head>
<body>
    <div class="wrapper" style="text-align:center;">
        <h1 class="title">FeedBack form</h1>
        <form action="/feedback.php" class="form" method="post">
            <label for="txt">Введите Ваш текст</label>
            <br>
            <textarea name="txt" id="txt" cols="55" rows="5"></textarea>
            <br>
            <input type="submit" value="submit">
        </form>
    </div>
</body>
</html>

Результат:

admin
2023-01-10T18:48:38+01:00
Привет, php.zone!
Логические задачи с собеседований