18.10.2009
Таблица, выданная в ответ на SQL-запрос выглядит в текстовом формате так,
как показано на рисунке. Различаться будут только количество столбцов и строк.
Но известно, что подобный текстовый формат не может отобразиться достоверно на
html-странице. Как бы мы не ухищрялись, браузер не отобразит таблицу в удобном для
восприятия виде. Так как на html-страницах для таблиц существуют специальные теги.
Но вручную переносить данные в такие таблицы - каторожный труд. Который я до поры до
времени и проделывал вручную. Это пока таких таблиц было не много. А если их сто и более?
Данный скрипт считывает таблицу SQL из текстового формата автоматически, и записывает
результат в новый файл уже в html-формате! Замечательный помощник для наборщика текстов!
Вышеуказанная таблица например будет выглядеть так:
Field | Type | Null | Key | Default | Extra |
name | char(30) | NO | NULL | ||
second_name | char(30) | YES | NULL | ||
family_name | char(30) | NO | NULL | ||
birth | date | NO | NULL | ||
address | char(150) | NO | unknown | ||
startdate | date | NO | 2002-01-01 | ||
id | smallint(6) | NO | PRI | NULL | auto_increment |
Исходный файл, в который надо поместить SQL-таблицу называется data.txt.
Файл, в который программа помещает результат - таблицу в html-формате,
называется fileOut.txt. Еще один вспомогательный файл для вывода ошибок,
если какой-то файл для чтения или записи не откроется - error.txt.
Все файлы должны находиться в одном каталоге со скриптом.
Небольшие затруднения при написании скрипта создали глобальные переменные.
Обращение к глобальным переменным в PHP несколько отличается от С++. Отличие в деталях.
Обратите внимание на наличие в скрипте двух функций Count1() и Count2(). Первая работает
с глобальными переменными, а вторая с локальными.
PHP в силу своей специфики имеет колоссальное количество специализированных функций для
работы со строками. Программа использует две таких функции - функцию, подсчитывающую
количество вхождений подстроки в строку substr_count(), и функцию strtok(), которая
разбивает строку на подстроки, разделенные заданным по условию разделителем.
<?php
//объявим массивы
$masName = array();
$n=0;
$index = 0;
function Count1($myLine){
global $index;
$index = substr_count($myLine, '+');
return $index;
}
function Count2($myLine){
//global $index;
$index = substr_count($myLine, '+');
return $index;
}
//-----------------------------
// откроем файл для вывода ошибок
$filename = "error.txt";
if(!($errorFile = fopen($filename, "w")))
{
print("'$filename' could not be created\n");
exit;
}
//-----------------------------
// откроем файл для вывода
$filename = "fileOut.txt";
if(!($fileOut = fopen($filename, "w")))
{
fputs($errorFile, "'$filename' could not be created\n" );
exit;
}
//-----------------------------
// откроем файл для чтения
$filename = "data.txt";
if(!($myFile = fopen($filename, "r")))
{
fputs($errorFile, "'$filename' could not be opened\n" );
exit;
}
//-----------------------------
//считаем построчно из файла data.txt в файл fileOut.txt
while(!feof($myFile))
{
//читаем строку из файла
$myLine = fgets($myFile, 255);
//сосчитаем количество плюсов в строке $myLine
if( $index < 1){
$index= Count1($myLine);
}
//если строка содержит "+" то вернуться к началу цикла
$ind= Count2($myLine);
if(0 < $ind){
continue;
}
//разобьем строку и поместим ее в массив пословно
for($token = strtok($myLine, "|");$token != "";$token = strtok("|"))
{
$Temp = "$token";
$masName[$n] = $Temp;
$n++;
}
}//end while
//----------------------------------
$tempo = $index*10;
//выведем шапку
$Temp = "<TABLE WIDTH=\"$tempo\" BORDER=1 CELLSPACING=0 CELLPADDING=0>\n<TR>";
fputs($fileOut,$Temp );
// сосчитаем количество элементов в массиве
$indexLimit = count($masName);
//выведем массив в файл
for($i=0;$i<$indexLimit;$i++)
{
//строка из $index слов
if(0 != ($i+1)%($index) || $i == 0){
fputs($fileOut, "<TD><FONT SIZE =\"1\">$masName[$i]</TD>");
}
//перенос строки
if(0 == ($i+1)%($index) && $i != 0){
fputs($fileOut,"\n</TR>\n<TR>" );
fputs($fileOut, "\n");
}
}//end for
//выведем подвал
$Temp = "</TR>\n</TABLE>\n";
fputs($fileOut,$Temp );
// закроем файлы
fclose($myFile);
fclose($fileOut);
fclose($Errorfile);
?>
Анализ
Суть программы в том, что данные считываются из исходного файла и помещаются в массив,
затем данные из массива перемещаются в новый файл-приемник. При этом предварительно
данные "одеваются" в html-теги.