Autor Zpráva
Cakewalk
Profil
Dobrý den,
zálohuji databázi scriptem:

if($tables == '*')
    {
        $tables = array();
        $result = mysql_query('SHOW TABLES');
        while($row = mysql_fetch_row($result))
        {
            $tables[] = $row[0];
        }
    }
    else
    {
        $tables = is_array($tables) ? $tables : explode(',',$tables);
    }
    

    foreach($tables as $table)
    {
        $result = mysql_query('SELECT * FROM '.$table);
        $num_fields = mysql_num_fields($result);
        
        $return.= 'DROP TABLE IF EXISTS'.$table.';';
        $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
        $return.= "\n\n".$row2[1].";\n\n";
        
        for ($i = 0; $i < $num_fields; $i++) 
        {
            while($row = mysql_fetch_row($result))
            {
                $return.= 'INSERT INTO '.$table.' VALUES(';
                for($j=0; $j<$num_fields; $j++) 
                {
                    $row[$j] = addslashes($row[$j]);
                    $row[$j] = ereg_replace("\n","\\n",$row[$j]);
                    if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
                    if ($j<($num_fields-1)) { $return.= ','; }
                }
                $return.= ");\n";
            }
        }
        $return.="\n\n\n";

na výstupu pak dostanu tabulku např.:

INSERT INTO `ap_access` VALUES('1','1','1','1','1','1');
INSERT INTO `ap_access` VALUES('1','2','1','1','1','1');
INSERT INTO `ap_access` VALUES('1','3','1','1','1','1');
INSERT INTO `ap_access` VALUES('1','4','1','1','1','1');
INSERT INTO `ap_access` VALUES('1','5','1','1','1','1');
INSERT INTO `ap_access` VALUES('1','6','1','1','1','1');
INSERT INTO `ap_access` VALUES('1','7','1','1','1','1');

atd.

Potřeboval bych ale výstup:

INSERT INTO `ap_access` VALUES
('1','1','1','1','1','1'),
('1','2','1','1','1','1'),
('1','3','1','1','1','1'),
('1','4','1','1','1','1'),
('1','5','1','1','1','1'),
('1','6','1','1','1','1'),
('1','7','1','1','1','1'),
('1','8','1','1','1','1'),
('1','9','1','1','1','1'),

atd.

Prosím jen nakopněte. Díky
nethor
Profil
$return.= 'INSERT INTO '.$table.' VALUES
přesuň před
while($row = mysql_fetch_row($result))
(přibližně, netestoval jsem.)


PS:
místo $return.=
by bylo šikovnější použít $return[]= v kombinaci s implode().
Cakewalk
Profil
Díky za reakci. Tohle jsem zkoušel, ale pak mi to zapíše i INS..... u tabulky bez obsahu. Toho se pak nemůžu zbavit. Nemůžu přijít na adekvátní podmínku.
nethor
Profil
Řešil bych to takhle nějak:
$radky = array();
$export = "" ;

while($row = mysql_fetch_row($result)) { // cyklus řádků 
    $hodnoty = array();
    foreach ($row as $key=>$value) {    // cyklus hodnot v řádku 
        $value = $value;     // escape a potřebné úpravy
        $hodnoty[] = $value  ;
    }
    $radky[] = "(" .implode(",", $hodnoty) . ")"; 
}

if (count($radky) > 0) {
    $export = "INSERT INTO `ap_access` VALUES ".implode(",\n", $radky);
}
preca1
Profil
Cakewalk:
Nemůžu přijít na adekvátní podmínku.
Vždyť sis sám odpověděl o větu dřív:
u tabulky bez obsahu“ => Jestli tabulka má nějaký obsah...
peta
Profil
$export = "INSERT INTO `ap_access` VALUES ".implode(",\n", $radky);
To neni uplne nejlepsi reseni, php ma omezenou pamet pro sql dotaz. Mozna bych to orezal po 100 radcich pro jeden insert.
Tori
Profil
Cakewalk:
Pokud budete mít hodně velké tabulky (řádově desítky MB), tak by bylo paměťově šetrnější rovnou posílat data do souboru (sekvenční zápis, fwrite) a po ukončení exportu pracovat s tím souborem.
Cakewalk
Profil
Peta a Toti: přesně tohle řeším. Vše si exportuji do souboru, ale i tak má soubor příliš velikou velikost pro následný export přes PHPMYADMIN. Jak píše PETA, chtěl bych INSERT oříznout např. po 100 řádcích. Tedy např.:

INSERT INTO `ap_access` VALUES
('1','1','1','1','1','1'),
('1','2','1','1','1','1'),
('1','3','1','1','1','1'), 
atd.
INSERT INTO `ap_access` VALUES
('1','100','1','1','1','1'),
('1','101','1','1','1','1'),
('1','102','1','1','1','1'),
atd.

a samozřejmě, když není obsah, INSERT se nevypíše.

Aktuálně mi to vypíše.
INSERT INTO `ap_access` VALUES ('1','1','1','1','1','1'),
INSERT INTO `ap_access` VALUES ('1','2','1','1','1','1'),
INSERT INTO `ap_access` VALUES ('1','3','1','1','1','1'), 

případně jsem si to rozdělil pro celou tabulku, ale vypíše mi to i prázdné
INSERT INTO `ap_access` VALUES
('1','1','1','1','1','1'),
('1','2','1','1','1','1'),
('1','3','1','1','1','1'), 
Tori
Profil
Cakewalk:
U PMA se dá nastavit složka, ze které se importují .sql soubory bez omezení datové velikosti. Nevím, jestli máte přístup k nastavení PMA, nebo jestli by to byli na hostingu ochotní nastavit. Jinak asi rozdělit do několika souborů.
Cakewalk
Profil
To právě nemůžu. Snažím se spíše dost stejnou podobu zálohy, jako mi uloží PHPMYADMIN sám při exportu.
nethor
Profil
Tori:
PMA si může nainstalovat i sám, ale je to dost těžkopádná obluda. :-)
Osobně používám Adminer www.adminer.org/.
peta
Profil
phpmyadmin, kdyz nejde importovat velky soubor, tak vypise hlasku s odkazem na bigdump.php, ktery to umi.
Cakewalk
Profil
peta: to ořezání po 100 řádcích mne zajímá
Cakewalk
Profil
Našel by se někdo, kdo ví, jak zápis INSER... rozdělit po např. 100 řádcích?
ts_istudio
Profil
Cakewalk:
Našel by se někdo, kdo ví, jak zápis INSER... rozdělit po např. 100 řádcích?

Použij nethorův skript a počítej průchody uvnitř toho while. Po každé stovce ukonči jeden INSERT, začni další a vynuluj počítadlo.
nethor
Profil
Nějak takhle, netestováno:

$radky = array();
$export = array();
$i = 0; 
while($row = mysql_fetch_row($result)) { // cyklus řádků 
    $hodnoty = array();
    foreach ($row as $key=>$value) {    // cyklus hodnot v řádku 
        $value = $value;     // escape a potřebné úpravy
        $hodnoty[] = $value  ;
    }
    $radky[] = "(" .implode(",", $hodnoty) . ")"; 

    if($i++ % 100 == 0) {
    $export[] = "INSERT INTO `ap_access` VALUES ".implode(",\n", $radky);
    $radky = array();
    }
    
}

echo implode("\n", $export);



Jestli chceš ale exportovat i strukturu tabulek vč. indexů at.. , poohlédni se raději po nějakém hotovém řešení.
Struktura je daleko komplikovanější.
ts_istudio
Profil
nethor:
Nechybí na 10. řádku za závorkou čárka?
juriad
Profil
ts_istudio:
Ne, ta čárka se tam přidá během implodu na řádce 13.
ts_istudio
Profil
juriad:
aha, pardon, tam jsem ji přehlídl.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0