За последние 24 часа нас посетили 17799 программистов и 1687 роботов. Сейчас ищут 954 программиста ...

Как правильно записывать из формы в файл?

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

  1. SV4

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

    С нами с:
    24 сен 2011
    Сообщения:
    59
    Симпатии:
    0
    Адрес:
    Красноярск
    Всем доброго времени суток!
    У меня возникла ситуация, которая никак не решается,без совета профессионалов.
    Надо на сайте установить скрипт по добавлению комментариев. Формы для ввода данных,разместил.
    Но, встала проблема с записью и выводом полученных данных (база для хранения комментариев из текстового файла).
    Пытаюсь записать данные в файл используя следующее:

    (тут часть кода, которая пишет в файл)
    PHP:
    1. <?
    2. // файл базы данных
    3. $comfile="comments.txt";
    4. // Настройка даты.
    5. $date=date("j.m.Y");
    6. // Значения полученные из формы
    7. $name=$_POST["name"];              /*имя*/
    8. $mail=$_POST["mail"];                  /*почта*/
    9. $comment=$_POST["comment"];   /*комментарий*/
    10. //Проверка длинны текста сообщения
    11. $metrika=strlen($comment);
    12. if($metrika>3000){$error="Ошибка! Очень длинное сообщение!";}
    13. //Функции очистки
    14. $comment= trim($comment);
    15. $comment= preg_replace( "/[^\x20-\xFF]/","",@strval($comment) );
    16. $comment= strip_tags($comment,"<span><strong><i><img><a><p><br><table><tr><td><h3><h4><h5>" );
    17. //Готовим к записи и пишем
    18. $text="$date|$name|r$mail|$comment\n";
    19. $com_bd=fopen($comfile,"a+")
    20. or exit("Невозможно открыть файл!");
    21. flock($com_bd,LOCK_EX);
    22. fputs($com_bd,$text);
    23. flock($com_bd,LOCK_UN);
    24. fclose($com_bd);
    25. <?
    ...............................Ну а дальше идут сообщения разные об ошибках
    Вся информация в файл пишется, но тут и начинается моя проблема!
    При попытке вывести, полученные данные из файла:
    PHP:
    1. <?
    2. $text=file_get_contents("comments.txt");
    3. echo $text;
    4. <?
    Вся информация выводится в одну строчку вот в таком виде:
    24.10.2011|Имя|My@mail.ru|Это комментарий!

    Я конечно понимаю, что нагородил что то не так, но на букварях трудно понять, как организовать
    правильный вывод сообщения. Вот и прошу Вашего совета,
    Как сделать так, чтобы комментарий выводился вот в таком виде:

    24.10.2011 Имя
    Это комментарий! (а между отдельными комментариями, желательно вставлялся параграф )

    И еще вопрос!
    Как делают так, что почтовый ящик не выводится, а пишется только в базу данных? :?:
     
  2. Михаил

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

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    как-то так
    PHP:
    1.  
    2. <?php
    3.  
    4.      $text = "24.10.2011|Name|My@mail.ru|itis comment\n [email=24.10.2011|Name1|My@mail.ru]24.10.2011|Name1|My@mail.ru[/email]1|itis comment1\n24.10.2011|Name3|My@mail.r3u|itis comment3 ";  //Это в твоём файле, если я не ошибасюь.
    5.    
    6.         $sep = explode("\n", $text);
    7.     $keys = array('datetime','name','email', 'comment');
    8.    
    9.     $arr = array();
    10.    
    11.     foreach($sep as $val)
    12.         $arr[] = array_combine($keys, explode('|',$val));      
    13.    
    14.    
    15.     //вывод
    16.    
    17.     foreach($arr as $key=>$value)
    18.     {
    19.         $str = "<p>";
    20.         $str .= $value['datetime'].$value['name'].'<br/>';
    21.         $str .= $value['comment'];
    22.         $str .= "</p>";
    23.         print $str;
    24.    
    25.     }
    26.  
    27.  
    результат
    http://codepad.viper-7.com/V2WJFz
     
  3. SV4

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

    С нами с:
    24 сен 2011
    Сообщения:
    59
    Симпатии:
    0
    Адрес:
    Красноярск
    Так сам смысл понятен. Если не ошибаюсь, то сперва делаем один массив из всего файла, а затем из каждой строки делаем другой массив.
    Вот только проблема. У моего хостера PHP 3, и функция array_combine не подходит.
     
  4. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    SV4
    Твой хостер пришелец из 2004 года?
     
  5. SV4

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

    С нами с:
    24 сен 2011
    Сообщения:
    59
    Симпатии:
    0
    Адрес:
    Красноярск
    Ну да, что то типа того :)
     
  6. LokiDrow

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

    С нами с:
    29 авг 2011
    Сообщения:
    11
    Симпатии:
    0
    php 4 выпущен 22 мая 2000го
     
  7. SV4

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

    С нами с:
    24 сен 2011
    Сообщения:
    59
    Симпатии:
    0
    Адрес:
    Красноярск
    Я знаю, что третья версия устарела, но ведь хостер не я сам себе. Что дали тем и пользуюсь.
    Скорее всего, такая старая версия, для пользователей на бесплатном хостинге, а я как раз использую этот хост бесплатно.
    Хочу сперва научится работать с PHP, а уже потом перенести на платный. Потому и базу пока файловую использую.
     
  8. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    блин, хостинг нормальный 10рублей в месяц стоит.

    А учиться и на локальной машине можно. Поставь сборку какую-нибудь. Советую XAMPP, можно и Денвер.
     
  9. SV4

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

    С нами с:
    24 сен 2011
    Сообщения:
    59
    Симпатии:
    0
    Адрес:
    Красноярск
    Я на своем компьютере тоже работаю (поставил Денвер, там сборка PHP 5 стоит).
    P.S:
    Может не в тему, а ссылочку на такой дешевый хостинг можно?
     
  10. Михаил

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

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    SV4
    а вот ты купишь хостинг, а там не будут работать потому что там php5. что тогда? снова переписывать.

    к XAMPP +1 для винды само то.
     
  11. SV4

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

    С нами с:
    24 сен 2011
    Сообщения:
    59
    Симпатии:
    0
    Адрес:
    Красноярск
    Это верно! Но я думаю, если научится понимать язык PHP, то переписать свой же код не составит большой сложности.
    Да и нарастит практические навыки.
    Конечно лишнюю работу делать бесполезно и я серьезно занялся подбором нового хостинга. До этого момента меня просто все устраивало.
     
  12. Михаил

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

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    PHP:
    1.  
    2. <?php
    3. function combine($arr)
    4.      {
    5.      
    6.         $z = array();
    7.     $z['datetime'] = $arr[0];
    8.     $z['name'] = $arr[1];
    9.     $z['email'] = $arr[2];
    10.     $z['comment'] = $arr[3];
    11.     return $z;
    12.    
    13.      };
    14.      
    15.      $arr = array();
    16.    
    17.      foreach($sep as $val)
    18.          $arr[] = combine(explode('|',$val));  
    19.  
     
  13. SV4

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

    С нами с:
    24 сен 2011
    Сообщения:
    59
    Симпатии:
    0
    Адрес:
    Красноярск
    Благодарю!
    Все заработало!
    Код стал выглядеть вот так:
    PHP:
    1. <?php
    2. //////// Открываем файл и считываем его\\\\\\\
    3. $comfile="comments.txt";
    4. $text=file_get_contents($comfile);
    5. $sep=explode("\n", $text);
    6. $keys=array('datetime','name','email', 'comment');
    7.  
    8. //Создаем функцию
    9. function combine($arr)
    10. {
    11. $z=array();
    12. $z['datetime']=$arr[0];
    13. $z['name']=$arr[1];
    14. $z['email']=$arr[2];
    15. $z['comment']=$arr[3];
    16. return $z;
    17. };
    18.    
    19. $arr=array();
    20.    
    21. foreach($sep as $val)
    22. $arr[]=combine(explode('|',$val));
    23.    
    24. //Готвим данные на вывод
    25.    
    26. foreach($arr as $key=>$value)
    27. {
    28. $str="<p>";
    29. $str.=$value['datetime'].$value['name'].'<br/>';
    30. $str.=$value['comment'];
    31. $str.="</p>";
    32. echo $str;
    33. }
    34.  
    Но небольшая проблема осталось!
    Если пользователь будет писать комментарий и для перевода строки нажмет кнопку
    (Enter или Shift+Enter),
    то они не учитываются при записи и слова разделенные таким способом сливаются, примерно так:
    Привет!Меня зовут Петя.Я пишу сообщение.
    Хотя в файле записи есть такая строчка:
    PHP:
    1. <?php
    2. $comment= strip_tags($comment,"<span><strong><i><img><a><p><br><table><tr><td><h3><h4><h5>" );
    Тут как я понял, разрешается и <p>и<br>,
    или я что то не верно понимаю!?
     
  14. Михаил

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

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    да


    перед записью комментария в файл сделать http://php.net/manual/en/function.nl2br.html

    также неплохо бы почитать
    http://www.php.net/manual/en/function.h ... lchars.php
    http://www.php.net/manual/en/function.htmlentities.php
     
  15. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    в гугле если набрать "хостинг 10 рублей" - куча ссылок.

    php3 и php5 - по сути разные языки :)
     
  16. SV4

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

    С нами с:
    24 сен 2011
    Сообщения:
    59
    Симпатии:
    0
    Адрес:
    Красноярск
    Переводы строк теперь есть.
    Код записи в файл, теперь стал выглядеть так:
    PHP:
    1. <?php
    2. //Функции очистки кода
    3. $comment=trim($comment);
    4. $comment=nl2br ($comment);
    5. $comment=preg_replace( "/[^\x20-\xFF]/","",@strval($comment) );
    6. $comment=strip_tags($comment,"<span><strong><i><img><a><p><br><table><tr><td><h3><h4><h5>" );
    А можно ли выполнить подготовку ссылок, которые оставит посетитель?
    Допустим посетитель пишет <_a href ="MySayte.Ru">Мой Сайт</a_>,
    а в итоге получалось
    <_a rel="nofollow" href ="MySayte.Ru">Мой Сайт</a_>
    (конечно без символа _ я его специально поставил, а-то ссылка станет активной)
    То есть, я хочу закрывать добавленные ссылки от индексации, что бы спамеры не обольщались.
    В данном случае используется функция
    str_replace которая все вхождения a href, заменит на a rel="nofollow" href
    или есть какое то другое, более правильное решение?