Размещение содержимого в макете, который был загружен в виде строки из базы данных - PullRequest
0 голосов
/ 15 ноября 2011

Я хочу разработать свою собственную CMS в качестве личного учебного проекта и, возможно, использовать ее в проекте на работе. Я довольно осведомлен о том, как большинство других CMS делают свое волшебство, кроме того, как они загружают контент в макет.

То, что я хотел бы сделать, это сохранить HTML / php для макета в моей БД в виде текста типа. В макете будет строка типа php this->content();, куда я хочу загрузить контент. Поскольку макет исходит из базы данных, я не могу просто использовать php include(); для загрузки страницы и выполнения php, она будет загружена в виде строки.

Итак, мой вопрос: как я могу загрузить эту строку HTML / PHP из базы данных и выполнить php, не используя опасный вызов eval();.

Я бы назвал себя новичком / опытным пользователем php, а не мастером, поэтому, если я допустил какие-либо ошибки в этом вопросе, прокомментируйте, и я отредактирую.

Спасибо всем

1 Ответ

0 голосов
/ 15 ноября 2011

Include на самом деле не следует использовать для загрузки контента, но другие файлы, содержащие функции ...

Если контент просто поступает из базы данных, почему бы просто не запросить вывод, сохранить значение в переменной и использовать print( $var )?

Базовая CMS хранит свои статьи в базе данных с идентификатором, возможно, строкой заголовка и содержимым. Содержимое print передается div или некоторому другому элементу блока, действующему как контейнер. Разметка вокруг него - просто какой-то шаблон - HTML-страница с маркером для контента.

Вы добавляете контент через консоль администрирования, обычно для управления статьями, редактирования статей и публикации новых статей как минимум. Эта область должна быть защищена паролем.

Допустим, у вас есть URI /articles/1/How-Grinch-Stole-Thanksgiving (с использованием перезаписи URL для целей SEO), ваш базовый тип шаблона может выглядеть следующим образом:

<body>
  <div id="container">
    <?php
      $uri = substr($_SERVER['REQUEST_URI'], 1); //Gives us articles/1/How-Grinch-Stole-Thanksgiving
      $components = explode('/', $uri); // $components[0] is "articles", $components[1] is 1, etc.

      /* Do SQL Query here: "SELECT * FROM '".$components[0]."' WHERE 'id'=".$components[1] */
      $conn = mysql_connect("localhost", "mysql_user", "mysql_password");
      if (!$conn) {
        echo "Unable to connect to DB: " . mysql_error();
        exit;
      }
      if (!mysql_select_db("mydbname")) {
        echo "Unable to select mydbname: " . mysql_error();
        exit;
      }
      $sql = "SELECT * FROM '".$components[0]."' WHERE 'id'=".$components[1];
      $result = mysql_query($sql);
      if (!$result) {
        echo "Could not successfully run query ($sql) from DB: " . mysql_error();
        exit;
      }
      if (mysql_num_rows($result) != 1) {
        echo "Improper result. Exiting";
        exit;
      }
      $row = mysql_fetch_assoc($result);
      print($row["content"]);
    ?>
  </div>
</body>

Это чрезвычайно элементарно; Скорее всего, вам не удастся продвинуться в этом сценарии. Дело в том, что вы должны начать исследовать этот тип CMS, где индекс принимает подсказки замены из значений $_GET, чтобы вы могли понять, как страница собирается вместе. Позже вы сможете работать над чтением в шаблонах, собирать их в страницы и заменять маркеры содержимым из базы данных или других шаблонов.

...