Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: TextDataBase

Sivun loppuun

D.J-Dew [11.03.2005 16:07:51]

#

Yksinkertainen tekstitietokanta. Ainakin itsellä tuli tarpeeseen kun ei ollut MySQL:ää saatavilla, tosin nyt sellainen löytyy...

functions.php

<?php

$polku = "/home/käyttäjä/kanta/"; # Hakemisto, johon kannat tallennetaan palvelimella. "/"-merkki loppuun
# ja chmodit 777 kans tolle hakemistolle


# Luo uuden tietokannan. Parametrit: Tietokannan nimi
function tdb_create_db( $nimi ) {
    global $polku;
    if( @is_dir( $polku.$nimi ) ) # Jos kansio on jo olemassa,
        die( "<b>Error:</b> Can't create db. Db <b>".$nimi."</b> already exists" ); # heitetään errori
    elseif( @mkdir( $polku.$nimi,0777 ) ) # Luodaan uusi kansio, jos oikeudet riittävät,
        return true;
    else
    die( "<b>Error:</b> Can't create db. Permission denied." ); # muuten errori.
}


# Poistaa tietokannan. Parametrit: Tietokannan nimi
function tdb_delete_db( $nimi ) {
    global $polku;
    if( !@is_dir( $polku.$nimi ) ) # Jos kansiota ei ole,
        die( "<b>Error:</b> Can't delete db. Db <b>".$nimi."</b> not exists" ); # heitetään errori,
    elseif( @unlink( $polku.$nimi ) ) # jos kansio on olemassa, poistetaan se
        return true;
    else # Jos poistaminen ei onnistunut,
        return false; # palautetaan false.
}


# Valitsee tietokannan. Parametrit: Tietokannan nimi
function tdb_select_db( $nimi ) {
    global $polku;
    if( tdb_db_exists( $nimi ) ) # Jos tietokanta on olemassa,
        return $polku.$nimi.'/'; # "valitaan" se,
    else # muuten,
        die( "<b>Error:</b> Can't select db. Db <b>".$nimi."</b> not exists" ); # heitetään errori.
}


# Kertoo, onko tietokantaa olemassa. Parametrit: Tietokannan nimi
function tdb_db_exists( $nimi ) {
    global $polku;
    if( @is_dir( $polku.$nimi ) ) # Jos kansio on olemassa,
        return true; # palautetaan true,
    else # jos ei,
        return false; # palautetaan false.
}


# Palauttaa koko sarakkeen taulukkona(array). Parametrit: Sarakkeen nimi, Valittu taulu
function tdb_get_col( $sarake, $nimi ) {
    @include( $nimi.".tdb" );
    if( $solu && $solu[$sarake] ) # Jos sarake on olemassa,
        return $solu[$sarake]; # palautetaan se taulukkona (array)
}


# Palauttaa rivin/rivit taulukkona(array). Parametrit: Rivinumero(n/*), Valittu taulu, Ehdot(esim. "kaupunki == espoo")
function tdb_get_rows( $id, $nimi, $ehdot = false ) {
    @include( $nimi.".tdb" );
    if( $solu ) {
        foreach ( $solu as $vara => $ar1 ) {
            foreach ( $ar1 as $i => $vara2 ) {
                if( $i == $id || $id == "*" ) {
                    if( $ehdot ) { # Jos on ehdot,
                        $ehdot1 = explode( " == ", $ehdot ); # hajotetaan ne "==" merkin kohdalta
                        if( strtolower( $solu[$ehdot1[0]][$i] ) == strtolower( $ehdot1[1] ) ) # Jos solun arvo on sama kuin ehto,
                            $col[$i][$vara] = stripslashes( str_replace( "&lt;_br_&gt;","<br />",htmlspecialchars( $solu[$vara][$i] ) ) );
                            # lisätään se uuteen taulukkoon.
                    }
                    else { # Jos ei ole ehtoja,
                        $col[$i][$vara] = stripslashes( str_replace( "&lt;_br_&gt;","<br />",htmlspecialchars( $solu[$vara][$i] ) ) );
                        # lisätään kaikki solut uuteen taulukkoon
                    }
                }
            }
        }
        if( $col ) {
            $lll=0;
            foreach ( $col as $val ) { # Järjestetään taulukko
                $col1[$lll] = $val;
                $lll++;
            }
            if( count( $col1 ) == 1 ) # Jos vain yksi tulos,
                return $col1[0]; # palautetaan tavallinen taulukko,
            else # muuten,
                return $col1; # palautetaan moniulotteinen taulukko.
        }
        else {
            return false;
        }
    }
    else
        return false;
}


# Kirjoittaa tietokantaan. Tiedot voi syöttää myös taulukkona(array). Parametrit: Kirjoitettava data, Sarake/Sarakkeet, Valittu taulu
function tdb_put( $data, $sarake, $nimi ) {
    if( file_exists( $nimi.".tdb" ) ) {
        include( $nimi.".tdb" );
        $id = tdb_count_rows( $nimi ); # Lasketaan uusi id uudelle riville
        if( is_array( $data ) && is_array( $sarake ) ) { # Jos kirjoitettava data ja sarake ovat taulukoita
            $data1 = array(); # Luodaan uusi taulukko
            $sarake1 = array(); # Ja toinen sellainen
            foreach ( $data as $tmp ) { # luupataan kirjoitettava data
                $lask++;
                $data1[$lask] = stripslashes( str_replace( array( "\r\n", "\n" ), "&lt;_br_&gt;",$tmp ) );
            }
            $lask = 0;
            foreach ( $sarake as $tmp ) { # luupataan sarakkeet
                $lask++;
                $sarake1[$lask] = $tmp;
            }
            $lask = 0;
            foreach( $data1 as $tmp ) { # luupataan sarakkeet ja data yhteen
                $lask++;
                $solu[$sarake1[$lask]][$id] = $data1[$lask];
            }
        }
        else { # Jos tietoja ei ole annettu taulukkona
            $solu[$sarake][$id] = stripslashes( str_replace( array( "\r\n", "\n" ), "&lt;_br_&gt;",$data ) );
            # Kirjoitetaan riville vain yksi solu
        }

        $fp = fopen( $nimi.".tdb", "w" ); # avataan tiedosto
        flock( $fp, LOCK_EX ); # Lukkoon
        fwrite( $fp, "<?php\n\n" ); # Kirjotetaan php-alkutagi tiedostoon
        fwrite( $fp, "\$solu = ".var_export( $solu,true ) ); # Kirjotetaan kaikki tiedot tiedostoon
        fwrite( $fp, "\n?>" ); # Kirjotetaan php-lopputagi tiedostoon
        flock( $fp, LOCK_UN ); # lukko auki
        fclose( $fp ); # Suljetaan tiedosto
    }
    else { # Ja jos koko tiedostoa ei ole olemassa, heitetään errori
        $deebee = explode( "/", $kanta );
        die( "<b>Error:</b> Can't write to table. Table <b>".$nimi."</b> not exists <b>in db ".$deebee[count($deebee)-1]."</b>" );
    }
}



# Luo uuden taulun tietokantaan. Parametrit: Taulun nimi, Avattu tietokanta
function tdb_create_table( $nimi, $kanta ) {
    if( !file_exists( $kanta.$nimi.".tdb" ) ) { # Jos tiedostoa ei löydy,
        touch( $kanta.$nimi.".tdb" ); # luodaan sellainen
        chmod( $kanta.$nimi.".tdb", 0777 ); # ja oikeudet kuntoon
    }
    else { # Jos tiedosto on olemassa,
        $deebee = explode( "/", $kanta );
        die( "<b>Error:</b> Can't create table. Table <b>".$nimi."</b> already exists <b>in db ".$deebee[count($deebee)-1]."</b>" ); # heitetään errori.
    }
}



# Poistaa taulun tietokannasta. Parametrit: Taulun nimi, Avattu tietokanta
function tdb_delete_table( $nimi, $kanta ) {
    if( @unlink($kanta.$nimi.".tdb" ) ) { # Yritetään poistaa tiedosto
        return true;
    }
    else { # Jos ei onnistunut,
        $deebee = explode( "/", $kanta );
        die( "<b>Error:</b> Can't delete table. Table <b>".$nimi."</b> not exists <b>in db ".$deebee[count($deebee)-1]."</b>" ); # heitetään errori.
    }
}


# Valitsee taulun tietokannasta. Parametrit: Taulun nimi, Valittu tietokanta
function tdb_select_table( $nimi, $kanta ) {
    if( @is_file( $kanta.$nimi.".tdb" ) ) { # Jos tiedosto löytyy,
        return $kanta.$nimi; # "valitaan" se
    }
    else { # Muuten,
        $deebee = explode ("/", $kanta );
        die( "<b>Error:</b> Can't select table. Table <b>".$nimi."</b> not exists <b>in db ".$deebee[count($deebee)-1]."</b>" ); # Heitetään errori. x)
    }
}


# Kertoo onko taulua olemassa tietokannassa. Parametrit: Taulun nimi, Valittu tietokanta
function tdb_table_exists( $nimi, $kanta ) {
    if( file_exists( $kanta.$nimi.".tdb" ) ) { # Jos tiedosto löytyy
        return true; # palautetaan true
    }
    else # muuten,
        return false; # false.
}


# Laskee sarakkeet taulusta. Parametrit: Valittu taulu
function tdb_count_cols( $nimi ) {
    @include( $nimi.".tdb" );
    if( $solu )
        return count( $solu );
}


# Laskee rivit taulusta. Parametrit: Valittu taulu, Sarake = false
function tdb_count_rows( $nimi, $sarake = false ) {
    @include( $nimi.".tdb" );
    if( $solu ) {
        if( $sarake ) {
            return count( $solu[$sarake] ); # Jos halutaan laskea vain yhden sarakken rivit.
        }
        else { # muuten
            $arr = array();
            foreach( $solu as $key => $value ) {
                foreach( $solu[$key] as $avain => $arvo ) {
                    $arr[] = $avain;
                }
            }
            @sort( $arr, SORT_NUMERIC );
            return end( $arr ) + 1;
        }
    }
    else
        return 0;
}

# Copyright © Valtzu aka D.J-Dew

?>

esimerkki

<?php

include( "functions.php" );

if( !tdb_db_exists( "vieraskirja" ) ) # Jos kantaa "vieraskirja" ei löydy,
    tdb_create_db( "vieraskirja" ); # luodaan sellainen.
$kanta = tdb_select_db( "vieraskirja" ); # Valitaan kanta "vieraskirja".

if( !tdb_table_exists( "viestit", $kanta ) ) # Jos taulua "viestit" ei löydy valitusta kannasta,
    tdb_create_table( "viestit", $kanta ); # luodaan sellainen.
$taulu = tdb_select_table( "viestit", $kanta ); # Valitaan taulu "viestit" valitusta tietokannasta($kanta).

if( $_GET['do'] == "write" ) { # Jos halutaan kirjoittaa,
    tdb_put( array( stripslashes( $_POST['nimi'] ), str_replace("\n", "<br />", stripslashes( $_POST['viesti'] ) ) ), array( "nimi", "viesti" ), $taulu );
    # kirjoitetaan valittuun tauluun($taulu) nimi ja viesti.
    header( "Location: ".$_SERVER['PHP_SELF'] ); # Ohjataan käyttäjä takas
}

$rivit = tdb_get_rows( "*", $taulu ); # Valitaan kaikki rivit valitusta taulusta($taulu)
if( $rivit ) { # Jos rivejä,
    foreach ( $rivit as $msg ) { # luupataan ne läpi
        echo '<b>Nimi:</b> '.$msg['nimi']; # tulostetaan nimi
        echo '<br /><b>Viesti:</b><br />'.$msg['viesti'].'<br /><br />'; # ja viesti.
    }
}
echo '<br /><br /><form action="?do=write" method="post">'; # Tulostetaan kirjoituslomake
echo 'Nimi: <input type="text" name="nimi"><br />';
echo 'Viesti: <br /><textarea name="viesti"></textarea><br />';
echo '<input type="submit" value="Lähetä">';
echo '</form>';

?>

D.J-Dew [11.03.2005 16:10:48]

#

Sainpahan vihdoinkin ensimmäisen koodivinkkini tänne putkaan. Haluaisin palautetta toiminnasta ja mahdollisista parannus ehdotuksista.

ZcMander [16.03.2005 14:44:46]

#

ei oo vielä julkastu ;)

sooda [19.03.2005 16:25:15]

#

Välit selventäis koodia tosi paljon. :)
Esim. pilkkujen jälkeen ja operaattorien välissä.

renni [21.03.2005 16:43:04]

#

Oikein laitetut sisennykset ois kans pop.

D.J-Dew [21.03.2005 16:47:36]

#

Eikö näitä koodivinkkejä voi muokata?
Oisin laittanu sisennykset kuntoon....

T.M. [22.03.2005 13:57:28]

#

Kyllä voi muokata, senkus etsit "muokkaa" linkin tuolta ylhäältä.

D.J-Dew [22.03.2005 16:22:23]

#

mulla ei näkynyt muokkaa linkkiä tuolla ylhäällä, syy selvisi: Olin kirjautunut sisään pienelläkirjoitetulla nickilläni (d.j-dew), kun kirjauduin nimellä D.J-Dew, muokkauslinkki tuli näkyviin :)
Siistin samalla koodia....

temu92 [21.05.2005 22:50:37]

#

Enpä tota MySQL osaa enkä tarvitse niinpä tämäkin on aika turha minulle

Teman [26.06.2006 12:30:47]

#

Olen tässä pohtinut, että miten voisi tehdä sellasen
koodin, et ensin lähetetään lomakkeen muodossa tietoja
ja, sit omalle henkilökohtaiselle profiilille ilmestyy samat tiedot, niin että ne automaattisesti aina tallentuu.

Clacier [25.01.2010 17:38:34]

#

Teman kirjoitti:

Olen tässä pohtinut, että miten voisi tehdä sellasen
koodin, et ensin lähetetään lomakkeen muodossa tietoja
ja, sit omalle henkilökohtaiselle profiilille ilmestyy samat tiedot, niin että ne automaattisesti aina tallentuu.

Mysql varmaan helpoin tapa noille.

Metabolix [23.12.2011 23:20:19]

#

Vinkin toteutus on erittäin rajoittunut, puutteellinen ja ilmeisen viallinen ainakin htmlspecialchars- ja stripslashes-funktioiden käytön sekä rivinvaihtokikkailujen osalta. Ei tällaisesta kannata kenenkään mallia ottaa.


Sivun alkuun

Vastaus

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

Tietoa sivustosta