download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

PHP flat text data base - Текст файл база данни или система за коментари и новини

< 1 2 3 >

Автор
Съобщение
phrozencrew
Чет, 21.02.08, 21:06
Както всички забелязваме напоследък форума става леко тъп. Затова реших да пусна тази тема, която едва ли зелените човечета ще я одобрят за достойна за статия.
Имаше напоследък питания за PHP и базите данни. В темата няма да срещнете никъде конвенционалните бази данни (MySQl, PostgreSQL, SQLite или друга). Ще използвам простичък текстов файл за базата данни.
За тази цел ще ни е необходимо да се запознаем с няколко основни функции за работа с текстови файлове и с масиви.
Най-лесния начин да отворим един файл за четене с PHP, независимо дали е някъде в интернет или на същия хост, е като използваме функцията file(). При отварянето на файла тази функция превръща всеки отделен ред в елемент на масив. В моя скрипт аз се възползвам от тази функция с реда:
$lines = file('news.txt');

След като имаме масив $lines ще е необходимо да да разделим всеки елемент (всеки ред от файла) на този масив на под масив. Това можем да го направим като използваме някоя от функциите на PHP за сплитване на стрингове. Аз съм фен на Perl и за това ще използвам preg_split(). Но..
За да направим всичко описано до тук е много важно как ще запишем файла и какъв разделител (separator) ще използваме. Разделителя между отделните елементи на моята база данни ще е такъв, че да е почти невъзможно да се срещне в нормален текст. Аз си избирам за разделител комбинацията от символи - |@|.
В този урок ще използвам тази простичка и лесна за правене база данни за да направя система за коментари или новини. В базата данни ще трябва да присъстват следните редове:
- име на потребителя, пишещ коментара
- дата и час на пускането на коментара
- заглавие на коментара или новината
- съдържание на коментара или новината
- IP на потребителя
В този смисъл ето един примерен запис от базата данни на текстовия файл (т.е. един ред), така мисля, че ще се изясни как и къде трябва да се сложи сепаратора (разделителя):
Mon 03.12.2007 01:03:09 PM|@|PhrozenCrew|@|PHP Flat Text File DataBase|@|Съдържание на новината|@|IP

Мисля, че малко се изясни. Сега нека да видим какво ще представлява скрипта, който ще изчете тези данни и ще ги преобразува в променливи, за да можем да ги обработваме:
$lines = file('news.txt');
foreach ($lines as $novini){
list ($data, $txtName, $txtZagl, $txtInfo, $ip) = preg_split ("/|@|/", $novini);
}

Готово!
С три реда направих "енджин" за четене от текстова база данни. Функцията list() замества използването на масив и когато имаме по-малко променливи или данни за разделяне тя е изключително удобна. Знаем, че ще имаме 5 данни, които да изчетем, знаем какво представляват и на коя позиция са в файла. Това ни помогна да създаден променливи с тези елементи. Нашите елементи са:
$data -> Mon 03.12.2007 01:03:09 PM
$txtName -> PhrozenCrew
$txtZagl -> PHP Flat Text File DataBase
$txtInfo -> Съдържание на новината
$ip -> IP на потребителя
Чудесно, но как ще пишем в тази база данни? Естествено, че PHP се справя много добре с писането в текстови файлове. Аз ще използвам функцията open() със опцията за добавяне - а. Тази опция дори ще създаде файл, ако все още няма такъв. Ето го и самия код за отваряне и добавяне на данни във файла:
$file = "news.txt"; //Тук си избираме името на файла
$handle = fopen($file, 'a') or die("Не мога да отворя файла");
$data = "$data|@|$txtName|@|$txtZagl|@|$txtInfo|@|n";
fwrite($handle, $data);
fclose($handle);

Запомнете, че файла трябва задължително да бъде затворен след като сме свършили работата с него, за това слагаме на края fclose(). Използвам толкова много редове, защото мисля, че така кода е по четим, затова и превръщам в променлива ($handle) функцията fopen(). Това ще ни помогне и да се отървем по-лесно от грешките, но това е друга тема.
Като цяло сме готови. Сега остава да вкараме малко простотии, като вкарване на инфото във форма, взимане и обработка на заявката. Ето един код който е интересен:
$razdwin = "rn";
$razduni = "n";
 
$txtInfo = str_replace($razdwin, '<br>', $txtInfo);
$txtInfo = str_replace($razduni, '<br>', $txtInfo);
$txtInfo = preg_replace("/|@|/",'',$txtInfo);
$data=date ("D d.n.Y h:i:s A");
$ip=$_SERVER['REMOTE_ADDR'];

С тези редове взимам цялата информация, която ни е необходима, но тази информация трябва да бъде леко обработена. Много е важно да знаем Операционната система с която ще работим, тъй като начините за писане на текстови файлове при различните операционни системи са различни. Например за нов ред:
linux използва "\n"
Mac използва "\r"
Windows използва "\r\n"
Аз пиша скрипта за 2-те най-популярни хостинг машини - Win и Linux, затова и заменям само "\r\n" и след това само "\n"
. Сега вие ще кажете защо първо заменям "\r\n"? :)
$razdwin = "rn";
$razduni = "n";
 
$txtInfo = str_replace($razdwin, '<br>', $txtInfo);
$txtInfo = str_replace($razduni, '<br>', $txtInfo);

Редът:
$txtInfo = preg_replace("/|@|/",'',$txtInfo);

го слагам за да се защитя от случайно поставяне на тези символи някъде в новината.
Друго важно нещо, което ще се записва в базата данни е времето на добавяне на новината, коментара:
$data=date ("D d.n.Y h:i:s A");

Сега да вземем и IP-то на потребителя:
$ip=$_SERVER['REMOTE_ADDR'];

Е това е!Вече сме обяснили почти всичко.
Само ще вкарам малко подобрения - последната добавена новина да излиза първа. Това ще го направя като обработя масива $lines:
$lines = array_reverse($lines);

.
Нека видим целия код със вкарани малко HTML 4.01 Transitional елементи и външен CSS форматиращ съдържанието(много семпло) файл:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Новини</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<link href="style.css" rel="stylesheet" type="text/css" />
<body>
<center>
 
<h1>Страница с новини</h1>
<a href="news_script_by_PhrozenCrew.zip">Download на кода.</a>
<h2>Добавяне на новина</h2>
<?php
echo '<table class="news">';
$lines = file('news.txt');
$lines = array_reverse($lines);
 
foreach ($lines as $novini){
			list ($data, $txtName, $txtZagl, $txtInfo, $ip) = preg_split ("/|@|/", $novini);
			echo '<tr><td><h3>'.$txtZagl.'</h3></td></tr>';
			echo '<tr><td class="datapotrebitel">Пуснато от: <b>'.$txtName.'</b> на <b>'.$data.'</b> с адрес: '.$ip.'</td></tr>';
			echo '<tr><td class="novina">'.$txtInfo.'</td></tr>';
	}
echo '</table>';
 
if (!isset($_POST['submit'])) {
echo <<<___HTML___
<br><form method="post" enctype="multipart/form-data" action="" >
<table id="forma">
<tr><td>Вашето Име</td><td><input id="txtName" name="txtName" type="text" size="35"></td></tr>
<tr><td>Заглавие на новината</td><td><input id="txtZagl" name="txtZagl" type="text" size="20"></td></tr>
<tr><td>Новина</td><td><textarea rows="10" cols="30" name="txtInfo" wrap="physical"></textarea></td></tr>
</table>
<input type="submit" value="Добави" name="submit" id="submit">
</form><br>
___HTML___;
}
 
elseif(isset($_POST['txtName']) && isset($_POST['txtZagl'])) {
 
	if($_POST["txtName"] !== '') $txtName = $_POST["txtName"];
	if($_POST["txtZagl"] !== '') $txtZagl = $_POST["txtZagl"];
	if(isset($_POST["txtInfo"]) && $_POST["txtInfo"] !== '') $txtInfo = $_POST["txtInfo"];
	else $txtInfo = "Няма новина!";
	$razdwin = "rn";
	$razduni = "n";
	
	$txtInfo = str_replace($razdwin, '<br>', $txtInfo);
	$txtInfo = str_replace($razduni, '<br>', $txtInfo);
	$txtInfo = preg_replace("/|@|/",'',$txtInfo);
 
	$data=date ("D d.n.Y h:i:s A");
	$ip=$_SERVER['REMOTE_ADDR'];
 
	$file = "news.txt";
	$handle = fopen($file, 'a') or die("Не мога да отворя файла");
	$data = "$data|@|$txtName|@|$txtZagl|@|$txtInfo|@|$ipn";
	fwrite($handle, $data);
	fclose($handle);
 
	echo "Данните са записани коректно! <br>Клкнете <a href=\"index.php\">тук</a> за да се върнете в страницата за добавяне.";
}
?>
</center>
</body>
</html>

Кода нарочно го написах толкова култово неугледен за да е ясен дори и на най-големия начинаещ.
Ако се чудите какво се получава от цялата тая история ето и едно демо:
Демо на система за новини и коментари.

pdtomov
Чет, 21.02.08, 21:25
Работи отлично. Поздравления!

P. S. Ще мога ли да използвам кода на сайт за експерименти. Не разбирам от РНР, но трябва да го уча.

редактиран от pdtomov на 21.02.08 21:42
phrozencrew
Чет, 21.02.08, 22:14

RE: PHP flat text data base - Текст файл база данни или система за коментари и новини

” Работи отлично. Поздравления!
P. S. Ще мога ли да използвам кода на сайт за експерименти. Не разбирам от РНР, но трябва да го уча. „
Нямаш никакви проблеми да ползваш която и да било част от кода без да споменаваш автора. Освобождавам кода от всякакви права. Нека да е полезен на всички любознателни кандидат програмисти. Този код много спокойно може да се прехвърли на Perl, C, C++, Pyrthon, Ruby. Средствата, които съм използвал са почти универсални и се срещат във всеки от изброените по-горе езици езици. Кода е лек и лесно усвоим (надявам се). Так, че си го ползвай със здраве!
Ако имаш въпроси ги задавай тук, така и други хора ще се учат.
pdtomov
Чет, 21.02.08, 22:48
Качих го на сайта. Всичко е ОК. Ще разгледам по подробно кода и ако има нещо неразбираемо, ще питам.
Благодаря ти много!
stanimir_78
Пет, 22.02.08, 10:13
4удесен туториал Фрозен.Дори ми изглежда лесно,така както си го написал:)
phrozencrew
Пет, 22.02.08, 12:14
Да, наистина е много лесно. И тъй като до тук се научихме да правим база данни и да вадим записи от нея нека малко да доразвием идеята и да натрупаме тренинг. Ще опитам да напиша скрипт, който да вади само последните три новини и най от долу да има линк, който да води към страницата с всички новини. Нещо подобно се използва в новинарските сайтове. Да видим как ще изглежда програмата, която ще извърши всичко това:
$lines = file('news.txt'); // файла с базата данни
$lines = array_reverse($lines);
$pyrvite_tri_novini = array_slice($lines, 0, 3);
 
foreach ($pyrvite_tri_novini as $novini){
	list ($data, $txtName, $txtZagl, $txtInfo, $ip) = preg_split ("/|@|/", $novini);
	echo '<div class="novina"><h3>'.$txtZagl.'</h3>'."n";
	echo '<div class="user">Пуснато от: <b>'.$txtName.'</b> на <b>'.$data.'</b></div>'."n";
	echo '<p>'.$txtInfo.'</p>'."n".
	'</div><!-- Затваряме class="novina" -->';
	}
echo '<a href="index.php">Виж всички новини</a>.';

Колко семпло и простичко, нали! Тук имаме само един нов и непознат от предишния скрипт елемент array_slice(). Тази функция ни помага да изрежем от масива с новините само първите 3 елемента.
$pyrvite_tri_novini = array_slice($lines, 0, 3);

Означава следното: Създай нов масив с име $pyrvite_tri_novini, който да съдържа изрезка от масива $lines, като изреже 3 елемента и започне рязането от елемент 0.
Другото ново в този скрипт е използването на слоеве <div> вместо таблици. Съвременните стандарти за Web програмиране препоръчват да отделяме форматирането от съдържанието, както и да избягваме таблиците, затова и се придържаме към тях.
Имайте в предвид, че копирането от сайта не е много добра идея, защото се губят ляво наклонените черти от кода. Нека администраторите на форума да обърнат внимание.
Ето как ще изглежда новата страничка (вътре е и новия код):
Извличане само на последните три новини от базата данни

Сега се доближихме още малко до идеите, вкарани в комерсиалните php сайтове с бази данни. Следващият път мога да ви покажа как да направите така, че да излиза само част от новината и от долу линк с "Прочети още..", като при кликане на този линк в страницата ще се отваря само конкретната новина. Стига да има интерес, разбира се. До тогава можете да предложите и вие код, който да прави това.

anonymous
Съб, 06.12.08, 11:38
Скрипта е чудесен, успях да го раздела формата да е отделна, без да разбирам много от PHP...

А как може страницата с новините да се раздели, така, че да се показват примерно 15 и отдолу да има цифрички, които да сменят страницата?

phrozencrew
Съб, 06.12.08, 14:41

RE: PHP flat text data base - Текст файл база данни или система за коментари и новини

” ... А как може страницата с новините да се раздели, така, че да се показват примерно 15 и отдолу да има цифрички, които да сменят страницата? „
Тъй като и други хора ме питаха за това странициране реших да пусна една нова тема:
PHP странициране - paging. Прост урок за страницирането на масиви.
Дано ти е полезен урока.
nik2009
Нед, 31.07.11, 23:24

RE: RE: PHP flat text data base - Текст файл база данни или система за коментари и новини

Понеже аз търсех точно такъв скрипт за новини в сайт и намерих този искам да питам как да стане така, че този, който ще пише новина първо да влезе в страницата с парола? Защото на мен точно така ми трябва - да пишат новините само определени потребители, които да влизат с парола. Ще съм много благодарен ако ми помогнете така да се преобразува системата. Даже ако може да се направи първия ред от новините да се показва някъде на началната страница и отдолу да има линк към самата новина. Много ще съм благодарен ако ми помогнете.
редактиран от nik2009 на 31.07.11 23:26
редактиран от nik2009 на 31.07.11 23:40
dreamskill
Пон, 01.08.11, 01:38
Нед, голем си пич, пич. Защо не си направиш малък сайт, като на Иван Ванков и от там да споделяш знанията си?
Ник, за това нещо ,което искаш да направиш, според моите оскъдни знания трябва да знаеш що са сесиите.
Или на готово
http://www.majordojo.com/php-users/

< 1 2 3 >

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.