Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: mySQL ja datadumppi

MtJ [23.08.2006 10:33:12]

#

Long time no see... Ajattelin ja pohdiskelin, että kuinka se datadump tehdään tietokannasta ja sitten puuhastelin oman ratkaisuni parin funktion muodossa.

Kaksi eri funktiota, jotka tekevät datadumpin. Toinen hoitaa taulujen sisällön ja toinen hoitaa itse taulut.

Lisäksi funktio Main(), joka puuhastelee kaiutukset ruutuun. Huomaa, että sinulla tulee olla toimiva mySQL-kanta,jotta saat jotakin ulos. Tyhjästä on niin sanotusti paha nyhjästä, eli jos sinulla ei ole mySQL-tietokantaa niin luonnollisesti datadumppikaan ei toimi.

Kutsu funktiota main jossakin kohti ohjelmaasi ja funktiot kaiuttavat ruutuun datadumpin kaikista tauluista. Eli ohjelma tekee CREATE TABLE - lauseet, sekä INSERT INTO -lauseet automaattisesti valittuna olevasta tietokannasta.

<?php

// Funktioiden käyttö funktion Main() sisällä:
function Main() {
    $sql="SHOW TABLES";
    $res=mysql_query($sql);
    while($rw=mysql_fetch_array($res)) {
        $dump.=datadump($rw[0]).'<br>';
        $tauludumppi.=TauluDump($rw[0]);
    }
echo $tauludumppi;
echo $dump;
}


// funktiot

function datadump($t) {
    $res .= "# Dumppi taulusta ".$t." \n".chr(10).'<br>';
    $res .= "# Dumpin pvm : " . date("d.m.Y h:m") ."\n\n".chr(10).'<br><br>';

    $query = mysql_query("select * from ".$t);
    $num_fields = @mysql_num_fields($query);
    $numrow = mysql_num_rows($query);

    while ($rw=mysql_fetch_array($query)) {
        $res .= "INSERT INTO ".$t." VALUES(";
        $j=0;
        while($j<=$num_fields) {
            $res .= "'".$rw[$j]."', ";
            $j++;
        }//while
        $res = substr($res,0, -2);
    $res .= ");\n".chr(10).'<br>';
     }//while
     return $res . "\n\n\n".chr(10);
}//function

function TauluDump($t) {
    $sql="DESCRIBE ".$t;
    $res=mysql_query($sql);
    $ct .= "<br><br># Luo taulu ".$t." <br>";
    $ct .= "CREATE TABLE ".$t." (<br>";
    while($rw=mysql_fetch_array($res)) {
        $ct .= $rw[0].' ';
        $ct .= $rw[1].' ';
        $ct .= $rw[2].' ';
        if($rw[3]!="") {
            $primary = ' PRIMARY key ('.$rw[0].') ';
        }
        if($rw[4]!="") {
            $ct .= " NOT NULL DEFAULT '".$rw[4]."', <br>";
        }
        // auto_increment sarakkeesta 5, jos auto_increment tai jokin muu ekstra on määritelty.
        if($rw[5]!="") {
            $ct.= ' NOT NULL '.$rw[5].', <br>';
        }
        if($rw[3]=="" && $rw[4]=="" && $rw[5]=="") {
            $ct.=", <br>";
        }
    }//while
    $ct .= $primary.') ENGINE=MyISAM CHARACTER SET latin1;';
return $ct;
}//function

?>

ajv [06.09.2006 07:47:20]

#

En nyt antaisi miinusta kovasta yrityksestä, mutta mikäs vika mysqldumpissa on? Ja ehkä kuitenkin tulostaisin nuo dumpit tiedostoon mielummin kuin ruudulle. Siis jos ajatellaan, että kannan koko on edes 50 Mt. Niin ja kuinkakohan paljon dataa PHP antaa tunkea yhteen muuttujaan? Taitaa loppua muisti aika nopeesti kesken :)

MtJ [17.10.2006 09:45:52]

#

No mielikuvitustahan voi käyttää. Itsekin käytän kyseisiä funktioita kirjoittamaan tiedostoon.

mysqldump tekee hyvin joitakin asioita, kuitenkin omasta mielestäni on aina mukavampi, kun on täysi hallinta ohjelman puuhasteluun. Tämä koodi on liitettynä laajempaan kokonaisuuteen, josta dumppiin voidaan poimia esimerkiksi osatauluja yms. Eli dumpata vain osia kannasta tai lähettää vaikkapa emailitse jokin tietty osa taulusta tai tietty taulu suoraan sovelluksen kautta.

MtJ [17.10.2006 10:26:15]

#

Tuosta muistin loppumisesta; Sehän riippuu myös palvelimesta, paljonko dataa scriptin kautta voi käsitellä. Kokorajoitteet ym. rajoittavat tiedon siirtoa tietenkin - toisaalta jos palvelimelle on määritelty kovin tiukat rajat, se ei ole ohjelman/ohjelmoijan vika vaan palveluntarjoajan.

D4_B34M [14.01.2007 18:04:35]

#

"toisaalta jos palvelimelle on määritelty kovin tiukat rajat, se ei ole ohjelman/ohjelmoijan vika vaan palveluntarjoajan."

On se siinä mielessä ohjelmoijan vika jos saman asian saa toimimaan eri koodilla mutta hieman rajoitettuna...
Mielestäny myslidumppi riittää kaikkeen mitä kukaan yleensäkään voi nettisivulla tarvita. Tämä koodi tuntuu aika hyödyttömältä vaikka silti mielenkiintoinen jos haluaa muuten vaan leikkiä.
Hyvä koodi vaikka tuskin kovin käytännöllinen ;)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta