[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выполнение скрипта.
denis79513
Есть что-то типа:

$text = 'Тут какой-то текст <? тут php скрипт ?> тут опять текст';
echo '$text';


Как сделать, чтобы скрипт в переменной не выводился на экран как текст а выполнялся?



Спустя 48 минут, 47 секунд (26.08.2012 - 16:31) KOPOJI написал(а):
eval() для этого, но я не рекомендую это делать. лучше отдельно выводить текст и отдельно выполнять, это лишнее совмещать таким образом все.

Спустя 11 минут, 17 секунд (26.08.2012 - 16:42) denis79513 написал(а):
Понимаю что это не лучший вариант, но без этого никак, увы(

Спустя 20 минут, 19 секунд (26.08.2012 - 17:03) KOPOJI написал(а):
такого не бывает чтобы без этого нельзя было обойтись. Если без этого не обойтись в вашем скрипте, значит у вас неверная архитектура и вам нужно ее менять. иначе потом можете пожалеть

Спустя 1 минута, 13 секунд (26.08.2012 - 17:04) KOPOJI написал(а):
и если уж все таки будете использовать eval() - то сообщаю что внутри должен быть правильный php-код, вплоть до точки с запятой в конце строки

Спустя 32 минуты, 22 секунды (26.08.2012 - 17:36) denis79513 написал(а):
Сейчас пишу класс шаблонов для своего проекта и там нужно чтобы в переменной выполнялся php код, иначе смысл шаблонов теряется.

Спустя 1 минута, 38 секунд (26.08.2012 - 17:38) denis79513 написал(а):
Цитата (KOPOJI @ 26.08.2012 - 15:04)
и если уж все таки будете использовать eval() - то сообщаю что внутри должен быть правильный php-код, вплоть до точки с запятой в конце строки

да, уже чувствую проблемы)

Спустя 42 секунды (26.08.2012 - 17:39) KOPOJI написал(а):
Цитата
иначе смысл шаблонов теряется.

впервые об этом слышу blink.gif

Спустя 2 минуты, 49 секунд (26.08.2012 - 17:41) denis79513 написал(а):
Ну вот смотрите например у меня шаблон main.tpl
содержимое типа:
<b>{BODY}</b>

На одной странице у меня BODY - простой текст, а на другой например цикл, который печатает строки в таблице, и как быть?

Спустя 58 минут, 56 секунд (26.08.2012 - 18:40) KOPOJI написал(а):
ну так и заменяйте его на код.
Основной принцип шаблонизации - как раз в отделении бизнес-логики приложения от логики представления. а таким образом получается что вы сбрасываете на нет эту логику и вообще смысл шаблонов

Спустя 52 секунды (26.08.2012 - 18:41) KOPOJI написал(а):

Спустя 11 часов, 52 минуты, 22 секунды (27.08.2012 - 06:34) denis79513 написал(а):
А вы прочти абзац, который начинается с : А все дело в...
Там как раз моя ситуация и говорится, что "Нужно отделять логику приложения от логики отображения, но это не значит, что в HTML-шаблоне мы не можем использовать PHP-код."

У меня сейчас вот такая проблема возникла, не пойму почему, но исчезают переменные из текста.

$TPL -> set_value(array("TITLE" => "Тут текст
<?php

$i = '0';
if (
$i == '0')
{
echo 'хахаха';
}
?>"

));

Потом выводим на страницу значение переменной TITLE и получается:
Тут текст
<?php
= '0';
if ( == '0')
{
echo 'хахаха';
}
?>

То есть все что со знаком доллара впереди ($i) исчезает. Я не знаю почему, но предполагаю, что это в php так заложено, как это обойти?
Как следствие eval выдает ошибку из-за неправильности php кода

Спустя 1 час, 7 минут, 30 секунд (27.08.2012 - 07:41) Игорь_Vasinsky написал(а):
eval('?>'. $some_tpl .'<?php');


это нормальная ситуация в данном случае использовать eval()

сам не однократно использовал для работы с шаблонами.

даж функция простенькая

getTpl($tpl)
{
return eval('?>'. $some_tpl .'<?php');
}


getTpl('path/to/template.tpl');


но ушки на макушке должны быть, т.к. правильно подмечено выше - должен быть правильный php, т.к. при моём примере - будет лишь нотис о работе функции, а не ошибка с номером строки и файла.

Спустя 5 минут, 40 секунд (27.08.2012 - 07:47) denis79513 написал(а):
Цитата (Игорь_Vasinsky @ 27.08.2012 - 05:41)
eval('?>'. $some_tpl .'<?php');


это нормальная ситуация в данном случае использовать eval()

сам не однократно использовал для работы с шаблонами.

даж функция простенькая

getTpl($tpl)
{
return eval('?>'. $some_tpl .'<?php');
}


getTpl('path/to/template.tpl');


но ушки на макушке должны быть, т.к. правильно подмечено выше - должен быть правильный php, т.к. при моём примере - будет лишь нотис о работе функции, а не ошибка с номером строки и файла.

Спасибо, функции я уже все прописал, примерно то же что и у вас, вот только не могу проблему решить которую описал в посте выше, можете что-то подсказать? Почему переменные пропадают?

Спустя 28 минут, 55 секунд (27.08.2012 - 08:16) KOPOJI написал(а):
не бывает такой ситуации чтобы невозможно было обойтись без eval().
К примеру тот же цикл вывода как вы говорите - накопите весь вывод в переменную и замените на значение переменной. Зачем же php-код то загонять туда на выполнение? huh.gif

Спустя 7 минут, 30 секунд (27.08.2012 - 08:23) denis79513 написал(а):
цикл я пример как пример, у меня куда более сложные условия проверяются и в зависимости от них отображается контент. Отдельно подключать модули с php кодом не хочу.

Кто-нибудь с проблемой с исчезновением переменных поможет?

Спустя 11 минут, 2 секунды (27.08.2012 - 08:34) KOPOJI написал(а):
eval()
хабра
и так далее
это по поводу eval)

Спустя 3 минуты, 8 секунд (27.08.2012 - 08:37) Игорь_Vasinsky написал(а):
Цитата
е бывает такой ситуации чтобы невозможно было обойтись без eval().

согласен, я например щас в большей мере использую альтернативный синтаксис в самих шаблонах.

ТС - убери нафиг из шаблона <?php и ?>

Спустя 8 минут, 14 секунд (27.08.2012 - 08:46) denis79513 написал(а):
Покажу популярнее.
Следующий код:

$a = " $i = '0'; if ($i == '0') { echo 'хахаха';}";
echo $a;

отображается так:
= '0'; if ( == '0') { echo 'хахаха'; } 

а должен так:
$i = '0'; if ($i == '0') { echo 'хахаха';} 


Спустя 2 минуты, 52 секунды (27.08.2012 - 08:48) KOPOJI написал(а):
ага.. а если register_globals = on? это я про пример с заголовком. второе - если вы в eval() загоните код вывода из базы что будет если ваш сайт от-XSS-сят!?
к примеру на такую строчку
UPDATE `users` SET `name`='echo "<script>window.location.replace(\"http://sex.ru\");</script>";'

Спустя 1 минута, 38 секунд (27.08.2012 - 08:50) KOPOJI написал(а):
в общем смотрите сами. я предупредил вас о вреде eval(), предложил альтернативу с накапливанием вывода - если хотите продолжать eval-ить - на здоровье.

Спустя 3 минуты, 17 секунд (27.08.2012 - 08:53) Игорь_Vasinsky написал(а):
KOPOJI
лан, уломал, напишем всем форумом хостеру ТС - чтоб eval в disable function включил.


а про обработку данных не слышали?

Спустя 30 секунд (27.08.2012 - 08:54) Игорь_Vasinsky написал(а):
альтернатива - ob_start() + strtr()

Спустя 1 минута, 2 секунды (27.08.2012 - 08:55) denis79513 написал(а):
Цитата (KOPOJI @ 27.08.2012 - 06:48)
ага.. а если register_globals = on? это я про пример с заголовком. второе - если вы в eval() загоните код вывода из базы что будет если ваш сайт от-XSS-сят!?
к примеру на такую строчку
UPDATE `users` SET `name`='echo "<script>window.location.replace(\"http://sex.ru\");</script>";'

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

Спустя 20 минут, 1 секунда (27.08.2012 - 09:15) KOPOJI написал(а):
eval("\$i=0;");
eval("if ($i == '0') { echo 'хахаха';}");

Спустя 28 минут, 24 секунды (27.08.2012 - 09:43) denis79513 написал(а):
Цитата (KOPOJI @ 27.08.2012 - 07:15)
eval("\$i=0;");
eval("if ($i == '0') { echo 'хахаха';}");

а вот за это огромное спасибо ;)

Потом может выложу свой template class на общее пользование...

Спустя 26 минут, 16 секунд (27.08.2012 - 10:10) Игорь_Vasinsky написал(а):
не надо biggrin.gif

Спустя 1 час, 5 минут, 33 секунды (27.08.2012 - 11:15) denis79513 написал(а):
Цитата (Игорь_Vasinsky @ 27.08.2012 - 08:10)
не надо  biggrin.gif

да не бойтесь так, люди кроме вас тоже иногда что-то полезное пишут)

Спустя 7 минут, 32 секунды (27.08.2012 - 11:23) KOPOJI написал(а):
Цитата
да не бойтесь так, люди кроме вас тоже иногда что-то полезное пишут)
никто не говорил что вы что то бесполезное пишете smile.gif имелось в виду что вы просто неправильный подход используете.. но вам виднее как выяснилось)

Спустя 6 минут, 1 секунда (27.08.2012 - 11:29) Игорь_Vasinsky написал(а):
совершенно верно.

я же писал выше.

если уж используешь eval() - разумней весь tpl за раз обработать - 1 вызов функции, нежели как ты, "евалить" на каждой строчке wink.gif

Спустя 9 минут, 11 секунд (27.08.2012 - 11:38) denis79513 написал(а):
Цитата (Игорь_Vasinsky @ 27.08.2012 - 09:29)
если уж используешь eval() - разумней весь tpl за раз обработать - 1 вызов функции, нежели как ты, "евалить" на каждой строчке  wink.gif

я так и делаю сначала весь шаблон из кусочков собирается а в конце при помощи eval отображается.

Только у меня подозрительно маленький класс получился, около 100 строк, может нужно еще что предусмотреть важное?

Спустя 46 минут, 12 секунд (27.08.2012 - 12:24) denis79513 написал(а):
еще проблема возникла, как сделать, чтобы в коде, который обрабатывает функция eval можно было обращаться к объектам, созданным за ее приделами. Например:
 
$OBJ = new object;
$a = "$OBJ -> function();";
eval ($a);

Спустя 21 минута, 5 секунд (27.08.2012 - 12:45) KOPOJI написал(а):
так не получится. вы внутри строки обращаетесь к нему, тогда надо использовать __toString() - а уже не то будет

Спустя 1 минута, 13 секунд (27.08.2012 - 12:46) KOPOJI написал(а):
если только вот так
$obj = new object;
eval("\$obj->foo();");

Спустя 7 минут, 12 секунд (27.08.2012 - 12:54) denis79513 написал(а):
попробовал со слешем, выдает
syntax error, unexpected T_VARIABLE, expecting T_STRING

буду наверно тогда просто создавать объекты внутри

Спустя 2 минуты, 8 секунд (27.08.2012 - 12:56) KOPOJI написал(а):
быть такого не может
class bar {
public function foo() {
echo 'OK';
}
}

$obj = new bar;
eval("\$obj->foo();");

Результат:
OK

только что проверил..

Спустя 1 минута, 27 секунд (27.08.2012 - 12:57) KOPOJI написал(а):
ты наверное вместо двойных кавычек одинарные написал

Спустя 24 минуты, 38 секунд (27.08.2012 - 13:22) denis79513 написал(а):
да, одинарные, двойные я не могу использовать потому что внутри могут быть html теги и тогда получится

eval("\$obj->foo(); echo '<img src="site">';");

Спустя 51 секунда (27.08.2012 - 13:23) denis79513 написал(а):
может написать функцию которая будет менять все кавычки внутри на двойные, чтобы весь код не переписывать

Спустя 4 минуты, 3 секунды (27.08.2012 - 13:27) KOPOJI написал(а):
$text = ' <?php .... ?>';
$text = str_replace("'",'"',$text);
file_put_contents('new_file.php');

Скрытый текст
но мое мнение вообще про идею с eval() вы  знаете

Спустя 15 минут, 30 секунд (27.08.2012 - 13:42) denis79513 написал(а):
Цитата (KOPOJI @ 27.08.2012 - 11:27)
$text = ' <?php .... ?>';
$text = str_replace("'",'"',$text);
file_put_contents('new_file.php');

Скрытый текст
но мое мнение вообще про идею с eval() вы  знаете

я об этом уже подумал, а как быть, когда внутри <?php ?> есть echo "..."; там то двойные кавычки нужно оставить

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

Спустя 15 минут, 17 секунд (27.08.2012 - 13:57) KOPOJI написал(а):
а экранирование символов для чего тогда?)
eval(" echo \"hello, world!\";");

Спустя 1 минута, 12 секунд (27.08.2012 - 13:59) KOPOJI написал(а):
как на мой взгляд - динамического создания объектов внутри шаблона лучше избежать. аргументировать не могу, просто почему то так кажется (возможно, и ошибаюсь)

Спустя 5 минут, 21 секунда (27.08.2012 - 14:04) KOPOJI написал(а):
interface info {
function search();
function show();
}
class show_info implements info {
function search() {

}

function show() {

}
}

class show_info2 implements info {
function search() {

}

function show() {

}
}

eval("\$obj1 = new show_info;");
eval("\$obj2 = new show_info2;");

может и есть в этом какой то смысл..
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.