2011-11-15 1 views
0

개인 학습 프로젝트로 dev 내 자신의 사용자 지정 CMS를 찾고 있으며이를 직장의 프로젝트에서 사용할 수도 있습니다. 나는 대부분의 다른 CMS가 컨텐츠를 레이아웃에로드하는 방법과 별개로 그들의 마법을 어떻게 수행하는지에 관해서는 꽤 실마리가 있습니다.데이터베이스에서 문자열로로드 된 레이아웃에 콘텐츠 배치

내가 할 수있게하고 싶습니다 형식 텍스트로 내 DB에 레이아웃 HTML/PHP를 저장할 수 있습니다 싶습니다. 레이아웃은 this->content();과 같은 php의 라인을 가지고있어 컨텐츠를로드하고 싶습니다. 레이아웃이 데이터베이스에서오고 있기 때문에 PHP의 include();을 사용하여 페이지를로드하고 PHP를 실행할 수 없으며 문자열로로드됩니다.

내 질문에, 어떻게 데이터베이스에서이 HTML/PHP 문자열을로드하고 위험한 eval(); 호출을 사용하지 않고 PHP를 실행할 수 있습니까?

필자는 초심자/고급 php 사용자로 마스터에서 멀리 떨어져 있기 때문에이 질문에서 실수를 저 지르면 주석을 달고 편집 할 것입니다.

덕분에 모든

+2

Wordpress, Drupal 및 Joomla!에서 본 대부분의 내용에서이 CMS는 데이터베이스에 ** PHP 코드 **를 저장하지 않습니다. 동적으로 데이터베이스를 형성하기 위해 내용을로드하는 템플리트 파일이 있습니다. – mmundiff

+0

왜 템플릿이나 html/php 코드를 데이터베이스에 저장 하시겠습니까? 그 방법이 CMS를 만드는 데 매우 유용 할 것입니다. 이 방법을 고집하는 경우 문자열을 가져 와서 PHP 확장명을 가진 임시 파일로 저장하고 포함시킨 다음 파일을 삭제할 수 있다고 가정합니다. 그러나 나는 이것이 당신의 전반적인 목표에 대해 유용하거나 도움이되는 방법을 여전히보고 싶지 않습니다. – mason81

+1

당신의 접근 방식은 잘못되어 위험합니다. DB 문자열에서 PHP를 가져 오는 데 필요한 'eval()'을 사용하여 문제와 공격에 노출 될 수 있습니다. KISS - 간단하고 어리 석다. 당신은 배우기 위해 이것을하고 있습니다. 따라서 작게 시작해서 더 커질 수 있습니다. Exploring Wordpress, Drupal, Joomla ... 이것은 나쁜 예입니다 - 모두를 위해 모든 것을 시도하고 부풀게됩니다. 사용자 정의 CMS는 사용자의 요구에 초점을 맞춰야합니다. – stslavik

답변

0

Include 정말 내용을로드하는 데 사용할 수 없습니다해야하지만, 내용이 단순히 데이터베이스에서 오는 경우 다른 파일은 ... 기능을 포함

, 단순히 출력을 쿼리 할 이유 값을 변수에 저장하고 print($var)을 사용 하시겠습니까?

기본 CMS는 ID가있는 데이터베이스 (예 : 제목 문자열) 및 내용을 데이터베이스에 저장합니다. 콘텐츠는 div 또는 다른 컨테이너 요소 역할을하는 print입니다. 그 주위의 레이아웃은 단순히 일종의 템플릿 일뿐입니다. html 페이지에 내용 마커가 있습니다.

일반적으로 기사를 관리하고 기사를 편집하며 최소한 새로운 기사를 게시 할 수있는 관리 콘솔을 통해 콘텐츠를 추가합니다. 이 영역은 암호로 보호되어야합니다.

<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> 

이 매우 초보입니다 :

그럼 당신은 URI /articles/1/How-Grinch-Stole-Thanksgiving (SEO 목적으로 재 작성하여 URL)를 가지고 가정 해 봅시다, 템플릿의 기본적인 종류처럼 보일 수 있습니다 당신은 이런 종류의 스크립트를 사용하지 않을 것입니다. 요점은 인덱스가 대체 큐를 $_GET 값에서 가져 오는이 종류의 CMS를 탐색해야하므로 페이지가 어떻게 함께 나타나는지 알 수 있습니다. 나중에 템플릿에서 읽고 페이지로 어셈블하고 마커를 데이터베이스 또는 다른 템플릿의 컨텐츠로 바꿀 수 있습니다.

관련 문제