Может ли кто-нибудь из вас помочь мне понять поведение, которое я получаю при посещении этой страницы?
<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
Судя по вашему коду, возможно, проблемы связаны с подключением 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 затем отправит неполную страницу в качестве файла для загрузки, вместо того, чтобы отображать его как веб-страницу.
Сообщите мне результат на вашем компьютере.
Работает нормально для меня. Кажется, что печатают все ожидаемые строки "Любой старый текст", а также все числа после этого.
Я предполагаю, что это может быть веб-сервер или неправильная конфигурация PHP, но я не могу представить, с чего начать.
Я попробовал, и все работает как ожидалось.
Единственное, что я заметил, это то, что страница составляет около 8 КБ. Есть ли какая-то волшебная конфигурация на вашем веб-сервере (какой веб-сервер вы используете?), Который может быть связан с размером страницы 8 КБ?
Какой веб-сервер вы используете? Apache? Есть ли какие-либо расширения для PHP? Попробуйте поставить flush() после эха, чтобы увидеть, что происходит. Если вы можете показать вам phpinfo(), это может помочь.