Загрузите код PHP и HTML в переменную PHP, отображаемую в ‹div›

Вот мой случай. У меня есть следующий скрипт:

<?php
// ... other code ...
switch($_GET['request'])    {
        case "firstPage":
            $file = APP_ROOT. "pages/firstPage.php";
            $hndle = fopen($file,"r");
            $right_column = fread($hndle, filesize($file));
            fclose($hndle);
            break;
        case "secondPage":
            $file = APP_ROOT. "pages/secondPage.php";
            $hndle = fopen($file,"r");
            $right_column = fread($hndle, filesize($file));
            fclose($hndle);
            break;
    }
}
?>
<div id="right_column">
    <?php echo $right_column;?>
</div>
// ... other code ...

В зависимости от значения $_GET['request'] я присваиваю переменной $right_column содержимое файла php. Затем я повторяю эту переменную в последнем div. Файлы firstPage.php и secondPage.php содержат смешанный код html и php. Я ищу решение, подобное «частичному» в Zend. Спасибо


person Ginger Opariti    schedule 22.11.2011    source источник
comment
В чем здесь проблема, в чем вопрос?   -  person Chris Baker    schedule 22.11.2011
comment
@Chris: Извините, пытался найти решение, потому что в моем сообщении было более 250 символов.   -  person Ginger Opariti    schedule 22.11.2011


Ответы (4)


Вероятно, было бы проще, если бы вы установили переменную, указывающую, какой PHP-файл следует включать, а затем вместо того, чтобы читать файл, просто включали его. Например:

<?php
// ... other code ...
switch($_GET['request'])    {
        case "firstPage":
            $file = APP_ROOT. "pages/firstPage.php";
            break;
        case "secondPage":
            $file = APP_ROOT. "pages/secondPage.php";
            break;
    }
}
?>
<div id="right_column">
    <?php include($file);?>
</div>
// ... other code ...

Если ваши файлы firstPage.php и secondPage.php содержат только HTML, то, что вы делаете, будет работать. Если у него есть PHP, вам нужно его include(); или вы могли бы eval() сделать это, но это снова требует больше работы, чем вам нужно.

person jprofitt    schedule 22.11.2011
comment
Спасибо. Здравый смысл, накопилось огромное количество вопросов по этой теме, решение было удобным, но, что удивительно, его никто не видел, в том числе и я! - person Ginger Opariti; 22.11.2011

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

Вам нужно проанализировать файл PHP и отобразить результат. Вы можете сделать это двумя способами:

Во-первых, вместо

 $file = APP_ROOT. "pages/firstPage.php";
 $hndle = fopen($file,"r");
 $right_column = fread($hndle, filesize($file));
 fclose($hndle);

Ты можешь сделать:

$right_column = include(APP_ROOT . "pages/firstPage.php");

Итак, ваш firstPage.php должен ВОЗВРАЩАТЬ код. Что-то вроде этого:

// firstPage.php
return "my html";

Но вы также можете включить его следующим образом:

<div id="right_column">
    <?php include(APP_ROOT . "pages/firstPage.php"); ?>
</div>

Или вы можете использовать ob_get_contents. PHP имеет хорошую документацию о том, как его использовать.

Я бы использовал include для вашего случая.

person gustavotkg    schedule 22.11.2011

Мне кажется, что вы могли бы программировать по соглашению, а не постоянно увеличивать оператор switch:

<?php
// ... other code ...

$file = '';
if (isset($_GET['request'])) {
    $safeFileName = sanitizeRequestForFileName($_GET['request']);
    $file = APP_ROOT. 'pages/' . $safeFileName . '.php';
}
?>
<div id="right_column">
    <?php 
        if (file_exists($file)) {
            include($file);
        }
    ?>
</div>
// ... other code ...
person Fenton    schedule 22.11.2011
comment
Вы уверены, что включить файл только потому, что он существует, это лучшая идея? Внутри $_GET['request'] может быть много всего. - person tereško; 22.11.2011
comment
Это крайне небезопасно. Что, если $_GET['request'] === ../uploads/hacker_script? Упс. - person Chris Baker; 22.11.2011
comment
@Chris, это действительно не причина избегать программирования по соглашению. Вы бы просто написали метод для очистки ввода или использовали хранилище, такое как ответ Терешко, если хотите заблокировать параметры. Я просто считаю, что будет лучше, если вам не нужно менять свой код каждый раз, когда вы хотите добавить дополнительную опцию. - person Fenton; 23.11.2011

person    schedule
comment
ваш комментарий, по сути, в соответствии с другими выше, напоминает мне о ранних соревнованиях по написанию самого нечитаемого кода C из возможных. У вас есть своя точка зрения, но я скептически отношусь к вашему «ужасному» атрибуту. ;-) хоть ... - person Ginger Opariti; 22.11.2011
comment
@GingerOpariti, тогда попробуйте добавить 12 разных страниц в свою версию ... и забудьте пустой параметр request в URL-адресе. - person tereško; 22.11.2011
comment
+1 Это определенно лучше, чем постоянно расширяющийся оператор switch. - person Fenton; 23.11.2011