Четене от текстова база данни с PHP !
Автор |
|
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 да се номерират отпред, като тази номерация да зависи от броят на редовете в текстовият файл, тоест по броят на редовете да се определя колко човека са се записали, и така да се показва номерацията! Благодаря много предварително! | | 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 с една единица, но къде точно? Този сценарий го има във всяка една база данни в тази система, така че не трябва да има притеснения за това дали ще има нов реди или ще няма, и съответно проверки, които са свързани с това са безсмислени! | | 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
(сега показалецът е тук) |
| | 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); |
| | Коментар |