A kid from The Ural's
Вот такая задача у меня есть, что почитать чтобы ее осуществить?
Надо чтобы информация из таблицы MySQL сохранялась в html файл.
Надо чтобы информация из таблицы MySQL сохранялась в html файл.
Какая информация, в каком формате?
Слишком куцая "вводная"
В таблице, грубо говоря, 4 поля. Надо чтобы информация также сохранялась в виде таблицы (в текстовом формате), и сортировалась по нику (название одного из полей).
Нет, так будут отображаться текущие данные из БД. А мне нужен архив, то есть после сохранения все данные из БД будут удаляться, а фаил html служить как архив, того что было когда-то
ну тогда вместo принта, в файл на серваке, проблем-то?
з.ы а почему бы не сделать копию БД в бэкап тейбл?
А вот здесь поподробнее
Как сделать фаил на серваке? И что аткое бэкап тейбл?
2. Зачем именно html формат?
>>И что аткое бэкап тейбл?
просто копия бд таблицы с содержимым в опр момент.
Скажем, cамый простой вариант - create table <cloned> as select * from <fromtable>
что почитать -
коротко про 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("
}
// Открываем файл для жозаписи, т.е. если в нем уже есть что-то, оно не затреться, а новые данные будут добавлены в концец файла
$fd = fopen("file.txt", "a+");
// Записываем сформатированные данные в файл
fputs($fd, sprintf("<table>%s</table>", $totalResult));
// Закрываем файл
fclose($fd);
// Закрываем подключение к БД
mysql_close();
?>
Но если решать проблему архивирования базы данных, то этот вариант делеко не лучший.
Вообще, вариантов архивирования очень много, поэтому в первую очередь нужно определиться каким образом данный архив будет потом использоваться - выводиться для просмотра, парсится скриптами или просто лежать "на всякий случай", чтобы потом можно было востановить данные в mysql?
Встречный вопрос (поскольку сначала пишешь в стринг через .=, а потом в файл ), какой макс размер stringа в php? Всмысле, не возникнут ли проблемы, если (скажем) через 64kb всё упадет?
ок, спасибо. эт хорошо.
>>На самом деле, такая реализация для хоть сколько-то большой базы не желательна. Данный код я привел поросто в качестве примера простейщего решения. =)
это понятно, я так, ради интереса спросил, чтобы случайно со стрингами потом не напороться. кстати, ты бы хоть товарищу Kevin McLean комменты в код написал :P
PS: [php] - замени потом код в том комменте, пожалуйста
другое дело :P
Архив будет выводиться для просмотра. Идея такая в БД копиться информация, потом я сохраняю всю инфу в txt, а всю информацию из БД удаляю. И еще воппрос, так как я буду не один раз сохранять информацию из БД, как сделать чтобы фаил сохранялся каждый раз с новым именем, ну например так: table1.txt, table2.txt... И самое интересное как сделать страницу которая выводила бы весь список фаилов, в виде ссылок, при переходе по которым выводилась информация содержащаяся в них.
Kuroi Kitsune
Сохраняться это будет с произвольной переодичностью. А хтмл, чтобы пользователям сайта удобно было просматривать инфу.
Почитать:
time()
Работа с каталогами
как сделать чтобы файл сохранялся каждый раз с новым именем
Самый простой способ, в место названия использовать метку времени
как сделать страницу которая выводила бы весь список файлов
Проще всего сохранять все такие файлы в отдельную папку (в коде несколькими строками выше файлы как раз записываются в папку htmlarchive), а выводить функцией типа этой:
// Открываем папку
$dir = opendir("htmlarchive");
// Перебираем все файлы в папке
while ($file = readdir($dir)) {
// Пропускаем указатели текущего и родительского каталога
if ($file != "." && $file != "..") {
// Выводим ссылку на файл
echo ".$file.">".$file."
\n\r";
}
}
?>
PS: [php] - Поправь пожалуйста к том коде вверху теги <td>, <tr> и <table> - там в коде надо открывающий тег < заменить на <
от [php] - поправил)
Самый простой метод, это будет сохранение в файл с именем filename_dd-mm-yy.html
Тогда каждый раз информация будет сохраняться в новый файл.
Листинг директории сделать очень просто.
Попробовл воспользоваться вашим кодом, по какой-то причине скрипт не работает:
$res = mysql_query("SELECT * FROM test") 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("home/g/gviragonru/public_html/archive/".time().".html", "w+");
// Записываем сформатированные данные в файл
fputs($fd, sprintf("<table>%s</table>", $totalResult));
// Закрываем файл
fclose($fd);
?>
Kuroi Kitsune
Спасибо за полезную документацию
Путь "home/g/..." скорее всего не верен. Предполагаю, что он должен выглядеть как "/home/g/..."
читать дальше
Сохраняется это все в таком виде
apollo.spaceweb.ru/~gviragonru/archive/12013756...
то есть каждый ряд БД идет друг за другом ;/
А нужно чтобы они шли друг под другом. И еще можно сделать чтобы вверх страницы при сохранении фаила вставлялась коснтрукция
<? include ('header.php'); ?> , а вниз <? include ('footer.php'); ?> ?
Fix $totalResult .= sprintf("<tr>%s\n</tr>", $resultRow); on line 19
Старайтесь не просто copy-paste того что тут пишут, а сначала прочитайте код, разберитесь - тогда таких проблем не будет.
сделать чтобы вверх страницы при сохранении фаила вставлялась коснтрукция
<? include ('header.php'); ?> , а вниз <? include ('footer.php'); ?>
Еще раз читаем fwrite, fputs и делаем это самостоятельно для закрепление прочитанного. =)
Читаю, и про функцию sprintf читаю. Но мне все равно остается непонятным данный фрагмент кода, что здесь во что преобразуется
$resultRow .= sprintf("\t
}
$totalResult .= sprintf("%s\n", $resultRow);
}
Что в данном случае \t и \n?
И как здесь действует %s, если % значит Аргумент не используется. Какой аргумент?
Что в данном случае \t и \n
\n - перевод строки (шестнадцатеричный код 0A)
\r - возврат каретки (шестнадцатеричный код 0D)
\t - табуляция (шестнадцатеричный код 09)
если % значит Аргумент не используется
% значит аргумент не используется в том случае, если % используется в качестве спецификатора типа, то есть если в формате строки необходимо вывести знак "%", необходимо указывать его как "%%".
echo sprintf("%d %%", 100); // Выведет % 100
echo sprintf("%d %", 100); // Вызовет ошибку
?>
Друг под другом записис заставил идти, а вот
<? include ('header.php'); ?> и <? include ('footer.php'); ?> почему-то не сохраняется
$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 вообще интерпретировтаь умеет?