1 переменная, два файла, помогите с php

ufaclub

Полезный
Регистрация
1 Май 2007
Сообщения
395
Реакции
19
скрипт будет стоять на каждой странице кучи
сайтов, цель выводить ссылку из файла , в зависимости от урл страницы

логика :


1. Определяем урл текущей страницы , вроде через ($ _ S E R V E R [ ' R E Q U E S T _ U R I ' ]), затем записываем его в файл url.txt


1.1 доп условия , записывать каждый урл в новую строчку , и перед записью проверять, есть ли в файле уже этот урл , если есть но не записывать его.

2. Работа скрипта.


2.1 Определяем урл странички , и смотрим какой строчкой идет этот урл в файле url.txt, допустим 2й строчкой, то берем и выводим 2 строчку из файла a.txt вот собственно и все, кто может помогите состряпать скрипт)
 
Алгоритм таков:

PHP:
<?php

$thispage = $_SERVER['REQUEST_URI'];
$page_hash = md5($thispage);

$lines = file('a.txt',FILE_SKIP_EMPTY_LINES);
$urls = file('url.txt',FILE_SKIP_EMPTY_LINES);

$key = array_search($page_hash, $urls, true); // $key = 1;

if (!$key){
	$w=fopen('url.txt','a-'); // открываем только для записи, курсор устанавливаем в конец файла
	fwrite($w,$page_hash); // записываем хэш новой страницы в конец файла
	fclose($w);
	$new_urls = file('url.txt',FILE_SKIP_EMPTY_LINES); // заново читаем файл в массив
	$key = count($new_urls)-1; // считаем количество элементов в массиве и отнимаем 1, т.к. ключи элементов начинаются с 0
}
echo $lines[$key];


?>
 
хм

хм чего то не записывает ...

я закинул эти два тхт файла туда же где лежит индекс php
все правильно ли сделал?

хм такс.. стоп.. на денвере работает счас разберусь... спасибо большое за помощ....
 
Чтобы записывало, права на файл url.txt выставьте 777 (иногда 770 достаточно - зависит от настроек сервера). Под виндой в денвере работает потому что винда не учитывает права на файлы.

PS: для "спасибо" есть кнопка ;)
 
Чтобы записывало, права на файл url.txt выставьте 777 (иногда 770 достаточно - зависит от настроек сервера). Под виндой в денвере работает потому что винда не учитывает права на файлы.
PS: для "спасибо" есть кнопка ;)


хм если запускать просто как файл - то работает

а если код скопировать в index.php любого шаблона Joomla 1.5 то неработает ( почему?


Warning: file(a.txt) [function.file]: failed to open stream: No such file or directory in /var/www/site/data/www/soite.ru/wp-content/themes/ad-clerum-10/footer.php on line 34


---------- Post added at 18:03 ---------- Previous post was at 16:58 ----------

проблема в том что он хеш в 1 строчку пишет(

Добавлено через 37 минут
PHP:
fwrite($w,$page_hash."\r\n");

теперь пишит через строчку -все как и должно быть.

но он неучитывает что кеш этой страницы уже есть( и создает такой же и выводит новую строчку

как сделать чтоб он учитывал что есть такой уже кеш и не создавал новую запись а всеголиш выводил строчку соттсветсвуюшию номера строчки кеша?
 
хм если запускать просто как файл - то работает
а если код скопировать в index.php любого шаблона Joomla 1.5 то неработает ( почему?

Используй тогда полный путь а не относительный:

Там где 'a.txt' пропиши
PHP:
$_SERVER['DOCUMENT_ROOT'].'/a.txt'
(может быть надо без слеша - не помню точно, от системы зависит)
И также с url.txt сделай

Если не учитывает уже имеющуюся строчку, попробуй так:

PHP:
$key = array_search($page_hash."\r\n", $urls, true);
 
PHP:
<?php

$thispage = $_SERVER['REQUEST_URI'];
$page_hash = md5($thispage);

$lines = file('a.txt',FILE_SKIP_EMPTY_LINES);
$urls = file('url.txt',FILE_SKIP_EMPTY_LINES);

$key = array_search($page_hash."\r\n", $urls, true);  
if (!$key){
    $w=fopen('url.txt','a-'); // открываем только для записи, курсор устанавливаем в конец файла
    fwrite($w,$page_hash."\r\n");   // записываем хэш новой страницы в конец файла
    fclose($w);
    $new_urls = file('url.txt',FILE_SKIP_EMPTY_LINES); // заново читаем файл в массив
    $key = count($new_urls)-1; // считаем количество элементов в массиве и отнимаем 1, т.к. ключи элементов начинаются с 0
}
echo $lines[$key];


?>

почти работает! но....почему то первую строчку дублирует... тоесть проверка с нее не идет (

пример:

6666cd76f96956469e7be39d750cc7d9
aed0c99b3ab80f1e8df3af59cf0ae53a
6007c2c2e02715cac9d8a365152bac27
05cc7ef32005e67e8959bb4c3cd05702
1befd44810d7b9bdfc2e1a599a18c307
1c927383117a61d367f08b1f74d6acf1
3752b73d65ed8a554fe8a8d98f62fa38
26a93b8987e1c3f1a204adfaf8eb1675
6666cd76f96956469e7be39d750cc7d9
6666cd76f96956469e7be39d750cc7d9
6666cd76f96956469e7be39d750cc7d9
6666cd76f96956469e7be39d750cc7d9
6666cd76f96956469e7be39d750cc7d9

остальные - работают как надо...

в вот если сделать 1 пробел и сделать вид url.txt
такого вида то все нормально работает и дубли не пишуться %)

так че за фигня с первой строкой?

1
2 6666cd76f96956469e7be39d750cc7d9
3 aed0c99b3ab80f1e8df3af59cf0ae53a
 
Ну единственное что приходит в голову:
1) почисть файл url.txt
2) замени везде по скрипту \r\n на \n

В Unix-системах символ переноса строки - \n (Это в винде ещё надо использовать символ переноса каретки \r) — возможно из-за того что у тебя первая строка имеет другой символ переноса, она не находится потом.

А ещё лучше и вернее - возми открой url.txt в каком-нибудь редакторе, который показывает управляющие символы - чтобы видеть, может быть в самом самом начале строки есть какой-то спец-символ, и из-за этого первая строка не котируется. (тоесть к примеру самая первая строка на самом деле может иметь вид "\n6666cd76f96956469e7be39d750cc7d9" а не "6666cd76f96956469e7be39d750cc7d9" - и потому мы её не можем определить)
 
$key равен нулю, если хэш в первой строке найден, потому условие
PHP:
if (!$key)
выполняется.
Правильно будет
PHP:
if ($key===false)

Добавлено через 3 минуты
Собственно,

This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE, such as 0 or "". Please read the section on Booleans for more information. Use the === operator for testing the return value of this function.
 
Назад
Сверху