A kid from The Ural's
Вот такая задача у меня есть, что почитать чтобы ее осуществить?
Надо чтобы информация из таблицы MySQL сохранялась в html файл.

@темы: Apache, MySQL, Ссылки

Комментарии
23.01.2008 в 13:54

А точнее?
Какая информация, в каком формате?
Слишком куцая "вводная"
23.01.2008 в 14:02

A kid from The Ural's
Kuroi Kitsune

В таблице, грубо говоря, 4 поля. Надо чтобы информация также сохранялась в виде таблицы (в текстовом формате), и сортировалась по нику (название одного из полей).
23.01.2008 в 14:06

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
А разве нельзя просто написать правильный mysql query (если я не ошибаюсь, сорт там том мона делать) и потом итернуть всё по порядку принтя в table O.o?
23.01.2008 в 14:14

A kid from The Ural's
Itsygo

Нет, так будут отображаться текущие данные из БД. А мне нужен архив, то есть после сохранения все данные из БД будут удаляться, а фаил html служить как архив, того что было когда-то
23.01.2008 в 14:28

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
Нет, так будут отображаться текущие данные из БД. А мне нужен архив, то есть после сохранения все данные из БД будут удаляться, а фаил html служить как архив, того что было когда-то

ну тогда вместo принта, в файл на серваке, проблем-то?

з.ы а почему бы не сделать копию БД в бэкап тейбл?
23.01.2008 в 14:35

A kid from The Ural's
Itsygo

А вот здесь поподробнее :).

Как сделать фаил на серваке? И что аткое бэкап тейбл?
23.01.2008 в 15:06

1. Ты хочешь сохранять резервную копию раз в час/день/неделю/... ?
2. Зачем именно html формат?
23.01.2008 в 15:11

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
>>Как сделать фаил на серваке?

:D поищи тьюториал, должно быть на каждом шагу (думаю какой-нить fopen, fputs, fclose или аналоги)

>>И что аткое бэкап тейбл?

просто копия бд таблицы с содержимым в опр момент.

Скажем, cамый простой вариант - create table <cloned> as select * from <fromtable>


23.01.2008 в 15:36

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Kevin McLean
что почитать -
коротко про mysql
Открываем/создаем файл на сервере
Пишем в файл

То что ты попросил может выглядеть, например, так (не заморачиваясь на шаблонизирование и т.д.):


<?

// Тут идет подключение к mysqlсерверу, выбор БД и т.д.

...
...
...

// Делаем выборку всех данных из таблицы

$res = mysql_query("SELECT * FROM my_table") or die(mysql_error());

$totalResult = "";

// Перебираем все полученные записи

while($row = mysql_fetch_array($res, MYSQL_ASSOC)) {

$resultRow = "";

// Перебираем все элементы в записи (каждый элемент - колонка в базе данных)

foreach ($row as $index=>$value) {
// $index содержит название колонки
$resultRow .= sprintf("\t
<td>%s => %s</td>\n", $index, $value);
}

$totalResult .= sprintf("%s\n", $resultRow);
}

// Открываем файл для жозаписи, т.е. если в нем уже есть что-то, оно не затреться, а новые данные будут добавлены в концец файла

$fd = fopen("file.txt", "a+");

// Записываем сформатированные данные в файл

fputs($fd, sprintf("<table>%s</table>", $totalResult));

// Закрываем файл

fclose($fd);

// Закрываем подключение к БД

mysql_close();



?>





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

23.01.2008 в 17:13

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
FVA,

Встречный вопрос (поскольку сначала пишешь в стринг через .=, а потом в файл ), какой макс размер stringа в php? Всмысле, не возникнут ли проблемы, если (скажем) через 64kb всё упадет?
23.01.2008 в 17:19

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Itsygo Строка выживет пока не упрешься в memory_limit. На самом деле, такая реализация для хоть сколько-то большой базы не желательна. Данный код я привел поросто в качестве примера простейщего решения. =)
23.01.2008 в 17:23

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
>>Itsygo Строка выживет пока не упрешься в memory_limit.

ок, спасибо. эт хорошо.

>>На самом деле, такая реализация для хоть сколько-то большой базы не желательна. Данный код я привел поросто в качестве примера простейщего решения. =)

это понятно, я так, ради интереса спросил, чтобы случайно со стрингами потом не напороться. кстати, ты бы хоть товарищу Kevin McLean комменты в код написал :P
23.01.2008 в 17:55

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Itsygo Да я вон даже начал, а потом чего-то отвлекся. =)))
23.01.2008 в 18:02

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
[php] --- перенес код отсюда наверх ---

PS: [php] - замени потом код в том комменте, пожалуйста
24.01.2008 в 11:43

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
FVA Itsygo Да я вон даже начал, а потом чего-то отвлекся. =)))

другое дело :P
24.01.2008 в 11:51

A kid from The Ural's
FVA

Архив будет выводиться для просмотра. Идея такая в БД копиться информация, потом я сохраняю всю инфу в txt, а всю информацию из БД удаляю. И еще воппрос, так как я буду не один раз сохранять информацию из БД, как сделать чтобы фаил сохранялся каждый раз с новым именем, ну например так: table1.txt, table2.txt... И самое интересное как сделать страницу которая выводила бы весь список фаилов, в виде ссылок, при переходе по которым выводилась информация содержащаяся в них.

Kuroi Kitsune

Сохраняться это будет с произвольной переодичностью. А хтмл, чтобы пользователям сайта удобно было просматривать инфу.
24.01.2008 в 12:56

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Kevin McLean

Почитать:

time()
Работа с каталогами

как сделать чтобы файл сохранялся каждый раз с новым именем

Самый простой способ, в место названия использовать метку времени

$fd = fopen("htmlarchive/".time().".html", "w");



как сделать страницу которая выводила бы весь список файлов

Проще всего сохранять все такие файлы в отдельную папку (в коде несколькими строками выше файлы как раз записываются в папку htmlarchive), а выводить функцией типа этой:

<?
// Открываем папку
$dir = opendir("htmlarchive");
// Перебираем все файлы в папке
while ($file = readdir($dir)) {
// Пропускаем указатели текущего и родительского каталога
if ($file != "." && $file != "..") {
// Выводим ссылку на файл
echo ".$file.">".$file."
\n\r"
;
}
}
?>



PS: [php] - Поправь пожалуйста к том коде вверху теги <td>, <tr> и <table> - там в коде надо открывающий тег < заменить на <



от [php] - поправил)
24.01.2008 в 13:00

Kevin McLean
Самый простой метод, это будет сохранение в файл с именем filename_dd-mm-yy.html
Тогда каждый раз информация будет сохраняться в новый файл.
Листинг директории сделать очень просто.
26.01.2008 в 16:27

A kid from The Ural's
FVA

Попробовл воспользоваться вашим кодом, по какой-то причине скрипт не работает:

<?

$res 
mysql_query("SELECT * FROM test") or die(mysql_error());

$totalResult "";

// Перебираем все полученные записи

while($row mysql_fetch_array($resMYSQL_ASSOC)) {

$resultRow "";

// Перебираем все элементы в записи (каждый элемент - колонка в базе данных)

foreach ($row as $index=>$value) {
// $index содержит название колонки
$resultRow .= sprintf("\t<td>%s => %s</td>\n"$index$value);
}

$totalResult .= sprintf("%s\n"$resultRow);
}

// Открываем файл для жозаписи, т.е. если в нем уже есть что-то, оно не затреться, 

а новые данные будут добавлены в концец файла

$fd 
fopen("home/g/gviragonru/public_html/archive/".time().".html""w+");

// Записываем сформатированные данные в файл

fputs($fdsprintf("<table>%s</table>"$totalResult));

// Закрываем файл

fclose($fd);

?>



Kuroi Kitsune

Спасибо за полезную документацию
26.01.2008 в 18:37

Строка "а новые данные будут добавлены в концец файла" не закомментированна.
Путь "home/g/..." скорее всего не верен. Предполагаю, что он должен выглядеть как "/home/g/..."
26.01.2008 в 22:38

A kid from The Ural's
И все таки нее могу заставить скрипт сохранять фаил в таком виде, в котором мне нужно :(
читать дальше


Сохраняется это все в таком виде
apollo.spaceweb.ru/~gviragonru/archive/12013756...
то есть каждый ряд БД идет друг за другом ;/
А нужно чтобы они шли друг под другом. И еще можно сделать чтобы вверх страницы при сохранении фаила вставлялась коснтрукция
<? include ('header.php'); ?> , а вниз <? include ('footer.php'); ?> ?

26.01.2008 в 23:33

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
каждый ряд БД идет друг за другом

Fix $totalResult .= sprintf("<tr>%s\n</tr>", $resultRow); on line 19

Старайтесь не просто copy-paste того что тут пишут, а сначала прочитайте код, разберитесь - тогда таких проблем не будет.

сделать чтобы вверх страницы при сохранении фаила вставлялась коснтрукция
<? include ('header.php'); ?> , а вниз <? include ('footer.php'); ?>


Еще раз читаем fwrite, fputs и делаем это самостоятельно для закрепление прочитанного. =)
27.01.2008 в 13:51

A kid from The Ural's
FVA

Читаю, и про функцию sprintf читаю. Но мне все равно остается непонятным данный фрагмент кода, что здесь во что преобразуется

$resultRow .= sprintf("\t %s\n", $value);
}
$totalResult .= sprintf("%s\n", $resultRow);
}

Что в данном случае \t и \n?
И как здесь действует %s, если % значит Аргумент не используется. Какой аргумент?


27.01.2008 в 14:43

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Kevin McLean
Что в данном случае \t и \n
\n - перевод строки (шестнадцатеричный код 0A)
\r - возврат каретки (шестнадцатеричный код 0D)
\t - табуляция (шестнадцатеричный код 09)

если % значит Аргумент не используется
% значит аргумент не используется в том случае, если % используется в качестве спецификатора типа, то есть если в формате строки необходимо вывести знак "%", необходимо указывать его как "%%".

<?

echo sprintf("%d %%", 100); // Выведет % 100
echo sprintf("%d %", 100); // Вызовет ошибку

?>

27.01.2008 в 16:35

A kid from The Ural's
FVA

Друг под другом записис заставил идти, а вот
<? include ('header.php'); ?> и <? include ('footer.php'); ?> почему-то не сохраняется


$res = mysql_query("SELECT nick, course, faculty, points FROM test WHERE stat = 'Ученик'") or die(mysql_error());

$totalResult = "";

// Перебираем все полученные записи

while($row = mysql_fetch_array($res, MYSQL_ASSOC)) {

$resultRow = "";

// Перебираем все элементы в записи (каждый элемент - колонка в базе данных)

foreach ($row as $value) {
// $index содержит название колонки
$resultRow .= sprintf("\t<td> %s</td>\n", $value);
}

$totalResult .= sprintf("<tr>%s\n</tr>", $resultRow);
}

// Открываем файл для жозаписи, т.е. если в нем уже есть что-то, оно не затреться, а новые данные будут добавлены в концец файла

$fd = fopen("/home/g/gviragonru/public_html/archive/".time().".php", "w+");

// Записываем сформатированные данные в файл

fputs($fd, sprintf("<? include ('header.php');?><table><tr><td>Ученик</td><td>Курс</td><td>Факультет</td><td>Баллы</td></tr>%s</table>", $totalResult, "<? include ('footer.php'); ?>"));




// Закрываем файл

fclose($fd);




Такие вещи как php коды функция sprintf вообще интерпретировтаь умеет?

27.01.2008 в 17:11

Kevin McLean а ты всё экранируй символом "\" , тогда точно выведет всё что угодно

Расширенная форма

Редактировать

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail