PHP включает (), стирая остальную часть документа HTML?

0

Поэтому у меня есть простая 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 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 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 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 и посмотрите, что вы получите фатальную ошибку
  • 0
    Как указано выше. В качестве ответа я дал вам две синтаксические ошибки, но вам действительно нужно убедиться, что вы включили отчеты об ошибках (и на самом высоком уровне), а также научиться проверять свои журналы. Смотрите документацию на error_reporting здесь: php.net/manual/en/function.error-reporting.php
Показать ещё 1 комментарий
Теги:

2 ответа

4
Лучший ответ

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

Строка 45:

foreach ($pages = $page) {

Должно быть:

foreach ($pages as $page) {

Строка 88:

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

Отсутствует скобка:

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

Важный...

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

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

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

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

  • 0
    Я чувствую себя полным идиотом. Я написал этот код примерно в 5 часов утра на прошлой неделе после почти 60 часов без сна. Это полностью исправило ошибку дисплея. Однако скрипт не создает ссылки должным образом. Есть идеи почему?
  • 1
    Пожалуйста, включите error_reporting в E_ALL на вашей машине для разработки, и я бы посоветовал вам научиться отлаживать и получить для этого подходящую IDE. Таким образом вы сэкономите много времени (и в конечном итоге, денег). Что касается ссылок, которые не отображаются должным образом, я уверен, что если вы отладите, вы пойдете дальше, чем мы, пытаясь понять код с нуля. Удачи! :)
Показать ещё 1 комментарий
1

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

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

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

Просто поместите это в начало файла php.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню