текст в php код

peter_nsk

Новичок
текст в php код

Подскажите пожалуйста, как мне например строку Hello <?php $name?> обработать через пхп перед выводом на экран??
Ситуация следующая, читаю из БД шаблон в котором есть вставки из php, как их обработать, типа как работа с файлом с помощью include();
 

WP

^_^
1. Хранить шаблон в БД скорее всего не надо.
2. Если и надо, то используй компилирующий шаблонизатор, который сохраняет скомпилированный шаблон на диске.
 

peter_nsk

Новичок
Так в том то и дело что скомпилированный вариант мне надо хранить в БД, если точнее, то что смарти хранит в templates_c я храню в БД..
 

Grezz

Новичок
сохраняем в файл и инклюдим его.

что бы не выводить шаблоны из БД в файл при каждом обновлении страницы, в БД дописываем дату последнего обновления шаблона которую сравниваем сдатой создания инклюдного файла, ну и соответственно если шаблон старше - просто инклюдим его, если шаблон "моложе" - выводим в файл и инклюдим.

можно и проще сделать - файлы с шаблонами складываем в отдельную папочку а в БД оставляем только имена файлов
 

peter_nsk

Новичок
Вся проблема что я не могу писать локальные файлы, такие настройки сервера, точнее политика.. есть ли какой-нибудь способ их отрабатывать из БД?
 

maxru

МИФИст
Может я буду неправ, но скажу eval(). Хотя я сам не стал бы использовать подобные "фичи", у которых один плюс, а все остальное - минусы.
Что это за хостер такой, что не дает писать в файлы? =)
 

peter_nsk

Новичок
eval тоже не подходит, т.к. возвращаться будет типа:
<?php /* Smarty version 2.6.18, created on 2007-06-04 15:18:07
compiled from test.tpl */ ?>
hello <?php echo $this->_tpl_vars['name']; ?>
!!!
А дела не в хостере, просто работа идет на кластере, соответственно файлы дублируются на нескольких webnode и при добавлении файлов их придется еще и синхранизовать, что тоже плохо..
Есть еще идеи??
 

maxru

МИФИст
Написать свой некомпилирующий интерпретатор и заставить сервер сдохнуть от перегрузки )

-~{}~ 04.06.07 12:39:

SiMM, а stream_wrapper же не даст перегрузить include\require, а тогда какой смысл "читать" "файл" из базы?
 

SiMM

Новичок
> stream_wrapper же не даст перегрузить include\require
А откуда Вы сделали столь далекоидущие выводы? Вычитали это в документации (где ссылка)? Убедились на личном опыте (где пример)? Ткнули пальцем в небо?
Хотя, исходя из предложенного Вами "решения" ответ очевиден.
 

maxru

МИФИст
Читал материалы по Вашей ссылке.
Я вижу, что можно перегрузить файловые операции и операции с каталогами. Перегрузки include() я не увидел. Да и как Вы это себе представляете?

Я нисколько не сомневаюсь, что Вы намного лучше меня, да и большинства форумчан разбираетесь в тонкостях программирования на PHP, однако если Вы объясните, как можно перегрузить include, я буду очень благодарен.

З.Ы. Моё "решение" было подколкой.

-~{}~ 04.06.07 20:04:

SiMM, Вы были правы.
Но я что-то видимо недопонял.
PHP:
class DbStream
{
    function stream_open($path, $mode, $options, &$opened_path)
    {
        mysql_connect('127.0.0.1','root','')))
        $name = parse_url($path);
        mysql_select_db($name['host'],$this->dbid);
        mysql_query("SET NAMES 'cp1251'");
        return true;	
    }
	
    function stream_read($count) 
    {
        $query = "SELECT `code` FROM `fake` WHERE `id`='1' LIMIT 1";
        $res = mysql_query($query);
        if($res)
        {
        	$row = mysql_fetch_array($res);
        	echo $row[0];//2
        	return $row[0];//3
        }else{
        	return 'Sh*t!'.mysql_error();
        }
    }
    
    function stream_write($data) 
    {
        return true;
    }

    function stream_tell() 
    {
        return 0;
    }

    function stream_eof() 
    {
        return true;
    }

    function stream_seek($offset, $whence) 
    {
        return true;
    }

}

if(stream_wrapper_register("mys","DbStream"))
{
    echo 'WRAPPER REGISTERED<br>';
}else{
    die('ERR!');
}
if(!($fp = fopen('mys://fake',"r")))
{
    echo 'Cannot open connection';
}
$phpcode = fgets($fp);//1
echo $phpcode;//4
Так вот. В записи базы у меня находится текст следующего вида:
PHP:
<?php
echo "Database record #1";
?>
Просто текст
<?php
class MyClass
{
    function __constructor()
    {
        echo "MyClass constructed";
    }
    function print()
    {
        echo "А ты как думал?";
    }
}
$my = new MyClass();
?>
Значит так:
1) Вызываем функцию чтения в метке 1.
2) В метке 2 идет вывод содержимого записи БД на экран. Однако вместо содержимого я вижу результат его исполнения.
3) В метке 3 возвращаем "как бы" текст из записи и в метке 4 выводи его на экран. Выводится " ", то есть пробел.
Что я неправильно сделал?
 

SiMM

Новичок
> Я нисколько не сомневаюсь, что Вы намного лучше меня, да и большинства форумчан разбираетесь в тонкостях программирования на PHP, однако если Вы объясните, как можно перегрузить include, я буду очень благодарен.

Я не лучше и не хуже, я просто когда-то взял и попробовал, а так же стараюсь не делать непроверенных заявлений.
string stream_read ( int count )
This method is called in response to fread() and fgets() calls on the stream. You must return up-to count bytes of data from the current read/write position as a string. If there are less than count bytes available, return as many as are available. If no more data is available, return either FALSE or an empty string. You must also update the read/write position of the stream by the number of bytes that were successfully read.

bool stream_eof ( void )
This method is called in response to feof() calls on the stream. You should return TRUE if the read/write position is at the end of the stream and if no more data is available to be read, or FALSE otherwise.
PHP:
class DbStream 
{ 
    function stream_open($path, $mode, $options, &$opened_path) 
    { 
        mysql_connect('127.0.0.1','root','') or die(mysql_error());
        $name = parse_url($path); 
        mysql_select_db($name['host']);
        mysql_query("SET NAMES 'cp1251'");
        $query = "SELECT `code` FROM `fake` WHERE `id`='1' LIMIT 1"; 
        $res = mysql_query($query) or die('Sh*t!'.mysql_error());
        $row = mysql_fetch_array($res);
        $this->buf = $row[0];
        return true;     
    } 
     
    function stream_read($count)  
    { 
       $ret = substr($this->buf,0,$count);
       $this->buf = substr($this->buf,$count);
       return $ret;
    } 

    function stream_eof()  
    { 
        return !strlen($this->buf);
    } 

} 

if(stream_wrapper_register("mys","DbStream")) 
{ 
    echo 'WRAPPER REGISTERED<br>'; 
}else{ 
    die('ERR!'); 
} 
$fp = fopen('mys://fake','r');
fpassthru($fp);
#include 'mys://fake';
работает ожидаемым образом.
> вместо содержимого я вижу результат его исполнения
Кстати, не воспроизводилось даже в Вашем варианте после исправления ошибок в stream_open.

PS: код исключительно демонстрационный.
 
Сверху