2014-12-20 25 views
-2

問題說明了一切。我正在從「PHP絕對初學者,第二版」一書中學習PHP,並且在第二章中,我必須構建一個PortFolio站點。PHP正在網頁上打印一個額外的1

我的代碼分爲5種方式。我有一個主index.php文件和其他兩個文件夾,其中包含navigation.php,projects.php,skills.phppage.php

代碼的index.php:

<?php 

    error_reporting(E_ALL); 
    ini_set("display_errors", 1); 

    $pageData = new stdClass(); 
    $pageData->title = "Thomas Blom Hansen: Portfolio site"; 
    $pageData->content = include_once "views/navigation.php"; 
    $pageData->css = "<link href='css/layout.css' rel='stylesheet' />"; 
    $navigationIsClicked = isset($_GET['page']); 

    if ($navigationIsClicked) { 
     $fileToLoad = $_GET['page']; 
     $pageData->content .=include_once "views/$fileToLoad.php"; 

    } else { 
     $fileToLoad = "skills"; 
    } 

    $pageData->content .=include_once "views/$fileToLoad.php"; 
    $page = include_once "templates/page.php"; 

    echo $page; 

我用XAMPP 5.6.3它運行PHP 5.6.3。 在我添加if之前,它工作正常。我嘗試了所有可能性,但總是在<body>標籤結束後打印1。我只是一個初學者。

在此先感謝。

回答

2

這應該爲你工作:

(我把一個視圖註釋來解釋怎麼回事!)

文件結構:

| 
| - index.php 
| - navigation.php 
| 
| - templates 
|  | - page.php 
| 
| - views 
     | - skills.php 
     | - projects.php 

的index.php:

<?php 
    //Error reporting only for testing environment 
    ini_set("display_errors", 1); 
    error_reporting(E_ALL); 
?> 

<?php 

    //To save some code lines i put that in a function 
    function getContent($path) { 
     ob_start(); 
     require_once($path); 
     $content = ob_get_contents(); 
     ob_end_clean(); 

     return $content; 
    } 

    $pageData = new stdClass(); 
    $pageData->title = "Thomas Blom Hansen: Portfolio site"; 


    $pageData->content = getContent("navigation.php"); 
    $pageData->css = "<link href='css/layout.css' rel='stylesheet' />"; 

    if(!empty($_GET['page'])) { 
     $fileToLoad = $_GET['page']; 

     $pageData->content .= getContent("views/$fileToLoad.php"); 

    } else { 
     $fileToLoad = "skills"; 

     $pageData->content .= getContent("views/$fileToLoad.php"); 
    } 

    $page = getContent("templates/page.php"); 

    $page = str_replace('%%$pageData->title%%', $pageData->title, $page); 
    $page = str_replace('%%$pageData->css%%', $pageData->css, $page); 
    $page = str_replace('%%$pageData->content%%', $pageData->content, $page); 

    echo $page; 

?> 

navigation.php:

<nav> 
    <a href='index.php?page=skills'>My skills and background</a> 
    <a href='index.php?page=projects'>Some projects</a> 
</nav> 

projects.php:

<h1>Projects I have worked on</h1> 

<ul> 
    <li>Ahem, this will soon be updated</li> 
</ul> 

模板/ page.php文件:

<!DOCTYPE html> 
<html> 

    <head> 
     <title>%%$pageData->title%%</title> 
     <meta http-equiv='Content-Type' content='text/html;charset=utf-8' /> 
     %%$pageData->css%% 
    </head> 

    <body> 
     %%$pageData->content%% 
    </body> 
</html> 

的意見/技能。PHP:

<h1>Skills and educational background</h1> 

<p>Read all about my skills and my formal training</p> 
<?php 
    echo "test"; //Little example to show that php gets parsed and that's also why the file extension still *.php is 
?> 

輸出/源代碼是:

<!DOCTYPE html> 
<html> 

    <head> 
     <title>Thomas Blom Hansen: Portfolio site</title> 
     <meta http-equiv='Content-Type' content='text/html;charset=utf-8' /> 
     <link href='css/layout.css' rel='stylesheet' /> 
    </head> 

    <body> 

<nav> 
    <a href='index.php?page=skills'>My skills and background</a> 
    <a href='index.php?page=projects'>Some projects</a> 
</nav> 




<h1>Skills and educational background</h1> 

<p>Read all about my skills and my formal training</p> 
test 


    </body> 
</html> 

側面說明:

在這裏,我使用require_once所以,如果你有一個複雜的網站文件沒有得到多次包括! (請參閱:http://php.net/manual/en/function.require-once.php

還添加了%%模板中的php變量之前和之後,這樣就不太可能用這個名稱編寫文本!

+0

非常感謝!但是我很難理解'$ page = str_replace('%% $ pageData-> title %%',$ pageData-> title,$ page);'在做什麼。 –

+0

@PrithvishBaidya歡迎您!你不明白什麼? – Rizier123

+0

我也遇到了getContent函數的問題。你能解釋一下'ob_start()'的含義嗎? –

2
include_once "templates/page.php"; 

如果文件「templates/page.php」;將返回1;被正確包括在內。 因此$頁將等於1.因此,回顯$頁將回顯1.

您應該只使用include_once "templates/page.php";而不是將它分配給一個變量,然後回聲!

這是怎樣的作品包括:

通過運行include_once "templates/page.php"; PHP將包括當前的PHP文件中的整個文件。通過這樣做也將執行代碼。如果包含成功,include_once將在回顯輸出爲1時返回TRUE。

+0

不客氣!如果我的回答對你有幫助,你應該在答案評分下按住複選標記將其標記爲正確! –

+0

@PhilipG由於OP似乎並不完全理解如何包含作品,因此您可以製作一個簡短示例,例如在包含完成後代碼的外觀如何!此外,我認爲只有答案是答案的解決方案和最有幫助的答案,答案纔會被接受! – Rizier123

+0

不適合我。 –

0

您不需要執行以下操作。

$page = include_once "templates/page.php"; 
echo $page; // comment out this line 

替換:

include_once "templates/page.php"; 

和1將被刪除。包含的頁面返回True(1)或false,但你不需要echo它。

+0

不工作,已經嘗試過。 –