2013-12-18 2 views
0

Итак, у меня есть простая html-страница, которая выглядит так.PHP include() очищает остальную часть HTML-документа?

<html> 
<head> 
     <?php include("scripts/header.php"); ?> 
     <title>Directory</title> 
</head> 
<body> 
     <?php include("scripts/navbar.php"); ?> 
     <div id="phd"> 
       <span id="ph">DIRECTORY</span> 
       <div id="dir"> 
         <?php include("scripts/autodir.php"); ?> 
       </div> 
     </div> 
     <!--Footer Below--> 
     <?php include("scripts/footer.php"); ?> 
     <!--End Footer--> 
</body> 
</html> 

Теперь проблема в том, что при загрузке страницы все испортилось. Просмотр исходного кода страницы показывает, что все после <div id="dir"> ПОЛНОСТЬЮ ОСТАЛОСЬ. Файл заканчивается. Нет прилагаемого сценария, нет </div>, нижний колонтитул или даже </body>, </html>. Но это не выплевывает никаких ошибок. Просто стирайте документ из включенного без причины, или мои друзья могут понять. Никто из нас никогда не испытывал такого странного поведения.

Сценарий, вызываемый под вопросом, представляет собой скрипт, который будет извлекать файлы изображений с сервера (которые я загрузил, а не пользователи) и автоматически высылать ссылки на соответствующую страницу в архиве при загрузке страницы, потому что необходимость редактировать страница каталога каждый раз, когда я загружаю новое изображение, является настоящей проблемой.

Код в вопросе ниже:

<?php 
    //Define how many pages in each chapter. 
    //And define all the chapters like this. 
    //const CHAPTER_1 = 13; etc. 
    const CHAPTER_1 = 2; //2 for test purposes only. 
    //+-------------------------------------------------------+// 
    //| DON'T EDIT BELOW THIS LINE!!!       |// 
    //+-------------------------------------------------------+// 

    //Defining this function for later. Thanks to an anon on php.net for this! 
    //This will allow me to get the constants with the $prefix prefix. In this 
    //case all the chapters will be defined with "CHAPTER_x" so using the prefix 
    //'CHAPTER' in the function will return all the chapter constants ONLY. 
    function returnConstants ($prefix) { 
      foreach (get_defined_constants() as $key=>$value) { 
        if (substr($key,0,strlen($prefix))==$prefix) { 
          $dump[$key] = $value; 
        } 
      } 
      if(empty($dump)) { 
        return "Error: No Constants found with prefix '" . $prefix . "'"; 
      } 
      else { 
        return $dump; 
      } 
    } 
    //---------------------------------------------------------// 
    $archiveDir = "public_html/archive"; 
    $files = array_diff(scandir($archiveDir), array("..", ".")); 
    //This SHOULD populate the array in order, for example: 
    //$files[0]='20131125.png', $files[1]='20131126.png', etc. 
    //---------------------------------------------------------// 
    $pages = array(); 
    foreach ($files as $file) { 
    //This parses through the files and takes only .png files to put in $pages. 
      $parts = pathinfo($file); 
        if ($parts['extension'] == "png") { 
          $pages[] = $file; 
        } 
      unset($parts); 
    } 
    //Now that we have our pages, let's assign the links to them. 
    $totalPages = count($pages); 
    $pageNums = array(); 
    foreach ($pages as $page) { 
      //This will be used to populate the page numbers for the links. 
      //e.g. "<a href='archive.php?p=$pageNum'></a>" 
      for($i=1; $i<=$totalPages; $i++) { 
        $pageNums[] = $i; 
      } 
      //This SHOULD set the $pageNum array to be something like: 
      //$pageNum[0] = 1, $pageNum[1] = 2, etc. 
    } 
    $linkText = array(); 
    $archiveLinks = array(); 
    foreach ($pageNums as $pageNum) { 
      //This is going to cycle through each page number and 
      //check how to display them. 
      if ($totalPages < 10) { 
        $linkText[] = $pageNum; 
      } 
      elseif ($totalPages < 100) { 
        $linkText[] = "0" . $pageNum; 
      } 
      else { 
        $linkText[] = "00" . $pageNum; 
      } 
    } 
    //So, now we have the page numbers and the link text. 
    //Let's plug everything into a link array. 
    for ($i=0; $i<$totalPages; $i++) { 
      $archiveLinks[] = "<a href='archive.php?p=" . $pageNums[$i] . "'>" . $linkText[$i] . " " . "</a>"; 
    //Should output: <a href= 'archive.php?p=1'>01 </a> 
    //as an example, of course. 
    } 
    //And now for the fun part. Let's take the links and display them. 
    //Making sure to automatically assign the pages to their respective chapters! 
    //I've tested the below using given values (instead of fetching stuff) 
    //and it worked fine. So I doubt this is causing it, but I kept it just in case. 
    $rawChapters = returnConstants('CHAPTER'); 
    $chapters = array_values($rawChapters); 
    $totalChapters = count($chapters); 
    $chapterTitles = array(); 
    for ($i=1; $i<=$totalChapters; $i++) { 
      $chapterTitles[] = "<h4>Chapter " . $i . ":</h4><p>"; 
      echo $chapterTitles[($i-1)]; 
      for ($j=1; $j<=$chapters[($i-1)]; $j++) { 
        echo array_shift($archiveLinks[($j-1)]); 
      } 
      echo "</p>"; //added to test if this was causing the deletion 
    } 
?> 

Что вызывает оставшуюся часть документа исчезать, как это? EDIT: две глупые ошибки синтаксиса вызывали это и были исправлены в вышеуказанном коде! Однако ссылки вообще не отображаются? Обратите внимание, что я довольно новичок в php, и я не ожидаю, что мой код будет самым эффективным (я просто хочу, чтобы работа darn работала!).

Приложение: если вы считаете, что переписывать код (а не просто исправлять ошибки), чтобы быть предпочтительным курсом действий, пожалуйста, объясните, что делает код, так как я не люблю использовать код. Понимаю. Благодаря!

+1

Возможно, это ошибка, которая скрыта. Каков ваш уровень «error_reporting», и вы проверили, что страница работает иначе? Попробуйте использовать 'require' вместо' include' и посмотреть, если вы получите фатальную ошибку – casraf

+0

Как указано выше. Я дал вам две синтаксические ошибки в качестве ответа, но вам действительно нужно убедиться, что вы включили отчет об ошибках (и на самый высокий уровень), а также научитесь проверять свои журналы. См. Документы об 'error_reporting' здесь: http://php.net/manual/en/function.error-reporting.php –

+1

@ChenAsraf У меня были две глупые синтаксические ошибки, из-за чего все это было уничтожено. Основная причина не писать код, когда вы не спали через несколько дней (к сожалению, это то, что я, как правило, имею свои прозвища!). – Ipurgepeople

ответ

4

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

Line 45:

foreach ($pages = $page) { 

Должно быть:

foreach ($pages as $page) { 

линия 88:

echo array_shift($archiveLinks[($j-1)]; 

отсутствует кронштейн:

echo array_shift($archiveLinks[($j-1)]); 

Важно ...

Для того, чтобы убедиться, что вы можете найти эти виды ошибок сами, вы должны убедиться, что сообщения об ошибках включается к что означает, что вам показывают, или узнайте, где находятся ваши журналы и как их читать.

Смотрите документацию по php.net здесь:

ИМО все серверы развития должна иметь наивысший уровень сообщений об ошибках включена по умолчанию, так что вы никогда не пропустите ошибку, предупреждение или уведомление. Это просто упрощает вашу работу.

Документация по настройке во время выполнения можно найти здесь:

+0

Я чувствую себя полным придурком. Я написал этот код примерно как 5 утра на прошлой неделе после почти 60 часов без сна. Это полностью устранило ошибку отображения. Однако сценарий не создает ссылки должным образом. Любые идеи почему? – Ipurgepeople

+1

Поверните error_reporting на E_ALL в своей машине разработки, и я предлагаю вам научиться отлаживать и получать правильную среду IDE для этого. Таким образом, вы будете экономить много времени (и в долгосрочной перспективе, деньги). Что касается ссылок, которые не отображаются должным образом, я уверен, что если вы отлаживаете, вы пойдете дальше, чем пытаетесь понять код с нуля. Удачи! :) – casraf

+0

Я согласен с @ChenAsraf - теперь исправлена ​​ваша непосредственная проблема. Я предлагаю вам пойти и попробовать сначала отладить себя и вернуться с новым вопросом, если вы не можете найти решение. –

1

Существует ошибка в scripts/autodir.php этот файл. Все до этого момента отлично работает, поэтому здесь начинается проблема.

Также mostlikely есть ошибки, скрытые, как указано Чэнь Хаят, поэтому включите ошибки:

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

Просто положить, что в верхней части файла PHP.

+0

Я бы сказал, что важно, чтобы все серверы разработки настроены так, чтобы всегда отображались все ошибки, предупреждения и уведомления. Хотя это и помогает в ближайшей проблеме, я думаю, что стоит отметить, что это не так, что в течение нескольких часов не повторится проблема. (Это звучит более критично, чем это было!) –

+0

Я знаю, что у меня есть (некоторые) ошибки, по крайней мере, потому что, когда я наткнулся на скрипт на прошлой неделе, он выплюнул список ошибок. Однако этот человек ничего не сделал. Вышеупомянутые строки включают все сообщения об ошибках для этого файла? – Ipurgepeople

Смежные вопросы