печать бессмысленных строк текста препятствует загрузке страницы, но слишком много строк не позволяют получить все записи в таблице MySQL. Почему?

0

Может ли кто-нибудь из вас помочь мне понять поведение, которое я получаю при посещении этой страницы?

<html>

    <body>

    <?php
        $liendb = mysql_connect("localhost","","");

        mysql_select_db ("test");
        for($i = 0; $i < 418; ++$i)
        {
            echo("Any old text<br />");
        }


        $resultatSQL = mysql_query("SELECT uid FROM nombres ORDER BY uid");

        while($tab = mysql_fetch_array($resultatSQL, MYSQL_ASSOC))

        {
            echo("<p>".$tab['uid']."</p>");
            echo("<br />\n");

        }

        mysql_close();

    ?>

    </body>
</html>

Я экспортировал таблицу mysql, этот пример основан на том, что мы можем работать с одной и той же таблицей. Вот она:

-- phpMyAdmin SQL Dump
-- version 3.2.0.1
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 06-01-2010 a las 21:49:50
-- Versión del servidor: 5.1.37
-- Versión de PHP: 5.3.0

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Base de datos: `test`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `nombres`
--

CREATE TABLE IF NOT EXISTS `nombres` (
  `uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=43 ;

--
-- Volcar la base de datos para la tabla `nombres`
--

INSERT INTO `nombres` (`uid`) VALUES
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(8),
(9),
(10),
(11),
(12),
(13),
(14),
(15),
(16),
(17),
(18),
(19),
(20),
(21),
(22),
(23),
(24),
(25),
(26),
(27),
(28),
(29),
(30),
(31),
(32),
(33),
(34),
(35),
(36),
(37),
(38),
(39),
(40),
(41),
(42);

В теории я считаю, что эта страница должна печатать 418 строк "Любой старый текст", а затем печатать все записи табличных "номб", поэтому номера от 1 до 42. На практике это происходит. Но если я изменю это магическое число, 418, проблемы случаются.

Если я использую число меньше 418, firefox предлагает загрузить страницу вместо того, чтобы просто показывать ее мне. Если я ее загружу, я получаю пустой файл.

Если я использую число больше 418, я не получаю все записи в таблице "номбы". Например, когда я использую 419, я получаю только числа от 1 до 41. Когда я использую 420, я получаю только числа от 1 до 40. И так до 454, где я получаю только номер 1. Остальная часть страницы, все следующее числа, усекаются, включая теги закрытия и html-теги.

Если я использую 455 или более, я не получаю никаких чисел!

Мои вопросы:

Кто-нибудь еще может воспроизвести это поведение? Как вы могли объяснить это поведение?

Сервер, который я использую, - apache (на самом деле xampp) Я напечатал phpinfo() и попросил firefox сохранить результирующую страницу. Здесь она сжата. www.angelfire.com/planet/shawninder/phpinfo.zip

  • 0
    Не могли бы вы переименовать вопрос? Вы, вероятно, получите больше ответов, если у вас есть более значимый заголовок.
  • 0
    Когда вы используете число 418 или больше, что находится в источнике страницы, как видно из вашего браузера? Усечено ли это для устранения закрывающих тегов BODY и HTML? Полученная страница всегда имеет одинаковый размер?
Показать ещё 2 комментария
Теги:

4 ответа

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

Судя по вашему коду, возможно, проблемы связаны с подключением mysql. Вы всегда должны проверить, было ли соединение mysql успешно или неудачно, прежде чем использовать его. Попробуйте переписать свой код следующим образом:

<html>
    <body>
    <?php
        //open connection
        $liendb = mysql_connect("localhost","","");
        if ( ! $liendb )
        {
          die('Could not connect: ' . mysql_error());
        }

        //select database
        $select_db = mysql_select_db ("test", $liendb);
        if ( ! $select_db )
        {
          die ("Failed to do select the database: ' . mysql_error());
        }

        //print 'magic' lines
        for($i = 0; $i < 418; ++$i)
        {
            echo("Any old text<br />");
        }

        //get table content
        $resultatSQL = mysql_query("SELECT uid FROM nombres ORDER BY uid", $liendb);
        if ( ! $resultatSQL )
        {
          die('Invalid query: ' . mysql_error());
        }

        //process table content
        while($tab = mysql_fetch_array($resultatSQL, MYSQL_ASSOC))
        {
            echo("<p>".$tab['uid']."</p>");
            echo("<br />\n");
        }
        mysql_close($liendb);
    ?>
    </body>
</html>

С помощью этого кода, если произошла какая-либо ошибка, связанная с подключением mysql, вы получите сообщение об ошибке, вместо этого оно будет терпеть неудачу. Возможно, это сделает php-модуль при сбое Apache, поэтому процесс умер досрочно и apache затем отправит неполную страницу в качестве файла для загрузки, вместо того, чтобы отображать его как веб-страницу.

Сообщите мне результат на вашем компьютере.

  • 0
    Я попробовал ваш код и получил одно предупреждение: --- Предупреждение: Неизвестно: 1 набор результатов не освобожден. Используйте mysql_free_result для освобождения результирующих наборов, которые были запрошены с помощью mysql_query () в Unknown в строке 0 --- Но, что еще лучше, проблема, похоже, прекратилась! Независимо от того, сколько ненужных строк я печатаю, я получаю все записи таблицы! Я точно не знаю, какая часть вашего кода решила проблему, но я постараюсь выяснить это позже. Большое спасибо в любом случае! и кстати, вы знаете, что это значит, чтобы освободить наборы результатов?
  • 0
    Что ж, после пары тестов я обнаружил, что часть вашего кода, которая решила мою проблему, - это добавление $ liendb в оператор mysql_close ... Как вы думаете, вы могли бы объяснить это мне? Потому что, честно говоря, я не понимаю, почему это утверждение влияет на то, что происходит раньше в коде ...
Показать ещё 1 комментарий
0

Работает нормально для меня. Кажется, что печатают все ожидаемые строки "Любой старый текст", а также все числа после этого.

Я предполагаю, что это может быть веб-сервер или неправильная конфигурация PHP, но я не могу представить, с чего начать.

  • 0
    Вы говорите, что это работает хорошо. Вы пытались изменить номер (418) на что-то другое?
  • 0
    Да, работает для всех чисел, которые я пробовал. Я пробовал различные варианты, такие как 1, 200, 1000, все в порядке.
0

Я попробовал, и все работает как ожидалось.

Единственное, что я заметил, это то, что страница составляет около 8 КБ. Есть ли какая-то волшебная конфигурация на вашем веб-сервере (какой веб-сервер вы используете?), Который может быть связан с размером страницы 8 КБ?

  • 0
    Понятия не имею .. Но я добавил результаты phpinfo в свой оригинальный вопрос, может быть, вы бы узнали такую конфигурацию?
0

Какой веб-сервер вы используете? Apache? Есть ли какие-либо расширения для PHP? Попробуйте поставить flush() после эха, чтобы увидеть, что происходит. Если вы можете показать вам phpinfo(), это может помочь.

  • 0
    Apache, на самом деле это xampp. Я редактировал это в моем оригинальном вопросе. Я также добавил результат phpinfo .. Где вы предлагаете добавить flush? Первое эхо или второе? или оба?
  • 0
    Я добавил флеш после каждого эха, похоже, ничего не меняется ..

Ещё вопросы

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