W&PBBS (http://www.wapbbs.com/bbs/index.php)
-   Вопросы программирования (http://www.wapbbs.com/bbs/forumdisplay.php?f=57)
-   -   PHP - include (http://www.wapbbs.com/bbs/showthread.php?t=156342)
-   [короткий адрес страницы] (http://wapbbs.com/p156342&zk)

=SVD= 09-01-2013 23:22

PHP - include
 
Еще один вопрос по PHP, пытаюсь разобраться но не пойму одного момента

работает test.php

Ищу с его помощью и нахожу нужную строку в файле cat.txt, строка соответствует переменной $cat;
PHP код:
 $fopen=@file("temp/cat.txt");
$need=$cat;  
//$main_file .= $cat;
$main_file .= $fopen[$need-1]; 

либо через группировку
PHP код:
 $groups file("temp/cat.txt");
  
$main_file .= ''.$groups[$cat 1].''

и так и так находит четко и выводит содержимое строки, НО
если строка содержит просто текст или текст с тегами html - проблем нет, если попалась строка содержащая вызов другого файла через
<? include "http://domen.ru/file_001.php"; ?>
, то ничего не выводится.

Вопрос: можно ли таким способом заставить исполниться команду include или require? Очень надо, чтобы при попадании на эту строку был вызван вспомогательный файл, т.к. в строку файла cat.txt я не могу запихнуть таблицу (я таблицу вставил во вспомогательный файл).

+ пример cat.txt
Код:
<p align="justify"><img border="0" src="images/000.png" width="140" height="44"><br>Операция провалена. 
<? include "http://domen.ru/file_001.php"; ?>
<br>Кумулятивный эффект ...

UncleByte 10-01-2013 02:18

Для начала погляди на php.su как настраивается php и выясни есть ли у тебя доступ к php.ini - оттуда и начинай копать.

=SVD= 10-01-2013 07:30

Доступ есть, и часть настроек уже внесены. Что вписать для этого случая?

=SVD= 10-01-2013 09:24

Если в конфигурационном файле (php.ini) установить allow_url_fopen=1, то результата нет .

yale 10-01-2013 18:28

Для того, что бы директивы внутри файла (если они представляют собой РНР инструкции) исполнялись, тогда нужен иной подход. В твоем примереты не интерпретируешь содержимое файла, а только его обрабатываешь как простой текст.

Если модифицировать твой пример (любой из них), то получив текстовую стороку, тебе следует ее проверить на предмет наличия инструкции "include", а затем эту инструкцию выполнить, коли нашлась.

см. например, функцию "eval" в справке, она выполняет РНР инструкции, которые содержатся в строке.

=SVD= 10-01-2013 23:20

Спасибо yale за совет.

Прошу подсказки
PHP код:
 print "$groups[$cat - 1]";
$str $groups[$cat 1];
//echo $str;
eval ("\$str = \"$str\";"); 

Ругается:
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting ']'

на
PHP код:
 print "$groups[$cat - 1]"

хотел увидеть выбранную строку, которую передам в eval.

=SVD= 10-01-2013 23:32

Сам разобрался - лишние кавычки
PHP код:
 print $groups[$cat 1]; 

только другой вопрос - ничего не отображается. Почему, кто подскажет?

Уточню: текст и html выходят, строка с include даже текстом не отображается, ни то чтобы исполниться.

=SVD= 11-01-2013 00:01

Решил вопрос с отображением строки, - убрал теги <?php ?> в строке и получил

на echo $str;
Код:
include 'http://domen.ru/file_001.php'

но ничего не произошло по
eval ("\$str = \"$str\";");

:strange:
?

=SVD= 11-01-2013 00:59

PHP код:
 eval ('?>' . @file_get_contents("$str") . '<?'); 

тоже ничего не дает.

allow_url_fopen = 1

yale 11-01-2013 13:14

Я не учел, что eval в твоем случае выполняет функцию include, которая работает с подключаемыми файлами в формате РНР, а текст она игнорирует.
PHP код:
<?php 
$file 
'wap.txt'
$search 'a';  
if (!
is_readable($file)) exit('Error: File "'.$file.'" not found or cannot read it.'); 
$result strParser($file$search); 
var_dump($result);  
function 
strParser($file$search) { 
    
$regexp '@^[^"]+"([^"]+)";.*@i'
    
$strings file($file); 
    
$result = array(); 
    foreach (
$strings as $key => $val) { 
        
$url false
        if (
strpos($val'include')) { 
             if (
preg_match($regexp$val$url)) { 
                
//if include "LINK" was found 
                
$strNum null
                
$value null
                list(
$strNum$value) = strParser($url[1]); 
                
$result[$file][$strNum] = $value
            } 
        }else{ 
            
//just text search 
            
if (strpos($val$search)!==false$result[$file][$key] = htmlspecialchars($val); 

        } 
    } 
    return 
$result
?>

=SVD= 11-01-2013 22:58

Решил вопрос с include

строка содержит
Код:
include ("./cat_001.php");

при этом
PHP код:
 $main_file .= '<? <p align="center">'.$need.'</p>'
результат в виде текста

при этом
PHP код:
 $main_file .= '<? <p align="center">'.eval($need).'</p>'
результат исполняет include. Что и требовалось.

Но появилась новая проблема место где появляется результат определен $main_file .

так вот если текст или html, то все на месте, а если "инклюдится", то появляется первым блоком (лев. верхний угол) впереди всех данных, т.е. вышла за пределы форматирования.
Проверил, если руками вписать код (include), то все на своих местах, если выполнено через eval, то вставка идет первой.

Как быть?

yale 11-01-2013 23:12

сложно что-то сказать, не видя кода.
а чем мой скрипт плох? решает поставленную задачу

=SVD= 12-01-2013 00:05

Нет, стал ругаться при парсере, т.к. в txt файле еще куча кода, поэтому не стал углубляться. Решил добить eval на прямую и получилось.

Но тебе, огромное спасибо за совет.

Bold
Italic
Rate
Code
Spoiler

Преобразовывать интернет адреса в ссылки

Часовой пояс GMT +4, серверное время: 03:56.

powered by vbulletin engine