Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB58.8430
BTC/USD0.0000
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 04.06.2008, 15:21   #1
Nou
Senior Member
 
Регистрация: 11.07.2007
Сообщений: 2,074
Бабло: $134959
По умолчанию Как разбить дамп?

Вопрос такой.
Есть дамп базы данных, сгенерённый пхпмайадмином, надо его залить на другом сервере в базу. SSHа нету, пхпмайадмином же залить тоже нельзя, нужно чтобы автоматически всё делалось.
Пробую пхп скриптом, но mysql_query жрёт только по одной строке. Разбивал вот так
PHP код:
explode(";\r\n"$dump); 
но это не катит понятно почему. Если в каком-то поле встретится такая же конструкция, еррор возникнет.

Есть идеи, как дамп разбить на запросы?
Nou вне форума  
Старый 04.06.2008, 18:04   #2
Nou
Senior Member
 
Регистрация: 11.07.2007
Сообщений: 2,074
Бабло: $134959
ТС -->
автор темы ТС По умолчанию

из недр пхпмайадмина выдрал

PHP код:
<?php

$pieces 
= array();

$sql file_get_contents("dump.sql");

function 
PMA_splitSqlFile(&$ret$sql$release)
{
    
// do not trim, see bug #1030644
    //$sql          = trim($sql);
    
$sql          rtrim($sql"\n\r");
    
$sql_len      strlen($sql);
    
$char         '';
    
$string_start '';
    
$in_string    FALSE;
    
$nothing      TRUE;
    
$time0        time();

    for (
$i 0$i $sql_len; ++$i) {
        
$char $sql[$i];

        
// We are in a string, check for not escaped end of strings except for
        // backquotes that can't be escaped
        
if ($in_string) {
            for (;;) {
                
$i         strpos($sql$string_start$i);
                
// No end of string found -> add the current substring to the
                // returned array
                
if (!$i) {
                    
$ret[] = array('query' => $sql);
                    return 
TRUE;
                }
                
// Backquotes or no backslashes before quotes: it's indeed the
                // end of the string -> exit the loop
                
else if ($string_start == '`' || $sql[$i-1] != '\\') {
                    
$string_start      '';
                    
$in_string         FALSE;
                    break;
                }
                
// one or more Backslashes before the presumed end of string...
                
else {
                    
// ... first checks for escaped backslashes
                    
$j                     2;
                    
$escaped_backslash     FALSE;
                    while (
$i-$j && $sql[$i-$j] == '\\') {
                        
$escaped_backslash = !$escaped_backslash;
                        
$j++;
                    }
                    
// ... if escaped backslashes: it's really the end of the
                    // string -> exit the loop
                    
if ($escaped_backslash) {
                        
$string_start  '';
                        
$in_string     FALSE;
                        break;
                    }
                    
// ... else loop
                    
else {
                        
$i++;
                    }
                } 
// end if...elseif...else
            
// end for
        
// end if (in string)

        // lets skip comments (/*, -- and #)
        
else if (($char == '-' && $sql_len $i && $sql[$i 1] == '-' && $sql[$i 2] <= ' ') || $char == '#' || ($char == '/' && $sql_len $i && $sql[$i 1] == '*')) {
            
$i strpos($sql$char == '/' '*/' "\n"$i);
            
// didn't we hit end of string?
            
if ($i === FALSE) {
                break;
            }
            if (
$char == '/'$i++;
        }

        
// We are not in a string, first check for delimiter...
        
else if ($char == ';') {
            
// if delimiter found, add the parsed part to the returned array
            
$ret[]      = array('query' => substr($sql0$i));
            
$nothing    TRUE;
            
$sql        ltrim(substr($sqlmin($i 1$sql_len)));
            
$sql_len    strlen($sql);
            if (
$sql_len) {
                
$i      = -1;
            } else {
                
// The submited statement(s) end(s) here
                
return TRUE;
            }
        } 
// end else if (is delimiter)

        // ... then check for start of a string,...
        
else if (($char == '"') || ($char == '\'') || ($char == '`')) {
            
$in_string    TRUE;
            
$nothing      FALSE;
            
$string_start $char;
        } 
// end else if (is start of string)

        
elseif ($nothing) {
            
$nothing FALSE;
        }

        
// loic1: send a fake header each 30 sec. to bypass browser timeout
        
$time1     time();
        if (
$time1 >= $time0 30) {
            
$time0 $time1;
            
header('X-pmaPing: Pong');
        } 
// end if
    
// end for

    // add any rest to the returned array
    
if (!empty($sql) && preg_match('@[^[:space:]][email protected]'$sql)) {
        
$ret[] = array('query' => $sql);
    }

    return 
TRUE;
}

PMA_splitSqlFile($pieces$sql0);

print_r($pieces);

?>
Nou вне форума  
Старый 04.06.2008, 21:36   #4
div72™
Патологоанатом
 
Аватар для div72™
 
Регистрация: 03.04.2007
Сообщений: 253
Бабло: $525
Отправить сообщение для div72™ с помощью ICQ
По умолчанию

+1 за дампер, ни раз выручал.
div72™ вне форума  
Старый 04.06.2008, 22:40   #5
sevian
Senior Member
 
Регистрация: 29.08.2007
Сообщений: 168
Бабло: $1930
Отправить сообщение для sevian с помощью ICQ
По умолчанию

так надо файл построчно читать( fgets ) а не грузить целиком
__________________
Конвертим деньги в куб, продаем электронную музыку, VPN
sevian вне форума