Страница за обяви... без БД... ?! Моля, помощ!

sizif

Registered
Здравейте!

Работя върху сайт за обяви, който трябва да се базира само върху файлове. Темата може да ви се строи идиотска, но все пак бихте ли ми дали някакви насоки как да изградя структурата на сайта?

Страницата ще включва няколко раздела (стандартните типове обяви) и ще е адресирана към регион, в който едва ли ще има голяма натовареност (брой посещения/брой обяви). Вече си взех платен хост, но ми се иска да направя страницата по-скоро, а през следващите няколко седмици едва ли ще имам достатъчно време да навлизам в работата с БД, докато с файлове се оправям нелошо, освен това проектът е некомерсиален (още преди години опапах нещата с местните политико-икономически феодали, така че едва ли ще намеря рекламодатели) и не ми се иска да хабя хоста за него...

Онова, което ми е твърде мъгляво е как да структурирам отделните раздели и съответно съхраняването и извеждането на информацията. Иска ми се и да въведа някаква елементарна система за търсене в низовете и май голямата мъчнотия идва от тук.

Досега съм използвал всякакви варианти за съхраняване на информация във файловете: всеки запис на отделен файл просто като низ; в отделен файл, но като променливи, които се визуализират чрез включване на файла, "класическия способ": всеки запис на отделен ред + разделител, четене по редове и отделяне чрез експлоуд...

Засега мисля всеки раздел да бъде в отделна директория, всяка обява с индивидуален, пореден номер + дата, но дали в отделен файл или по друг начин, не зная...

Тъй като всяка обява ще съдържа няколко сигурни елемента: номер, заглавие и съдържание мисля, че бих могъл да използвам "класическия способ" за съхраняването на обявите от всеки раздел. Проблемът е, че не мога да тъпча файловете до дупка. Имам ограничение от 500кб, така че ще се наложи да използвам повече от един файл... Въпросът е, как да определя кога да преминава към запис в следващ файл, за да не реже обявите посредата) и съответно как да организирам търсене в няколко файла последователно при една заявка...

За да реша този проблем ми хрумват два варианта: единият - във файла, който ще е като БД да се записват номера, датата и заглавието на обявата, а съдържанието на всяка в отделен файл. При листване на списъка с обявите ще се използва файла БД (от него ще се вземат номера датата и заглавието), а подробностите за обявата (при поискване) от файла, в който се съдържа...
Вторият вариант е да записвам в отделен файл обявите, подадени за един ден (едва ли ще има повече от 5-6 обяви на ден за даден раздел, така че да се вместя в лимита), а после да листвам редовете един след друг, четейки файл след файл... Така и управлението ще бъде по-лесно - просто ще трия файловете по-стари от 30 дни напр (т.е. щом станата повече от 30 на брой в директорията), за да освобождавам място, а и по-лесно ще листвам информацията по дати...

Вярвам, че с по-горните въпроси ще се справя някакси (което не означава, че се отказвам от още идеи), но ме притеснява търсенето. Нямам никакъв опит. Помня, че имаше някаква тема тук, така че ще я прегледам отново, но как да го организирам така че да е ефективно и да не затруднява общата организация и съхранение на информацията. И тъй като модела на търсене вероятно ще определи структурата на сайта, разчитам на помощ от вас преди да тръгна да правя големите глупости...

Не зная доколко ясно описах идеята и проблема, затова ще се съсредоточа върху очакванията си за листването и за търсенето:

+ листване на всички налични обяви (със страницирането мисля, че ще се справя)
+ листване на всички налични от даден раздел
+ листване по дата от-до от даден раздел/ от всички налични
+ листване на последните 10 от всички раздели
+ листване на последните 10 от даден раздел

Търсенето да е по ключова дума и вариантите са:

+ търсене по заглавие във всички обяви (с възможност по дата от-до или за съответния ден)
+ търсене по заглавие в даден раздел (---/---)
+ търсене по съдържание във всички налични (---/---)
+ търсене по съдържание в даден раздел (---/---)

Това ми е програмата максимум, така че съм склонен и на компромис. Ако сте разбрали нещо от написаното по-горе, моля кажете какви идеи ви хрумват.

Благодаря предварително!
 
sizif..
Пак с твоите километрични топици. :)
Моля те. Послушай ме. Почни с базите данни.
НЕ си мисли, че аз не съм работил с файлове и затова ти давам такива идей.
Форум съм праввил с файлове. Форум.С ЛС-та и т.н.
Ще помагам с тези бази данни.
Регни си една някъде.
Виж уроците и ги пробвай.

Ако не се откажеш от тези файлове пак ще помогна с каквото мога но
дай за конкретни проблеми да пишеме, че не ми се чете толкова дълъг топик и да го осмислям. :?
 
Здравей, Админ!

Прав си, малко съм се поолял... виждам го сега... Съжалявам :(

Наистина държа да е на файлове.
Причните са както обективни - хоста ще е фрии, което ще рече със скопена БД, а има и сантиментален момент - мислех си този проект да е последния, който ще се състои от файлове и в него да вложа всичко, което съм научил за работата с тях. Взех си индивидуален пакет от Топхост (последвах съвета ти), но дори не съм го пробвал, за да не се разпилявам.
Ако не смяташ това за някаква глупава претенция, ще съм ти благодарен за помощта.

Накратко за идеята: искам да направя стандартен сайт за обяви, в който да има възможност за търсене по ключова дума в обявите като се опрделят и някакви критерии за раздел и период.

Снощи "изпрасках" дизайна, но - съвсем откровено - не съм сигурен как да продължа с кода.

Как мислиш, че би могъл да се структурира сайта и възможно ли е да се създаде без БД? Под "възможно" разбирай без да се използват невероятно сложи операции...

Благодаря ти предварително!
 
ДОбре...
Трябва малко да помисля, защото отдавна не съм работил с файлове за
проект с такъв мащаб.
Мога да се опитам да отговоря на конкретни въпроси.
Според мен най доре е текста на обявите да е в различни файлове.
Примерно обява 1 да е във файла 1.inc примерно.
Останалите данни за обявата да са в един файл на различни редове:

1&обява за работа&sizif
2&обява за продажба&admin

и т.н.

1,2 са ID тата на обявите.
това са индекси (примерно) по които може да се търси и файла в който е текста на обявата.

След това е заглавието и user-a който е пуснал обявата.

Така може лесно да листваш обявите .
За търсенето незнам точно как може да стане лесно.
Тъй като текста ще е в различни файлове ще трябва при търсенето да ги отваряш всичките поотделно с един цикъл и търсиш за съответствие.


Много е кофти наистина и да не говориме, че трябва да не са много обявите.
Ако беше с бази данни нямаше да е проблем и милион да са но с файлове
ще е приказка ако трябва да отваряш 1000 файла и да търсиш в тях.
НЕзнам дали сървъра ще позволи такова ровене .


В момента правя сайт за обяви. :)
Хич не си давам зор, защото е много работа и не искам да се претоварвам.
Сега като се замисля това да го правя с файлове и ми настръхва косата.

Ще помисля малко и ще пиша пак.
 
Ето го моето предложение.... :)
Ще правиме в тази тема сайт за обяви.

Тази вечер ще подготвя няколко файла.
Те ще са много(ама много) прости.
Няколко реда всеки.
След като ми кажеш, че работят и рабираш какво правят аз ще ти дам още няколко реда код.
Ако и те проработят започваме да мислиме какво искаш ти.
Какво ще търсиш, какво ще записваш.
Ще има ли потребителски контрол над обявите.
Ще искаш ли потребителите да могат да пускат обяви и да ги едитват евентуално.
Ще искаш ли да се регват или ще могат да пишат без регистрация.
И т.н.
Няма да стане веднага но мисля, ча за една или най много две седмици
ще имаш един издържан и работеш сайт за обяви със всички екстр.
Търсене по 100 критерия.
Публикуване на обява.
Редактиране на обява.
Всички статистики - най гледана обява, последни обяви, категории и т.н.

Какво ще кажеш?
После няма да ми се налага да обяснявам пак как се прави това или онова.
Просто ще давам линк към темата.
Сигурен съм,ч е на всички ще им е интересно.
Говориме за прост код без функции и класове?
 
Разбира се, че бе функции и класове!!!
Благодаря!
Честно казано това е доста повече, отколкото съм очаквал.
Не мислех да вкарвам автентикация на потребителите и възможност за редактиране, но както се казваше в един стар виц: "от бакшиш и келепир не се умира" :)
Готов съм да участвам активно и ако кодовете наистина са разбираеми вярвам че няма да има проблем да се справя. А иначе, ако темата се разгърне, както предлагаш, наистина би могла да се превръне в пълноценно ръководсто "как да си направим сайт".
 
sizif каза:
А иначе, ако темата се разгърне, както предлагаш, наистина би могла да се превръне в пълноценно ръководсто "как да си направим сайт".

Именно.
 
Та ето каква е задачата.
Влизаш в хоста ти в tophost и отваряш cPanela.
Ще видиш някъде MySQL Databases.
Влизаш вътре и търсиш:
New Database:
Пишеш вътре obqvi ( примерно) и натискаш бутона Create Database.
Отиваш по надолу
Username:
Password:
попълваш и даваш Create User .

После малко по надолу в
Add Users To Your Databases
трябва да селектираш user-a и базата данни (ако не са селектирани)
и да натиснеш бутона "Add user to database" .
Така ще аднеш user-a към базата данни.


Ако си направил всичко както съм описал значи, че имаш създадена база данни с
име obiavi (виж дали cpanela не слага нещо отпред обикновенно слага "user-a ти и
става нещо от сорта на user_obqvi) и към нея си аднал user ( с избрано от тебе име).

След това отиваш най отдолу и намираш линка phpMyAdmin, който води към phpmyadmin-a.

Влизаш в него и селектираш базата данни от падащото меню.


В момента базата данние е празна.
НЯма нито таблици нито записи.
Трябва да създадеш една таблица.
Таблицата си я представи като проста таблица с колони и редове.
Тя всъшност е наистина "проста таблица" (по сложна няма и да видиш).

От падащото меню селектираш базата и някъде трябва да пише
Създай нова таблица или Create table.
Попълваш името на таблицата - в нашия случаи ще я наречем obiavi.
ще те пита и за "Брой полета:" -> пишеш 5 (като за начало).


Натискаш бутона "Изпълнение" и ще те пита за имената на полетата.
Пишеш имената на полетата и селектираш от какъв тип са.
Първото е id и е INT ще е auto_increment -> при всеки нов запис добавя ново поредно
цяло число .Така всички записи ще са с уникално ID .
За ID то отбелязваш, че е primari key .( както е показано на картинката).
Може за колацията на zaglavie и text да отбележиш cp1251_bulgarian_ci, защото явно ще са на български.



test2.jpg

test3.jpg

test4.jpg



След като направиш всичко това пробваме следния код:

файл zapis.php

<?
$dbname="";//попълваш името на базата данни
$dbuser="";//user на базата данни
$dbpass="";;//пас на базата данни

$zag="Продавам Мерцедес";//заглавие на обявата
$tekst="В идеално състояни.Почти нов. Модел 1981 г. С 4 врати. Има и багажник";
//текст на обявата
$potrebitel="пешо";//потребителя който е пуснал обявата
$data=date('d.m.y');//датата на пускане



mysql_connect(localhost,$dbuser,$dbpass);
mysql_select_db($dbname) or die( "Unable to select database");

$query = "INSERT INTO obiavi VALUES ('','$zag','$tekst','$potrebitel','$data')";
mysql_query($query);


mysql_close();
echo "Запис!";
?>


Ако всичко работи може а пробваш следния код за елементарно листване.

<?
$dbname="";//попълваш името на базата данни
$dbuser="";//user на базата данни
$dbpass="";;//пас на базата данни

mysql_connect(localhost,$dbuser,$dbpass);
mysql_select_db($dbname) or die( "Unable to select database");

$query="SELECT * from obiavi";
$result=mysql_query($query);
$num=mysql_num_rows($result);
mysql_close();
$i=0;

while ($i<$num)
{
$id=mysql_result($result,$i,"id");
$potrebitel=mysql_result($result,$i,"user");
$zag=mysql_result($result,$i,"zag");
$text=mysql_result($result,$i,"text");
echo $id.'-'.$potrebitel.'-'.$zag.'-'.$text.'<br/>';
$i=$i+1;
}

?>



От горното няма чак какво да обяснявам освен заявката.
Тя гласи: "Върни ми всички редове от таблицата като двомерен масив".
Поне от масиви разбираш.

Обхождаме масива с един прост цикъл .
Почваме от ред номер 0
и стигаме до ред $max .
Като $max е броя на редовете в таблицата (определихме броя с
mysql_num_rows($result); )
Не знам какво знаеш за многомерните масиви ( в случая 2-мерен)
но това са масиви чиито елементи са също масиви.






Демо:
http://wthost.net/test/zapis.php
http://wthost.net/test/list.php

Ако това направиш останалото е лесно.
Ще се пробваш ли?

Утре вечер ще видя какво си направил и ще ти напиша нови скриптове.
Форммуляр за запис, търсене и update на вече съществуващи записи.
 
Zдравей!

Сега влизам - имах ужасно скапан ден, а трябва да подготвям и цял куп документи, но сутринта ще се опитам да пробвам кода. Благодаря! Обяснил си всичко много подробно. Иска да е само на файлове, но пък и идеята по този начин да навляза в БД н е лоша.
А ще трябва ли да правя някаква настройка на сървъра за РНР? Мисля, че когато разглеждаш хоста имаше някакво обяснение... Всъщнст, ще го погледна...
Като изключим заявките към БД другото ми се струва понятно. Всъщност, изглежда дост алесно.. Ще видя.
Благодаря ти още веднъж!

ПП: а да сложа ли подреждането на заявките в таблицс или засега само да пробвам кода?
 
Значи ще чета кодовете, които пишеш Admin и ще се опитам и аз да направя такова нещо, разбира се ако нямате нещо против!
За сега тези кодове, които си дал горе долу ги разбирам и мисля, че ще успея да се справя, разбира се с твоята помощ ;)
 
Идеята на тези кодове е само една.
да преминеш през проблемите свързани със създаването на бази данни и таблици.
За мен това е супер лесно сега но си спомням, че много трудно
преминах психическата бариера за работа с бази данни а не с файлове.


Просто казвайте какви проблеми изникват при създаването и какви грешки дава(евентуално) кода.
Щом това проработи всичко останало ще е лесно.

Работата с файлове е много по трудна отколко с бази данни.

Ако трябва да дам пример ще кажа следното.
Когато записваш данни в файл ти на всеки ред слагаш някакви данни.
Примерно ако записваш потребители в файл ще изглежда така:

user - pass - mail
-------------------
bobi&65767&bobi@mail.bg
pesho&84756&pesho@mail.bg


i т.н.

Всеки ред е масив а всичките редове също са масив.
Ще трябва да измислиш супер сложен алгоритъм за да може да
работиш с тези данни.
Как ще имаш достъп до всеки елемент от този масив?
Между другото този масив пак е 2 мерен но е голяма мъка работата с него.

Ако искаш да смениш паролата на потребителя pesho как ще стане лесно?

Как ще се докопаш лесно до 2 ред и ще изтриеш паролата и после
да сложиш на нейно място нова?

Базата данни има същата структута но с тази разлика, че и казваш с
един ред заявка "Смени паролата на pesho с 45675" и край.

UPDATE users SET pass = '45675' where user_name='pesho'

или преведено на български:

В таблица users в полето pass запиши 45675 но само ако user-a
се казва pesho .

В случая ако имаше двама pesho щеше и на двамата да смени паролата.

Това е идеята.
да започне от някъде за да види какви са възможностите.
Няма как да ги разбере ако не работи с база данни.
 
Здравейте!

Админ, пробвах кода 1 към 1 (после и с поправки в имената на променливите), листва част от записа, но ми изписва някакво предупреждение:

Warning: mysql_result() [function.mysql-result]: zag not found in MySQL result index 3 in /users/tntmorg/public_html/list.php on line 19
1-0--В идеално състояни.Почти нов. Модел 1981 г. С 4 врати. Има и багажник

Warning: mysql_result() [function.mysql-result]: zag not found in MySQL result index 3 in /users/tntmorg/public_html/list.php on line 19
2-0--В идеално състояни.Почти нов. Модел 1981 г. С 4 врати. Има и багажник

Заредих два пъти zapis.php, вторият път и в двата файла дадох пълното име на променливата заглавие, така както е отбелязана в БД. С първия файл поне очевиден проблем няма - връща "запис!" без предупреждение. Проблемът дойде при листването (втория файл). Сега съм изтощен, но после мисля да се помъча с кода (най-малкото искам да го схвана логически).

Адресът на фйловете:
http://tntm.org/zapis.php
http://tntm.org/list.php

А иначе с РНРМайАдмин поне засега ми се струва, че се работи лесно. Само дето ми кодира кирилицата в асций-код и не мога да прочета съдържанието на таблицата. Има ли начин да променя това? Мисля, че ще ми бдъе полезно като за начало.
Иначе снимките се оказаха полезни.

Това е засега. После ще пиша пак, докъде съм я докарал.

ПП: "or die" - предполагам че се превежда простичко като "или" - специфична конструкция при работата с Бд ли е или има и по-широко приложение?
 
Провери тези редове:
$zag=mysql_result($result,$i,"zag");
$potrebitel=mysql_result($result,$i,"user");

виж дали е написан правилно
виж дали имаш поле с име zag и user в таблицата на базата данни или си объркал нещо
Трябваше при създаването на базата данни да видиш каква ти е колацията.
Трябва да е 1251 .

за да решиш проблема някак си с колацията (запис на БГ в база данни) чети тука:
http://www.web-tourist.net/forum/viewtopic.php?t=1830&highlight=%EA%EE%EB%E0%F6%E8%FF

По принцип обаче този проблем с БГ езика не трябва да го има.
 
значи за грешката .. ами тя е просто дето си объркал думата.
Във кода си написал:
$zag=mysql_result($result,$i,"zag");
а в бд-то си записал zaglavie
просто в кода го промени на :
$zag=mysql_result($result,$i,"zaglavie");
предполагам затова "изплюва" тази грешка.
Иначе за колацията..
ами и аз сега го пробвах .. и на мене така имаше проблем незнам на какво се дължи.Значи имаш 2 варианта..
Преди всяка заявка да слагаш..
mysql_query ("SET NAMES cp1251");
което е малко кофти..
или пробеняш колацията на...
latin1_swedish_ci
мда с тази колация няма проблеми поне при мен.
Иначе идеята много ми хареса...даже имам малко идеики ама по-нататък ще ги кажа. :?:
 
Здравей!

В таблицата ми е "zaglavie", докато в скрипта е "zag". Ти го беше дал така в примера, а и потребител в таблицата е "user". Реших, че в таблицата данните постъпват в последователност и по този начин се разпределят в редовете, т.е. че имената на редовете имат значение само при листването. Все пак после изравних имената на заглавието в таблицата и в двата скрипта, но пак ми изписа предупреждение. Може би нещо съм направил погрешно - ще видя. Снощи бях труп, днес съм свеж - би трябвало да го подкарам.

А иначе за колацията: сигурно си прав за хоста (от преператката), но при листването, информацията си излиза на кирилица съвсем нормално (зададох й енкодинг, какъвто беше казал ти и си работи - ти го беше отбелязал като нещо важно, така че не съм го пропуснал).
Проблема е, когато разглеждам таблицата в БД с РНРМайАдмин. Мислех си, че би било удобно да виждам, какво точно съдържа като текст всяка колона. Питах за някаква настройка на РНРМайАдмин, която мога да направя, за да ми показва символите нормално. В темата, която си посочил, има нещо такова - мнението на NetCutter.

Мисля, че по-важното беше, че донякъде преодолях страха от БД. Сега вече трябва да седна и да прочета уроците за тях. Макар, че настръхвам като си помисля, че 99% от скриптовете, които съм използвал досега отиват в кошчето...

И един друг въпрос, извън БД: имам директория публик файлс - за момента в нея слагам скриптовете, но имам чувството, че мястото им не е там. Ако някой ползва топхост, моля да ми обясни, как си подрежда или разпределя файловете според организацията, която прави хоста. Благодаря предварително!
 
значи за грешката.. погледни ми мението..
Във кода си написал:
$zag=mysql_result($result,$i,"zag");
а в бд-то си записал zaglavie
просто в кода го промени на :
$zag=mysql_result($result,$i,"zaglavie");

за преглеждането на информацията във phpmyadmina мисля , че е щото не е на бг или го правиш ръчно всеки път т.е. да избираш от браузера чарсета или така:
значи когато влезеш би трябвало да ви изкара структурата на базата данни (всички таблици) от ляво избираш Home дето пише и трябва да ти се покаже главния индекс .. където пише Language избираш Bulgarian и след това си разгледай данните би трябвало да няма проблеми с четенето.
за хоста немога да ти помогна.
 
Трябва да виждаш през phpMyadmin-a.
Това е важно.
Ако не виждаш какво си писал в базата данни чрез phpMyadmin
ще имаш големи затруднения.
той за това е този myadmin. За да се работи с него.
Създай нова база данни и виж при създаването каква колация задаваш.
Ако не стане пиши на tophost и те ще ти кажат защо е така и как да го оправиш.
Не може да се работи така с база данни без да може да я разглеждаш спокойно.
 
Нета ми се скапа и се изнервих, но иначе разбрах. Трябва на самия майадмин да задам колация 1251, а също и на MySQL. Видях как може да стане. Ще го пробвам по-късно, а бд-те и таблицата ще направя отначало.
bafitu, мнението ти не го бях видял - изглежда са се разминали с моето...
Благодаря ви и на двамата с Админ че следите темата!
 

Back
Горе