Всем доброго времени суток! У меня возникла ситуация, которая никак не решается,без совета профессионалов. Надо на сайте установить скрипт по добавлению комментариев. Формы для ввода данных,разместил. Но, встала проблема с записью и выводом полученных данных (база для хранения комментариев из текстового файла). Пытаюсь записать данные в файл используя следующее: (тут часть кода, которая пишет в файл) PHP: <? // файл базы данных $comfile="comments.txt"; // Настройка даты. $date=date("j.m.Y"); // Значения полученные из формы $name=$_POST["name"]; /*имя*/ $mail=$_POST["mail"]; /*почта*/ $comment=$_POST["comment"]; /*комментарий*/ //Проверка длинны текста сообщения $metrika=strlen($comment); if($metrika>3000){$error="Ошибка! Очень длинное сообщение!";} //Функции очистки $comment= trim($comment); $comment= preg_replace( "/[^\x20-\xFF]/","",@strval($comment) ); $comment= strip_tags($comment,"<span><strong><i><img><a><p><br><table><tr><td><h3><h4><h5>" ); //Готовим к записи и пишем $text="$date|$name|r$mail|$comment\n"; $com_bd=fopen($comfile,"a+") or exit("Невозможно открыть файл!"); flock($com_bd,LOCK_EX); fputs($com_bd,$text); flock($com_bd,LOCK_UN); fclose($com_bd); <? ...............................Ну а дальше идут сообщения разные об ошибках Вся информация в файл пишется, но тут и начинается моя проблема! При попытке вывести, полученные данные из файла: PHP: <? $text=file_get_contents("comments.txt"); echo $text; <? Вся информация выводится в одну строчку вот в таком виде: 24.10.2011|Имя|My@mail.ru|Это комментарий! Я конечно понимаю, что нагородил что то не так, но на букварях трудно понять, как организовать правильный вывод сообщения. Вот и прошу Вашего совета, Как сделать так, чтобы комментарий выводился вот в таком виде: 24.10.2011 Имя Это комментарий! (а между отдельными комментариями, желательно вставлялся параграф ) И еще вопрос! Как делают так, что почтовый ящик не выводится, а пишется только в базу данных? :?:
как-то так PHP: <?php $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 "; //Это в твоём файле, если я не ошибасюь. $sep = explode("\n", $text); $keys = array('datetime','name','email', 'comment'); $arr = array(); foreach($sep as $val) $arr[] = array_combine($keys, explode('|',$val)); //вывод foreach($arr as $key=>$value) { $str = "<p>"; $str .= $value['datetime'].$value['name'].'<br/>'; $str .= $value['comment']; $str .= "</p>"; print $str; } результат http://codepad.viper-7.com/V2WJFz
Так сам смысл понятен. Если не ошибаюсь, то сперва делаем один массив из всего файла, а затем из каждой строки делаем другой массив. Вот только проблема. У моего хостера PHP 3, и функция array_combine не подходит.
Я знаю, что третья версия устарела, но ведь хостер не я сам себе. Что дали тем и пользуюсь. Скорее всего, такая старая версия, для пользователей на бесплатном хостинге, а я как раз использую этот хост бесплатно. Хочу сперва научится работать с PHP, а уже потом перенести на платный. Потому и базу пока файловую использую.
блин, хостинг нормальный 10рублей в месяц стоит. А учиться и на локальной машине можно. Поставь сборку какую-нибудь. Советую XAMPP, можно и Денвер.
Я на своем компьютере тоже работаю (поставил Денвер, там сборка PHP 5 стоит). P.S: Может не в тему, а ссылочку на такой дешевый хостинг можно?
SV4 а вот ты купишь хостинг, а там не будут работать потому что там php5. что тогда? снова переписывать. к XAMPP +1 для винды само то.
Это верно! Но я думаю, если научится понимать язык PHP, то переписать свой же код не составит большой сложности. Да и нарастит практические навыки. Конечно лишнюю работу делать бесполезно и я серьезно занялся подбором нового хостинга. До этого момента меня просто все устраивало.
PHP: <?php function combine($arr) { $z = array(); $z['datetime'] = $arr[0]; $z['name'] = $arr[1]; $z['email'] = $arr[2]; $z['comment'] = $arr[3]; return $z; }; $arr = array(); foreach($sep as $val) $arr[] = combine(explode('|',$val));
Благодарю! Все заработало! Код стал выглядеть вот так: PHP: <?php //////// Открываем файл и считываем его\\\\\\\ $comfile="comments.txt"; $text=file_get_contents($comfile); $sep=explode("\n", $text); $keys=array('datetime','name','email', 'comment'); //Создаем функцию function combine($arr) { $z=array(); $z['datetime']=$arr[0]; $z['name']=$arr[1]; $z['email']=$arr[2]; $z['comment']=$arr[3]; return $z; }; $arr=array(); foreach($sep as $val) $arr[]=combine(explode('|',$val)); //Готвим данные на вывод foreach($arr as $key=>$value) { $str="<p>"; $str.=$value['datetime'].$value['name'].'<br/>'; $str.=$value['comment']; $str.="</p>"; echo $str; } Но небольшая проблема осталось! Если пользователь будет писать комментарий и для перевода строки нажмет кнопку (Enter или Shift+Enter), то они не учитываются при записи и слова разделенные таким способом сливаются, примерно так: Привет!Меня зовут Петя.Я пишу сообщение. Хотя в файле записи есть такая строчка: PHP: <?php $comment= strip_tags($comment,"<span><strong><i><img><a><p><br><table><tr><td><h3><h4><h5>" ); Тут как я понял, разрешается и <p>и<br>, или я что то не верно понимаю!?
да перед записью комментария в файл сделать 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
Переводы строк теперь есть. Код записи в файл, теперь стал выглядеть так: PHP: <?php //Функции очистки кода $comment=trim($comment); $comment=nl2br ($comment); $comment=preg_replace( "/[^\x20-\xFF]/","",@strval($comment) ); $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 или есть какое то другое, более правильное решение?