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

Четене от текстова база данни с PHP !

< 1 2 >

Автор
Съобщение
programings
Вто, 17.07.12, 22:13
От няколко часа се мъча със следният казус :

Имам система, която използва метода за работа с текстова база данни, описан тук!

Системата представлява система за петици! Имам страница, която трябва за извежда само имената на всички разписали се, заедно с номериране преди тях!

Например :
1. Иван Петров
2. Петър Иванов
3. Иван Иванов

Текстовата ми база данни е следната например :
54545|@|3434@32323.com|@|127.0.0.1
54545|@|3434@32323.com|@|127.0.0.1
54545|@|3434@32323.com|@|127.0.0.1
54545|@|3434@32323.com|@|127.0.0.1

Първото би трябвало да е името, второто да е емайла, а третото е айпито на този, подписал петицията!

Така, до тук добре!

Опитвам се да изведа имената на всички подписали се в страницата по следният начин :
$id = $_GET['id'];
 
$lines2 = file("signers/$id.txt");
$lines2 = array_reverse($lines2);
 
foreach ($lines2 as $sigs){
list ($name, $email, $ip) = preg_split ("/|@|/", $sigs);
 
echo $name;
 
}

Към страницата се подава id - то на петицията, и от текстовите бази данни, които се намират на едно място в папката signers, то се избира съответният файл според id - то, който файл съдържа съответните данни за всички разписали се!

Как мога да направя така, че в съответната страница да се извеждат имената на всички разписали се хора, и съответно например с някакъв цикъл for да се номерират отпред, като тази номерация да зависи от броят на редовете в текстовият файл, тоест по броят на редовете да се определя колко човека са се записали, и така да се показва номерацията!

Благодаря много предварително!

редактиран от programings на 17.07.12 22:13
anonymous
Вто, 17.07.12, 23:01
Ще трябва да си замениш пътя на файла с твоя.

И така имаме файл, в който е записано примерно:
Първо Име|@|edna@some.com|@|127.0.0.1
Втори Човек|@|wtora@some.com|@|127.0.0.1
Трето лице|@|treta@some.com|@|127.0.0.1
Име Фамилия|@|oshte@some.com|@|127.0.0.1

И php кода ни:
<?php
$file = file("test.txt");
$file_ = array_reverse($file);
$number = 0;
 
for ($i = count($file_) - 1; $i > -1; $i--) {
	$number++;
	$arr= explode("|@|", $file_[$i]);	
	
	echo $number . '. ' . $arr[0] . ' ' . $arr[1] . ' ' . $arr[2] . '<br />';
}
?>

И резултата от изпълнението:
1. Първо Име edna@some.com 127.0.0.1 
2. Втори Човек wtora@some.com 127.0.0.1 
3. Трето лице treta@some.com 127.0.0.1 
4. Име Фамилия oshte@some.com 127.0.0.1

Остава само да си го оформиш с по- подходящ дизайн :)

Редакция:
Това работи, но може да ти създаде непредвидими ядове. Те могат да дойдат от леко странното държание на file() с по- големи файлове, както и различното му поведение под различните операционни системи.
За да е сигурно на 100% че няма да имаш грижи бих препоръчал да използваш следния код:
<?php
$file = fopen ("test.txt", "r"); 
$number = 0;
 
while (!feof ($file)) {
	$file_ = fgets($file, 4096); 
	$number++;
	$arr= explode("|@|", $file_);	
	
	echo $number . '. ' . $arr[0] . ' ' . $arr[1] . ' ' . $arr[2] . '<br />';
} 
 
fclose ($file); 
?>

редактиран от anonymous на 17.07.12 23:21
programings
Сря, 18.07.12, 10:17
Мерси много!

Така вече наистина работи гладко!

Само един проблем :

Тъй като използвам аргументи за минаване на нов ред при писане във файла, то при всяко писане в текстовата база данни остава по един празен ред в текстовият файл, и така алгоритъмът за номериране на редовете се бърка, като пуска още един празен номер!

Какво може да се направи по този въпрос?

Аз си помислих да декрементирам променливата $number с една единица, но къде точно?

Този сценарий го има във всяка една база данни в тази система, така че не трябва да има притеснения за това дали ще има нов реди или ще няма, и съответно проверки, които са свързани с това са безсмислени!

редактиран от programings на 18.07.12 10:18
anonymous
Сря, 18.07.12, 10:41
Слагай по едно # на всеки празен ред и после прескачаш всички #, но имай впредвид да изчистиш входните данни от #(още на ниво заявка..)
anonymous
Сря, 18.07.12, 11:38

RE: Четене от текстова база данни с PHP !

” Мерси много!

Така вече наистина работи гладко!

Само един проблем :

Тъй като използвам аргументи за минаване на нов ред при писане във файла, то при всяко писане в текстовата база данни остава по един празен ред в текстовият файл, и така алгоритъмът за номериране на редовете се бърка, като пуска още един празен номер!

Какво може да се направи по този въпрос?

Аз си помислих да декрементирам променливата $number с една единица, но къде точно?

Този сценарий го има във всяка една база данни в тази система, така че не трябва да има притеснения за това дали ще има нов реди или ще няма, и съответно проверки, които са свързани с това са безсмислени!

В случай, че съм разбрал правилно, то примерно файла би изглеждал така:
Иван Иванов|@|ivanow_iwan@domain.com|@|127.0.0.1
 
Петър Иванов|@|petyr@some.com|@|192.168.0.111
 
Иван Петров|@|iwan@eny.com|@|10.101.10.11
 
Петър Петров|@|p_petrow@anywhere.com|@|172.10.15.23

За да избегнем номерирането на всеки празен ред ще използваме променливата $number. В нея ще се съдържа

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

деление на две(2). Ако няма остатък, т.е. сме на празен ред, с командата continue ще започнем цикъла отново

за да извлечем следващия ред или да видим, че сме в края на файла. Но има ли остатък(значи сме на ред с данни) ще

увеличим с единица новата ни променлива $show, която ще ни служи за извеждане поредния номер на

действителния ред с данни(на човека в случая).
<?php
$file = fopen ("test.txt", "r"); 
$number = $show = 0;
 
while (!feof ($file)) {
	$file_ = fgets($file, 4096); 
	$number++;
	
	if (!($number % 2)) continue;
	
	
	$arr= explode("|@|", $file_);	
	$show++;
	
	echo $show . '. ' . $arr[0] . ' ' . $arr[1] . ' ' . $arr[2] . '<br />';
} 
 
fclose ($file);
?>

И резултата:
1. Иван Иванов ivanow_iwan@domain.com 127.0.0.1 
2. Петър Иванов petyr@some.com 192.168.0.111 
3. Иван Петров iwan@eny.com 10.101.10.11 
4. Петър Петров p_petrow@anywhere.com 172.10.15.23

programings
Сря, 18.07.12, 14:48
Там е работата, че редът ми не е четен!

Просто всеки път когато се пише в базата данни, то pointer - а се слага в началото на нов ред, без да се създава празен ред!

Примерно :
Ангел Ангелов|@|3434@32323.com|@|127.0.0.1
Петър Петров|@|3464@32323.com|@|127.0.0.1
Иван Иванов|@|3454@32323.com|@|127.0.0.1
Пенчо Пенчев|@|1231@32323.com|@|127.0.0.1
(сега показалецът е тук)

редактиран от programings на 18.07.12 14:48
anonymous
Сря, 18.07.12, 15:07

RE: Четене от текстова база данни с PHP !

” Там е работата, че редът ми не е четен!

Просто всеки път когато се пише в базата данни, то pointer - а се слага в началото на нов ред, без да се създава празен ред!

Примерно :
Ангел Ангелов|@|3434@32323.com|@|127.0.0.1
Петър Петров|@|3464@32323.com|@|127.0.0.1
Иван Иванов|@|3454@32323.com|@|127.0.0.1
Пенчо Пенчев|@|1231@32323.com|@|127.0.0.1
(сега показалецът е тук)

Използваш
fseek($file, 0, SEEK_SET)

преди нацалото на цикъла.

programings
Сря, 18.07.12, 15:15
Дава грешка :
Parse error: syntax error, unexpected T_WHILE in C:serverhtdocsview.php on line 79

anonymous
Сря, 18.07.12, 15:22

RE: Четене от текстова база данни с PHP !

” Дава грешка :
Parse error: syntax error, unexpected T_WHILE in C:serverhtdocsview.php on line 79

точка и запетая накрая ;
Не само копи и пасте :)
anonymous
Сря, 18.07.12, 15:51

RE: Четене от текстова база данни с PHP !

Оправих го, но пак изкарва една празна номерация! „

Добре. Нека да преработим програмата, хем да е по- прегледна:
$file = fopen ("test.txt", "r"); 
$number = 0;
 
fseek($file, 0, SEEK_SET);
 
while (!feof ($file)) {
    $file_ = fgets($file, 4096); 
    $arr= explode("|@|", $file_);
 
    if (isset($arr[1][5])) {
         $number++;
         echo $number . '. ' . $arr[0] . ' ' . $arr[1] . ' ' . $arr[2] . '<br />';
    }
} 
 
fclose ($file);

< 1 2 >

Коментар

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