Jump to content
  • 0

CSV бэкапер базы данных


vvsh
 Share

Question

Добрый всем день.

Написал тут бэкапер, но происходит следующее:

в первый файл пишет содержание первой таблицы...

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

Вот код:

<?
$tables_list = mysql_list_tables("vvsh");
while($row2 = mysql_fetch_row($tables_list)) {
$table_name = $row2[0];
$fields = mysql_list_fields("vvsh",$table_name);
$columns = mysql_num_fields($fields);
$result = mysql_query("SELECT * FROM $table_name");
while($row = mysql_fetch_array($result)) {
$i2='1';
while($i2<$columns) {
$field = mysql_field_name($result,$i2);
$text .= "$row[$field]";
if($i2<$columns-1) $text .= "|";
$i2++;
}
$text .= "\n\r";
}
$file = fopen("$table_name.txt","w+");
fwrite($file,$text);
}
?>

Заранее спасибо

Edited by vvsh
Link to comment
Share on other sites

22 answers to this question

Recommended Posts

  • 0

$text очистить нужно.

$tables_list = mysql_list_tables("vvsh");

while($row2 = mysql_fetch_row($tables_list)) {
$text = '';
$table_name = $row2[0];
$fields = mysql_list_fields("vvsh",$table_name);
$columns = mysql_num_fields($fields);
$result = mysql_query("SELECT * FROM $table_name");

while($row = mysql_fetch_array($result)) {
$i2='1';
while($i2<$columns) {
$field = mysql_field_name($result,$i2);
$text .= "$row[$field]";
if($i2<$columns-1) $text .= "|";
$i2++;
}
$text .= "\n\r";
}
$file = fopen("$table_name.txt","w+");
fwrite($file,$text);
}

Link to comment
Share on other sites

  • 0

тут при бэкапе возникла проблема, если вот такие данные в базе:

|id||name ||text|

|1 ||35235||3253(перевод строки)23423|

То в бэкапе выглядит это так

1|35235|3253

23423

а надо 1|35235|3253(замененный перенос)23423

Вот как сделать правильно чтобы переводы строк, заменялись на какие-нибудь знаки?

Edited by vvsh
Link to comment
Share on other sites

  • 0
да, все заменяет,точнее добавляет просто знак, но переводы остаются всеравно...

перед всеми спец символами форматирования строк такими как например \n, \t, \r надо добавить еще один обратный слэшь: \\n, \\t, \\r. тогда будет пониматься что это обратная слэшь + буква. такую замену можно осуществить тем же str_replace() или preg_replace(). соответственно когда осуществляется импорт бэкапа надо делать все наоборот. :)

регуляркой, имхо, удобнее, можно в качестве входных параметров поиска и замены использовать массивы.

Link to comment
Share on other sites

  • 0

дело в том, что при бэкапе я просто беру содержимое базы, оно там так:

———--

1244

124125

2352352

235

———--

И при обработке так же в файл заносится, вот как мне заменить именно эти переносы?

и зачем оно нужно?

что нужно, бэкапер, или замена переноса?

если бекапер, то он для админки нужен, чтобы не лезть во всякие phpmyadmin'ы...

а замена, просто я хочу чтобы бэкап был таким:

———————————————————--

12|124|32532\n235235|3523523|3523523|325235

13|124|325346235235|34743523|356585623|33473435

———————————————————--

а не таким:

———————————————————--

12|124|32532

235235|3523523|3523523|325235

13|124|325346235235|34743523|356585623|33473435

———————————————————--

Link to comment
Share on other sites

  • 0
А чем phpMyAdmin не угодил?

если нужно бекапить базу воспользуйся Sypex Dumper'om!

phpmyadmin слишком громоздок.

sypex dumper не умеет csv бэкапы делать.

Бить за такое. До потери сознания. А когда в себя придешь, еще бить.

а что тут такого тебе не понравилось?

Link to comment
Share on other sites

  • 0

вот код, делающий аналогичные действия:

while($table_name = mysql_fetch_row($tables_list)) {
$text = '';
$result = mysql_query("SELECT * FROM ".$table_name[0]);
while($row = mysql_fetch_row($result)) {
$text .= implode('|', $row);
}
file_put_contents($table_name[0].".txt", $text);
}

Говоря «аналогичный», я имею виду что он точно также как и твой подвржен уязвимости, когда в одном из полей встретится символ «|». 8 строчек вместо 20, и выполняться будет раза в 3-4 быстрее.

а теперь разберем твой говнокод. Я постараюсь не материться.

$fields = mysql_list_fields("vvsh",$table_name);
$columns = mysql_num_fields($fields);

Зачем тебе поля выбирать? бредишь.

 $i2='1';

Ты присваевашь число. ЧИСЛО. Зачем ты преобразуеш его в строку?

$field = mysql_field_name($result,$i2);

У тебя же уже есть массив со значениями и ключами! Почему ты берешь ключи черт знает откуда?

 $text .= "$row[$field]";

Ты присваиваешь одной переменной значение другой. Зачем ты перед этим в строку преобразуешь?

fwrite($file,$text);	
}

Файл после тебя пушкин будет закрывать?

То в бэкапе выглядит это так

1|35235|3253

23423

а надо 1|35235|3253(замененный перенос)23423

Ты разве не сам ответил на свой вопрос? Тебе нужен замененный перенос! Вот и заменяй. Как логично, правда?

Link to comment
Share on other sites

  • 0
Твой скрипт - мне вместо нормальной работы, все данные пихает в одну строку, потом после каждой строки пишет id.

Ну прости, не тестировал. Домашнее задание — добавить перенос строк в конце.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy