Перейти к содержимому



Обработка PHP-кода - полученного из базы данных

#11 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8
0

Отправлено 24 Март 2011 - 20:34

AntonKh, прмер yury будет работать, так как в eval он передавал только команды php без текста на странице и обвязки PHP-кода конструкцией <?php ?>. У вас же в базе данных в поле $myrow['text'] хранится смесь текста и PHP-кода. Помещая данную смесь в eval мы получаем ошибку синтаксиса.

Так же советую проверить, не заменены ли у вас спец-символы < и > в базе на эквиваленты. Код который я приведу ниже показывает способ обраобтки, который вы хотели реализовать:
<?php

// callback-функция для обработки присланного php-кода и возврата резултьата
function eval_php($matches)
{
ob_start(); // включаем буферизацию
eval($matches[1]); // обрабатываем PHP-код
$code = ob_get_contents(); // помещаем в переменную содержимое буфера
ob_end_clean(); // выключаем буферизацию
return $code;
}

// функция обработки в строке всех <?php ?>, вызывает callback
function replace_php($string)
{
return preg_replace_callback("#<\?php(.*)\?>#Usi", "eval_php", $string);
}

// ПРИМЕР

// строка с кодом PHP - идентична вашей строке в базе данных
$string = "asdasdas";
$string .= "<?php echo '123';
echo '321';
include 'file.php'; ?>";
$string .= "asdasdas";

// вызов функции замены PHP-кода
$string = replace_php($string);
echo $string; // печатаем результат

?>

  • 0

#12 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 24 Март 2011 - 20:45

ZiTosS,
Есть подозрение, что проблема возникает, когда функции eval() пытаешься скормить не просто команду php
echo $myrow['text'];

, а конструкцию вроде такой:
<?php echo $myrow['text']; ?>

т.е. со пхп-шными скобками.

С ходу не придумывается решение для возникающей вложенности.
  • 0

#13 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 24 Март 2011 - 20:48

yury, это не подозрение. В неё, т.е. в функцию eval(), нужно передавать только конструкции, команды, операции PHP и ничего более.
Обвязка <?php ?> не нужна, это лишнее
  • 0

#14 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 24 Март 2011 - 20:51

Обвязка <?php ?> не нужна, это лишнее

ZiTosS,
я это понимаю, изначально я так и нарисовал код, но у TC судя по всему в БД в поле text лежит именно так:
код хтмл
<?php
код пхп
?>
код хтмл

и когда это попадает в eval(), эта функция ругается, что в нее нельзя пхп-шные скобки класть
  • 0

#15 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 24 Март 2011 - 20:56

yury, всё правильно. Описал это выше. Поэтому написал вариант, который будет обрабатывать и подобные строки.
  • 0

#16 AntonKh

AntonKh
    Topic Starter
  • Пользователь
  • 11 сообщений
  • Репутация: 0

Отправлено 24 Март 2011 - 21:09

Ага

код хтмл
<?php
код пхп
?>
код хтмл

эту ошибку я конечно обязательно учту (у мну именно так и было)

НО сия конструкция и простой текст не выводит из БД (независимо от конструкции <?php ?> или без него или просто текст)
<?php
$text = $myrow['text'];
eval ($text);
?>

А выдает ошибку
Parse error: syntax error, unexpected '<' in /hosting/users/h3009722/www/сайт.ru/страница.php(99) : eval()'d code on line 1

Собственно для чего мне все это:

В разных местах текста (хранится в БД) при выводе в страницу, требуется вставлять таблицу прочитаную из xls файла
поэтому в необходимом месте я пытаюсь вставить <?php include ("example.php");?> либо include ("example.php"); так я понимаю это правильнее.

Кстати example.php выводит xls

но пока получаю либо просто текст <?php echo $myrow['text']; ?>

либо ошибку <?php
$text = $myrow['text'];
eval ($text);
?>
  • 0

#17 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 24 Март 2011 - 21:13

ZiTosS,
маленькое замечание
в вашем коде в посте #11. комментарий
// функция обработки в строке всех <?php ?>, вызывает callback
слегка кривой из-за чего весь код глючит.
пхп-шные комментарии не могут содержать "?>" потому что это сочетание автоматом закрывает пхп-шный блок.
Вот так можно:
/* функция обработки в строке всех <?php ?>, вызывает callback */


AntonKh,
используйте код ZiTosS-а из поста #11.
В нем все ваши проблемы решены.
  • 0

#18 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 24 Март 2011 - 21:22

yury,

слегка кривой из-за чего весь код глючит.

Да комментировал на лету. Надо было взять в /**/. В них вроде нормально воспринимается.

AntonKh,
1) Попробуйте воспользоваться кодом, который я привел (не забыв удалить комментарний, на который указал yury)
2) Если не будет работать, советую заглянуть в БД, как я уже указывал. Возможно у вас символы < и > заменены на эквиваленты.
< - &lt;
> - &gt;
Тогда можно будет сделать вывод, что вы сами себе наставили кольев. Понятное дело, что эквивалентные символы никак не равны самим < и >, а лишь дают возможность вывести данные символы на страницу браузера. Сами символы < и > будут восприняты как открытие и закрытие HTML-тегов. Тут нужно понимать разницу.
  • 0

#19 AntonKh

AntonKh
    Topic Starter
  • Пользователь
  • 11 сообщений
  • Репутация: 0

Отправлено 24 Март 2011 - 21:22

yury, всё правильно. Описал это выше. Поэтому написал вариант, который будет обрабатывать и подобные строки.


ok я правильно Вас понимаю, т.е. все должно выглядеть следующим образом
<?php
include ("block/bd.php"); //подключаемся к базе

$result = mysql_query("SELECT `text` FROM `table1`",$db); //выбираем текстовое поле из базы
$myrow = mysql_fetch_assoc($result); //записываем его в переменную
?>
а далее для вывода текста и выполнения php команд из текста
<?php

// callback-функция для обработки присланного php-кода и возврата резултьата
function eval_php($matches) // $matches в моем случае это $myrow ?? (Правильно ? )
{
ob_start(); // включаем буферизацию
eval($matches[1]); // обрабатываем PHP-код
$code = ob_get_contents(); // помещаем в переменную содержимое буфера
ob_end_clean(); // выключаем буферизацию
return $code;
}

// функция обработки в строке всех <?php ?>, вызывает callback
function replace_php($string)
{
return preg_replace_callback("#<\?php(.*)\?>#Usi", "eval_php", $string);
}

// ПРИМЕР

// строка с кодом PHP - идентична вашей строке в базе данных
$string = "asdasdas";
$string .= "<?php echo '123';
echo '321';
include 'file.php'; ?>";
$string .= "asdasdas";
//Не совсем понял что мы помещаем в $string
// и что за <?php echo '123'; echo '321'; include 'file.php'; ?>";

// вызов функции замены PHP-кода
$string = replace_php($string);
echo $string; // печатаем результат

?>
  • 0

#20 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 24 Март 2011 - 21:28

AntonKh,
<?php
include ("block/bd.php"); //подключаемся к базе

// callback-функция для обработки присланного php-кода и возврата резултьата
function eval_php($matches) // $matches в моем случае это $myrow ?? (Правильно ? )
{
ob_start(); // включаем буферизацию
eval($matches[1]); // обрабатываем PHP-код
$code = ob_get_contents(); // помещаем в переменную содержимое буфера
ob_end_clean(); // выключаем буферизацию
return $code;
}

function replace_php($string)
{
return preg_replace_callback("#<\?php(.*)\?>#Usi", "eval_php", $string);
}

$result = mysql_query("SELECT `text` FROM `table1`",$db); //выбираем текстовое поле из базы
$myrow = mysql_fetch_assoc($result); //записываем его в переменную

echo replace_php($myrow['text']);

?>

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru