PHP: Помощ за php скрипт

Smirnoff

Registered
Здравейте мушмурочета.
Значи неска като бях на даскало, се чудех дали ето на това ТУК , където е линка за даунлоуд дали след добавянето на всеки линк ще може да се добавя и още една графичка в която ще пише Delete, и ще служи за изтриването на съответното име и линк
(ако е нещо объркан)
. За съхраняването на информация използвам прости файлове.

Мерси мн мн предварително! :?: :?:
 
НЯма да е много лесно да се направи "delete".

И кой ще има право да го трие?
Всеки ли?

Ако това се направи с база данни ще е 100 пъти по лесно да направиш какво и да е.
Проблема с триенето идва и от това, да не може всеки да трие.
 
Мии съгласен съм с база данни, обаче трябва да го пиша на ново и при това с нулеви знания :oops: .
А за триенето аз питам как да стане после сигурно ще мислим кой да може, :?:
 
Smirnoff каза:
Мии съгласен съм с база данни, обаче трябва да го пиша на ново и при това с нулеви знания :oops: .
А за триенето аз питам как да стане после сигурно ще мислим кой да може, :?:

НЕ съм сигурен кой ще е удобния метод за триене на ред в текстов файл.
Не съм го правил.

Може да стане така:

Четеш файла и го разделяш на редове като всеки ред е елемент от масив.
Махаш от масива еди кой си елемент и след това записваш останалите пак във файла на различен ред.

С две думи - > файла ще се запише пак но с един ред по малко.

Това е моята идея.
Може да има по добър.

:?
 
Smirnoff каза:
Аз мислех, че може да стане с $line или нещо подобно :?

$line е някакво име на променлива.
Можеше да е $lain и пак ще върши същата работа.
Скрипта който ползваш в момента е за извличане на данни от файла.
Разделяш файла на редове и после всеки ред го обработваш пак
като масив.

Това върши работа когато искаш да четеш от файла но
триене на точно определен ред няма да свърши работа.
 
Ехх.. дае*а колко съм тЪп.
Мислех си, че има такава функция.

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

<a href='$funkciqta'>delete</a>


$funkciqta - с това да записвам на кой ред слагам името и линка на програмата като ги добавям от сайта.

и да стане така като кликам делетето, което е записано в друг файл, да трие реда с който е определена $funkciqta във файла в който записвам името и линка за програмата.
 
Здравей!

Админ е прав. Проблемът не е в невъзможността да изтриеш СЪДЪРЖАНИЕТО на даден ред (дали ще го определиш чрез друг запис или ще обхождаш масива няма значение). Проблемът е в изтриването на САМИЯ РЕД, а това при алгоритъма който предполагам, че използваш, за да листваш файла (като този тук или същия: http://web-tourist.net/login/login/view.php?st=304) вече е нещо различно. Защото дори реда да няма съдържание, той продължава да стои и функцията file(); която чете ред по ред, ще го върне като елемент в масива, макар този елемент да не съдържа низ.

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

Хрумва ми екзотичната идея да се проверява размера на всеки ред, върнат от file(); преди отделянето с explode(); и ако е празен - примерно по-малко от 1 бт или по-малко от 3 символа, да се прескача при листване. Това обаче е частично решение - реда съществува и в даден момент може да се окаже, че имаш повече празни редове във файла/празни елементи в масива, отколкото такива, които да листваш.

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

За мен не е проблем да напиша код, който да премахва реда чрез презапис (даже се изкушавам да започна сега), но преди това реши с БД ли ще го правиш или оставаш на файлове. Ако продължаваш с файлове, ще се заема с удоволствие.
 
Мии.. ако е с БД .. май ще трябва някой друг да пише скрипта защото както казах хал хабер си нямам от MySQL (не че от php много разбирам), и аз знам че с БД ще е по лесно и с по голяма гаранция на качеството, но се чудех дали не може да се напиши някакво скриптче което да ми отваря файла и аз да го редактирам през браузъра. Хич ако неможе да се добавя такова бутонче "delete" :?
 
Готово!

Ето ти и кода на формата, която да използваш за редкатиране.
Скрипта е съвсем опростен, няма листване, само четене на файла, извеждане в <textarea> на съдържанието му като запазваме параграфите, след това преработения низ се изпраща към втори скрипт за презапис.

forma.php

<?
$filename="/home/www/probna.com/demo4/tekstovi.txt";
$fp = fopen($filename, "r");
$text = fread($fp,filesize($filename));
fclose($fp);
echo <<< GAN
<FORM NAME="" METHOD="POST" ACTION="edit.php">
<TEXTAREA ROWS="5" COLS="60" NAME="text" WRAP="virtual">$text</TEXTAREA>
<INPUT TYPE="submit" NAME="" VALUE="Редактирай!">
GAN;
?>


edit.php

<?
$filelocation="/home/www/probna.com/demo4/tekstovi.txt";
$newfile = fopen($filelocation,"w+");
fwrite($newfile, "$text");
fclose($newfile);
echo "Запис!";
?>
<BR><A HREF="http://probna.com/demo4/forma.php">Редактирай отново!</A>


В зелено е името на файла. Имената на приоменливите - в синьо , с които указваме пътя до него независимо дали четем или пишем е произволно(забелязвам, че променливите са с различни имена в двата файла, но първия скрипт го писах, втория го копирах) - можеш да ги смениш.
особеното във формата е тага WRAP="virtual" и неговата стойност. Той указва, че параграфите във формата ще се пренасят. Целта е да запазим новия ред.

Когато правиш промени във файла си, не забравяй да изтриеш не само съдържанието на реда, но и самия ред.
Ако имаш въпроси, питай. Успех!

Ето ти и демо: http://probna.awardspace.com/demo4/forma.php
 
Здравей!

Подготвих и код с "бутончета", в този случай най-обикновени текстовеи връзки, но предполагам, че можеш да ги смениш с изображения-бутони :)

Демо: http://probna.awardspace.com/demo4/list.php

А ето и кода (вързал съм го с по-горния):

list.php

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
</HEAD>
<BODY>

<BR><B>Редове:</B>
<BR>
<?
if (file_exists ("tekstovi.txt")) {

$filelocation="/home/www/probna.com/demo4/tekstovi.txt";
$fm=file("$filelocation");

$kolko=count($fm);

for ($i=0; $i<$kolko; $i++){
$red=$fm[$i];
echo "<BR>$red .............. <A HREF='del.php?id=$i'>Изтриване!</A>";
}
}
else {
echo "<BR>Няма направени записи!";
}
?>
<BR><BR><A HREF="forma.php"><B>Редактирай през формата!</B></A>
</BODY>
</HTML>



и следващия, който "трие" реда и презаписва останалото съдържание:

del.php

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
<META HTTP-EQUIV="refresh" CONTENT="5;URL=http://probna.awardspace.com/demo4/list.php" >
</HEAD>
<BODY>

<?
$id=$HTTP_GET_VARS['id'];

$filelocation="/home/www/probna.com/demo4/tekstovi.txt";
$fm=file("$filelocation");

$kolko=count($fm);

$newfile = fopen($filelocation,"w+");
fclose($newfile);

for ($i=0; $i<$kolko; $i++){
if ($i==$id) continue;
$red=$fm[$i];
$newfile = fopen($filelocation,"a+");
fwrite($newfile, "$red");
fclose($newfile);
}

echo "Редът е изтрит успешно!";
?>

</BODY>
</HTML>


Обяснението на кода (в досадни подробности) - ако просто ви трябва кода и ви е достатъчно че той върши работата - копирайте го и прескочете това:
В list.php четем текстовия файл с функцията file(); . Особеното при нея е, че връща масив, в който всеки елемент е ред от файла. С цикъл фор обхождаме масива и листваме всеки от неговите елементи като изписваме и връзка (анчър) към del.php. Използваме и URL-кодиране във връзката, за да предадем една много важна информация към изтриващия скрипт, а именно поредния номер на елемента, в който се намира реда:
<A HREF='del.php?id=$i'>
Чрез кодирането създаваме променливата $id, на която присвояваме стойността, която има $i при съответната итерация (завъртане) на цикъла. Точно тази стойност е номера на елемента в масива, в който се съдържа реда.
Вече имаме всеки ред от файла с връзка за изтриване и указание към изтриващия скрипт.

В del.php отново прилагаме функцията file(); за да получим същия масив с елементи-редовете от файла. Този път обаче няма да го използваме за листване, а за изтриване, като ще отразим тази промяна и в съдържанието на текстовия файл.

Преди да правим каквото и да е с информацията в масива обаче, се налага да подготвим файла.
Вече сме извлекли неговото съдържание. Имаме го на "сигурно" място в масива. Файлът не ни е нужен. Можем да го изтрием или по-добре да изтрием съдържанието му. За тази цел използваме една от готовите функции за работа с файлове, тази, която отваря файла за запис:
fopen($filelocation,"w+");
Задаваме стойност на функцията w+. При отварянето на файла тя автоматично изтрива цялото му съдържание. Обикновено в синтаксиса й влиза и функцията за запис fwrite();, но в случая тя не ни е нужна, защото искаме само да се освободим от съдържанието.

Файлът е празен, готов за запис. Вече можем да обработваме елементите на масива. Обхождаме го - цикълът е подобен на този в list.php Подобен, но с една малка особеност: въвели сме допълнително условие:
if ($i==$id) continue;
То указва на скрипта да прескочи един елемент от масива. Този елемент не е произволен, а е точно онзи, който искаме да премахнем и сме задали чрез предадената с URL-кодирането стойност.
Цикъла обхожда масива, чете първия му елемент, проверява номера му за съвпадение с условието, после преминава към следващия и т.н.
Елементите, които преминават през "ситото" (всички без един) постъпват за запис в текстовия файл. Отваряме го отново, този път в тялото на фор-цикъла и задаваме стойност на функцията fopen(); а+. Тя подрежда всеки нов запис на последно място във файла.
Така, когато преминат всички елементи ще имаме огледално отражение на първоначалното съдържание на файла. В него обаче ще липсва нещо - реда, който сме пропуснали да запишем.

Толкова от мен. Дано съм бил полезен. За възражения - форума :)
Успех!

ПП: Добавен ред към дел.пхп: $id=$HTTP_GET_VARS['id'];
И Съвет към всички, които неблагоразумно отказват да ползват Post i Get регистрите, които поддържа РНР - НЕ ГИ ПРЕНЕБРЕГВАЙТЕ, вържете си гащите, защото на мен това ми струваше много нерви :)
 
Получава се някаква грешка, трие ама не каквото трябва :shock:
я погледни тоя линк : http://smirnoff.voxbg.com/programs/
Виж всичко работи обаче това не иска да трие реда който трябва :?
иначе,

Благодаря ти много за отделеното време, нерви и скриптове !!! :?:
 
Имаш някаква грешка, при теб наистина дава проблем. Празните редове не би трябвало да объркват работата, но и без тях разминаването остава. А няма как да има разминаване ако използваш кода, който съм дал, защото там редовете са вързани с номерацията си.
Пробвай отново демото, отбелязвай с някакво име във формата реда, който ще изтриеш напр:
1
2
3
ред
4
5
и ще видиш, че работи...

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

Още веднъж, пробвай демото!

ПП: направи си страницата привейт (т.е. никой освен теб да няма достъп до файла) и тогава я пробвай, защото оставам с впечатлението, че някой прави промени докато аз също човъркам файла...
 
Здравей!

Пусни ми кода, който използваш. Ще го погледна още сега.
 
Само онези, които манипулират файла, в който правиш записа. Тези от моя код и други, ако и те правят някакви записи или пренареждания във файла.

ПП: Пусни ми ги едно към едно както са ти на хоста.
 
Виж първо етва ми засече, неще да записва :x

<?php
$ime=$HTTP_POST_VARS['ime'];
$fam=$HTTP_POST_VARS['fam'];
$ip=$_SERVER['REMOTE_ADDR'];

$zapis = $ime.'&<a href="http://'.$link.'">DownloaD</a>&'.$ip.'<a href="http://'.$ip.'">»</a>'."\n";
# '<a href=http://$ip>»</a>'
$fp = fopen ("db.inc" ,"a");
fwrite($fp, $zapis );
fclose($fp);

echo "<span class='style2'>Вие добавихте:</span>
<br>
<span class='style2'>Име :</span> <a class='style2' href='http://$fam'>$ime</a><br>
<span class='style2'>Линк :</span> <a class='style2' href='http://$fam'>$fam</a><br>
<span class='style2'>IP :</span> <a class='style2' href='http://$ip'>$ip</a><br>
<br>
<a class='style2' href='index.php'>Всички записи</a> <span class='style2'>|</span> <a class='style2' href=forma.php>Редактирай Данните</a>
";
?>
 

Горе