За последние 24 часа нас посетили 119489 программистов и 3012 роботов. Сейчас ищут 1295 программистов ...

Не корректно работает скрипт.

Тема в разделе "PHP для новичков", создана пользователем suffism575, 12 фев 2011.

  1. suffism575

    suffism575 Активный пользователь

    С нами с:
    12 фев 2011
    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте, только только приступил к изучению PHP (еще недели нет).
    В учебнике есть учебный скрипт скрипт (гостевая книга), ввожу так как есть, много раз перепроверил, вроде с переменными не ошибся и синтаксис верный (по крайней мере тот что указан в книге), но работает не корректно.
    В чем заключается ошибка и что меня беспокоит: в папке (home/guestbook/www) три файла два php и один txt. Первый php создает форму html и выводит нужную информацию с файла txt, второй php обрабатывает информацию с формы и записывает ее в файл txt а также создает его. Ошибка заключается в том что та информация что передается на браузер обрабатывается некорректно, путаются местами дата, время и прочие параметры, а также почему-то выводится разделительная строка , которой не должно быть, но которая должна быть в файле txt. Там она также выводится некорректно, идет на той же строке что и тема а должна идти сразу после нее следующей строкой т.е. разделять, почему так не пойму :shock: Может кто нибудь знает? Подозреваю что все дело в этой самой разделительной черте (36-39 строчки кода файла обработки), но вот как исправить не знаю.

    Вот код:

    Файл вывода формы:

    Код (Text):
    1. <html>
    2. <head>
    3.     <title>Гостевая</title>
    4. </head>
    5. <body>
    6.  
    7. <!--Создаем форму, состоящую из поля, textarea и кнопки-->
    8. <form action="add_message.php " method="POST">
    9. Имя:<BR>
    10. <input type="text" name="name_of_guest">
    11. <BR>
    12. Мысли:<BR>
    13. <textarea name="message_of_guest" cols=40 rows=5></textarea>
    14. <BR>
    15. <input type="submit" name="okbutton" value="OK">
    16. </form>
    PHP:
    1. <?php
    2. //Открываем файл gost.txt в режиме чтения
    3. $f=fopen("gost.txt","rt") or die("Не могу открыть файл");
    4. //Пока не конец файла сообщений
    5. while (!feof($f))
    6. {
    7. //Читаем очередное сообщение
    8.         //Получаем строку "----"
    9.         $hide_line=fgets($f);
    10.         //Получаем IP-адрес
    11.         $ip_=fgets($f);
    12.         //Читаем дату размещения сообщения
    13.         $data=fgets($f);
    14.             //Выводим дату размещения сообщения
    15.             echo "<small>Дата: </small>".$data."<br>";
    16.         //Читаем имя человека, который его написал
    17.         $data=fgets($f);
    18.             //Выводим имя
    19.             echo "<small>Имя: </small>".$data."<br>";
    20.         //Читаем текст сообщения
    21.         $data=fgets($f);
    22.             //Выводим текст сообщения
    23.             echo "<small>Сообщение: </small>".$data."<br>";
    24.         //Отделяем сообщение горизонтальной линией
    25.         echo "<HR>";
    26. }
    27. //Закрываем соединение с файлом
    28. fclose($f);
    29. ?>
    Код (Text):
    1. </body>
    2. </html>
    Файл обработки формы:

    PHP:
    1. <?php
    2. //Скрипт будет работать только при условии, что он
    3. //был запущен как обработчик формы, размещенной на guestbook.php
    4. if (isset($_POST['okbutton']))
    5. {
    6.     if ($_POST['name_of_guest']=='')
    7.         exit("Введите имя! <a href='guestbook.php'>Назад</a>");
    8.    
    9.     if ($_POST['message_of_guest']=='')
    10.     {
    11.         //А тут более распространенный вариант в два оператора
    12.         echo "Введите текст сообщения! <a href='guestbook.php'>Назад</a>";
    13.         exit;
    14.     }
    15.  
    16.     //Получаем значение поля Имя
    17.     $name_of_guest=htmlspecialchars($_POST["name_of_guest"]);
    18.     //Получаем значение поля Мысли
    19.     $message_of_guest=htmlspecialchars($_POST["message_of_guest"]);
    20.    
    21.     if (filesize("gost.txt")>0)
    22.         $first_message=FALSE;
    23.     else
    24.         $first_message=TRUE;
    25.  
    26.     //Открываем файл gost.txt для записи,
    27.     //если файла нет, то он будет создан
    28.     $f=fopen("gost.txt","at") or die("Не могу открыть файл");
    29.  
    30.     //Блокируем файл, чтобы никто не мог к нему обратиться,
    31.     //Пока мы с ним не закончим работу
    32.     flock($f,2);
    33.  
    34.     //Записываем строку "---------------------------"
    35.     //Если это первое сообщение, то без \n в начале, иначе с ним
    36.     if ($first_message=TRUE)
    37.         fputs($f,"--------------------------\n");
    38.     else
    39.         fputs($f,"\n---------------------------\n");
    40.        
    41.     //Записываем IP-адрес пользователя
    42.     fputs($f,$_SERVER['REMOTE_ADDR']."\n");
    43.     //Записываем дату размещения сообщения
    44.     fputs($f,date('d.m.y')."\n");
    45.     //Записываем имя
    46.     fputs($f,$name_of_guest."\n");
    47.     //Записываем текст сообщения
    48.     fputs($f,$message_of_guest);
    49.    
    50.     //снимаем блокировку
    51.     flock($f,3);
    52.     //закрываем файл
    53.     fclose($f);
    54. }
    55.  
    56. //Перенаправляем пользователя обратно на questbook.php
    57. header('location:guestbook.php');
    58. ?>
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    36 строка обработка - убери =TRUE
    следи за пробелами в именах файлов!!! везде пробелы перед расширением
     
  3. suffism575

    suffism575 Активный пользователь

    С нами с:
    12 фев 2011
    Сообщения:
    3
    Симпатии:
    0
    Ну да, 36-ая строка - строка обработки переменной $first_message, которая ранее (21-24 строчки кода файла обработки) уже была объявлена, что тут такого? нормальный сценарий. Естественно, стоит только убрать "=TRUE" в 36 строке кода (файл обработки), как в браузере выходит ошибка syntax error, ..... on line 37, что означает синтаксическую ошибку кода в строке 37. А за пробелы спасибо, не знал.
    Разобрался наконец-то)
    Проблема была в 48-ой строке листинга

    В оригинале:
    //Записываем текст сообщения
    PHP:
    1. fputs($f,$message_of_guest.);
    После доработки:
    //Записываем текст сообщения
    PHP:
    1. fputs($f,$message_of_guest."\n");
    ..и надобность в переменной first_message полностью утрачивается, что позволит сократить код.