html и php в строке, исполнение php кода

Cyxapeff

Новичок
html и php в строке, исполнение php кода

наваял скриптик. Но что-то он у меня работать не хочет... Подскажите где ошибочка, пожалуйста.
Извлекаю из бд строку($row['Source']):
Код:
html    <?  print 'php';  ?>    html
Скрипт её обрабатывает:
PHP:
if(strpos($row['Source'], '<?') === false) print $row['Source'];  
else {
$source=$row['Source'];  
while($phpo === false){  
$phpo=strpos($source, '<?');
print substr($source , 0, $phpo);  $source=substr($source,$phpo);  $phpe=strpos($source, '?>');
eval(substr($source, 0, $phpe));  $source=substr($source,$phpe); 
}
 print $source;
}
В результате отображается только два раза слово html.

P.S версия php 4.3.11
 

Romashov

экспериментатор
Гонишь.
Хотя нет. Отображается действительно, html html
Но скрипт выводит html <? print 'php'; ?> html
 

Cyxapeff

Новичок
гм. Буду разбираться по строчке..
if(strpos($row['Source'], '<?') === false) print $row['Source']; #должен пропускать, т.к <? есть.
else {
$source=$row['Source'];
while($phpo === false){
$phpo=strpos($source, '<?'); #Нашли позицию где начинается пхп код
print substr($source , 0, $phpo); #вевели всё от начала строки до <?
$source=substr($source,$phpo); #Обрезали строчку до <?
$phpe=strpos($source, '?>'); #Нашли ?>
eval(substr($source, 0, $phpe)); #исполнили код (тут ошибка, вроде <? ?> тоже надо вырезать, но это не важно, т.к ошибка не выдаётся, а должна)
$source=substr($source,$phpe); #обрезали до ?>
} #пошли заного.

Судя повсему ошибка в самом начале в if?
 

Romashov

экспериментатор
Оформляй код!
PHP:
<?
$source="html    <?  print 'php';  ?>    html";
$phpo=strpos($source, '<?');
$source=substr($source,$phpo);
$phpe=strpos($source, '?>');
$code=substr($source, 2, $phpe-2);
eval($code);
?>
Этот кусок работает на ура.
Что ты ещё к нему приплёл - ковыряй дальше сам.
 

Cyxapeff

Новичок
Мда... Ну я и идиот!!! Нет, ну посмотрите что я написал в while!!!! Эх...

З.Ы Тему можно удалить. Спасибо Romashov.
 

Romashov

экспериментатор
Нет, ну посмотрите что я написал в while!!!! Эх...
как раз таки всё правильно
strpos возвращает логическое значение FALSE, если подстрока не найдена
дело в том, что у тебя phpo заранее не определена. Исправишь?
 

Cyxapeff

Новичок
Хм. Моя твоя не понимай! Выдержка из справочника: "Значение оператора while просто как 3 (три) рубля. Он говорит PHP, что нужно неоднократно выполнять вложенный оператор (-ы), пока выражение expr вычисляется в TRUE." У меня же было всё наоборот. Выполнять операторы только когда phpo уже нету. Хотя то, что я не предопределил phpo ошибка, но даже с предопределённым цикл будет исполнятся только 1 раз. А если там несколько <? ?> ? Вобщем проблема решена как я писал выше.
 

_RVK_

Новичок
а почему бы не использовать регулярные выражения?
 

Cyxapeff

Новичок
Эм... Я не знаю как. Щас пойду учебник почитаю... Первый раз столкнулся с потребностью "достать" текст, это первое, что пришло в голову.
 

_RVK_

Новичок
Cyxapeff
учи реги. рано или поздно они понадобятся. лучше рано...
 

texrdcom

Новичок
а сначало перед регами попробуй сделать этот изврат с помощью str_replace в php 5 еще есть без учета регистра
str_ireplace
 

SelenIT

IT-лунатик :)
А зачем вообще понадобилось хранить html с php-вставками в базе? Разве не проще хранить это добро в файлах и просто инклюдить их?
 

texrdcom

Новичок
SelenIT - не спрашивай такие умные вопросы, человек судя по всему только начинает пусть експерементирует это либо отобет желания от php либо заставить его изучить сначало и основательно :)
 

Cyxapeff

Новичок
учить начал давно, но из-за отсутствия свободного времени учится очень медленно. (тем не менее свой движок для сайта накатать умудрился и основные модули, которые нужны на сайте реализованны).
SelenIT захотелось так. :) Юзеру надо дать возможность создовать\редактировать свои странички (при этом шаблон общий) + должно быть в идеале несколько готовых модулей, которые он может использовать. И мне показалось удобнее всё хранить в базе, где сразу же хранятся данные опросов, гостевых, права и тд.
 

SelenIT

IT-лунатик :)
Cyxapeff
Т.е. у тебя юзер имеет возможность таким образом редактировать php-код? Рискованное решение. И, судя по тому, сколько действий пришлось совершить для банального print('php') - особо удобным его вряд ли назовешь...
 

texrdcom

Новичок
Когда ты будет ошибка в этом коде который храниться в базе ты тронишся его отлаживать так как при ошибке в eval выводиться номер строки всего шаблона а не кусочка в котором написан код :)
Когда писал свой второй движок для сайтов вернея вторую весрию тоже так сделал, код вставок в базе по началу все окей но чем больше проэкт тем и минингита больше, так что поверь это не первая и не последния версия твоего движка ты на стадии 10% грубо говоря :)
 

Cyxapeff

Новичок
SelenIT print это для теста. :) Да и юзер не любой...
texrdcom ну во-первых, делается это всё в первую очередь раде обучения. Во-вторых, можно придумать как вычеслять нужную строку выводить её и тд. В третьих пхп код там если и будет храниться, то совсем не сложный. В четвёртых, хватит меня гнобить :). Ну подумаешь сделаю неправельно. За то вон регулярными выражениями овладею. У меня ещё вся жизнь впереди. Переделать успею. (мне 15 лет) Так что дайте уж мне совершить эту ошибку, ок? ;)
 

texrdcom

Новичок
дык я за это же :) я ведь писал дайте человеку по експереминтировать ! :)
 

SelenIT

IT-лунатик :)
Cyxapeff
Не подумай, что я тебя "гноблю" - наоборот, твои самостоятельность, грамотная постановка вопроса и желание учиться достойны всяческого уважения. Но вот с этим
Ну подумаешь сделаю неправельно. ... Переделать успею. ... дайте уж мне совершить эту ошибку, ок?
я не согласен категорически!

Времени никогда не хватает на все, тем более, что оно - деньги. Поэтому время на исправление старых ошибок в любом случае придется отнимать у более интересных, творческих и ценных задач. А это неприятно в любом возрасте. Так что если уже видишь перед собой грабли - гораздо рациональнее найти другой путь. И для обучения это, имхо, гораздо полезнее.

P.S. Регулярные выражения в твоей задаче все равно понадобятся, так что возможность изучить их ты не упустишь и без хранения php-кода в базе :)
 
Сверху