Database Class

Door Kees Schepers, 22 jaar geleden, 4.668x bekeken

Waarschijnlijk is deze klasse al eerder gepost, maar ik docht, ik gebruik hem nu al enige tijd (2 maanden) hij werkt goed, en anderen mogen ook wel van mijn objecten genieten.

LICENSE!
Na overleg, mag deze klasse vrij gebruikt worden.

OMSCHRIJVING
Wanneer je deze klasse gebruikt, zul je niet meer hard coded mysql functies uitvoeren, maar zal alles binnen deze klasse gebeuren. Deze klasse, maak een connectie aan, en alle functies geeft hij een resourcelink edentifier aan. Zo is het dus ook makkelijk om meerder database verbindingen te maken.
Tevens kun je dus ook als je deze klasse overschrijft voor PostGreSQL kunnen gebruiken. Zo hoef je dus geen functies aan te passen in je code, maar alleen de klasse. Zo kun je je applicaties laten draaien op meerdere database servers!
Tevens wil ik niet beweren dat deze klasse compleet is, en misschien als jij hem gebruikt dat er iets aan ontbreekt, dus zul je hem dan zelf moeten uitbreiden.


VOORDELEN, WAAROM?
Waarom je deze klasse zou gebruiken, heeft te maken met een aantal grote voordelen welke zijn:
- Alle (mysql) functies lopen via 1 object.
- Makkelijk meerdere database verbindingen beheren
- Indien je ooit overstapt op een andere database server, is dit makkelijk te realiseren.
- Debug info printen
- lekkere en smullende functies in the libary
- kun je goed gebruiken bij andere klasses die ik straks ga posten ;)

En er zijn vast nog wel meer voordelen!

DOCUMENTATIE:
Ik heb uitgebreide documentatie over deze klasse geschreven! Je kunt ze downloaden op: http://www.roosendaler.nl/DatabaseKlasse.doc veel plezier ermee!

GEBRUIK:
Als je het object inialiseert, moet je 3 verplichte parameters doorgeven, welke (host), gebruikersnaam, wachtwoord en database zijn.
De constructor zal dan een verbinding maken met de database.

Voor de functie waar je normaal mysql_query voor gebruikt gebruik je nu $object->execQuery() voor, waarmee je dus een query execute.
Indien je een INSERT doet, geeft hij de inserted ID terug, indien UPDATE of DELETE geeft hij de affected rows terug, en bij SELECT de result van de query.

de functie $object->fetchResult geeft een array terug, met een numerieke index voor de records en in die index zit weer een numerieke en textuele index in. Om dit uit te testen, zie mijn voorbeelden.
(is ongeveer gelijk aan mysql_fetch_row)

De functies insertRow, deleteRow en updateRow zijn functies die door mij verzonnen zijn. Hiermee kun je makkelijk grote query's uitvoeren naar een post.
Bij de functies inertRow en updateRow geef je als eerste parameter de tabelnaam, daarna een array met de waarden die veranderd moeten worden, waarvan index gelijk is aan de kolom naam in de tabel. Ook vindt je hiervan een voorbeeld in de code. Bij de functie editrow moet je als laatste parameter een record id opgeven.

De overige functies is een kwestie van goed kijken en dan wordt het waarschijnlijk vanzelf duidelijk. En anders vraag het me :)

BELANGRIJK!!!
Voor de functies, insertRow, updateRow en deleteRow moet je een tabel in je database hebben waarvan het eerste veld "id" heet, en automumeriek is. Anders zal het niet, of slecht werken!
(dus het eerste veld mag geen articleId heten ofzo)

Gesponsorde koppelingen

PHP script bestanden

  1. database-class

 

Er zijn 12 reacties op 'Database class'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen


22 jaar geleden
 
0 +1 -0 -1
Soms heb je geen wachtwoord nodig voor je database! (bijvoorbeeld bij Tripod).
Kees Schepers
kees Schepers
22 jaar geleden
 
0 +1 -0 -1
dan doe je:
$database = New dbClass('localhost','testuser','','testdatabase');
Jelmer -
Jelmer -
22 jaar geleden
 
0 +1 -0 -1
Over het algemeen zijn alle scripts in de scriptlib
Quote:
De GPL (General Public License) zorgt ervoor dat de auteursrechten niet geschonden worden. "De GPL zorgt ervoor dat alles geplaatst op phphulp (onder enkele voorwaarden) verder gratis gepubliceerd mag worden mits de broncode gratis openbaar gemaakt wordt."


En 'could not select database' vind ik persoonlijk toch meer een error dan een notice. Een notice is meer voor dat er zich een probleem voordeed, en dat dat probleem is opgelost.
Lissy Pixel
Lissy Pixel
22 jaar geleden
 
0 +1 -0 -1
Dank je wel voor het delen!
Ik vind dit heel interessant!!
Groet, lissy
Kees Schepers
kees Schepers
22 jaar geleden
 
0 +1 -0 -1
Heey jelmer, dan maak je er een E_USER_ERROR van he.. :P
Jelmer -
Jelmer -
22 jaar geleden
 
0 +1 -0 -1
Ik weet het, ik probeer kritiekpunten te vinden. Het is een prima class, maar ik zoek naar de punten waarop ik hem zou verbeteren.

Aah, nog een tweetal gevonden:


    Ook zou het leuk zijn als hij de tijd bijhield die een query duurde, en hoeveel queries er in totaal zijn uitgevoerd, en hoe lang dat in totaal duurde. Bij het vinden van vertragende factoren zou dat erg handig kunnen zijn. (Maar als een applicatie eenmaal af is, is het overbodig.)

    Als ik hem onder alle voorwaarden mocht gebruiken, of in ieder geval onder GPL, zodat ik hem kon herdistribueren in de programma's die ik zelf maak, had ik hem gebruikt, want het is een hele mooie class. Maar ik maak toch maar zelf eentje.

    edit: Willem heeft mij verbeterd. Ik liep iets te hard van stapel. Mijn fout, sorry.
    Willem vp
    Willem vp
    22 jaar geleden
     
    0 +1 -0 -1
    @Jelmer:

    Ik wil hier geen discussie starten over het wel of niet gebruiken van variabelen tussen quotes, maar in dit geval heb je volgens mij niet goed gekeken ;-) In de trigger_error()'s worden enkele quotes gebruikt, dus in feite wordt de variabele-naam geprint. En aangezien de variabelen niet voorkomen in de code, ga ik ervan uit dat die hier symbolisch gebruikt worden en het dus precies is wat wordt bedoeld.
    Jelmer -
    Jelmer -
    22 jaar geleden
     
    0 +1 -0 -1
    Je hebt gelijk willem, mijn fout, stom van me, overheen gelezen. Heb mijn post aangepast.
    Kees Schepers
    kees Schepers
    22 jaar geleden
     
    0 +1 -0 -1
    Heey jelmer,

    Erg goede kritiek van je hoor! Je hebt over sommige dingen volkomen gelijk. Ik ga dus ook een verbeterde versie schrijven, die op een efficiente wijze de kolommen opvraagt uit de tabel.
    Ook ga ik deze klasse uitbreiden met query caching, en uitgebreide debug info (zoals jij aangeeft).

    Heel erg bedankt voor je kritiek!
    Martijn Wieringa
    Martijn Wieringa
    22 jaar geleden
     
    0 +1 -0 -1
    Code (php)
    PHP script in nieuw venster Selecteer het PHP script
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    <?
        // Auteur: ME Wieringa
        // Email: [email protected]


        class Database
        {
            var
    $resource; // Stores the resource identifier of the connection to the SQL server.

            var $user; // username
            var $pass; // password
            var $name; // name of the database
            var $host; // host

            // Creates a new database

            function Database($user, $pass, $name, $host = "localhost")
            {

                // Connect to database server
                if($this->resource = mysql_connect($host, $user, $pass))
                {

                    // Select a database on the MySQL Server
                    if(mysql_select_db($name))
                    {

                        // Locked to requested database
                        $this->user = $user;
                        $this->pass = $pass;
                        $this->name = $name;
                        $this->host = $host;

                        return true;
                    }

                    else
                    {
                        // Error while selecting database
                        exit("Door een technische storing kan er geen verbinding worden gemaakt met de database. Onze excusses voor het ongemak.\nFile: " . __FILE__  . ", Line: " . __LINE__ . ".");
                    }
                }

                else
                {
                    // Error while connection to server
                    exit("Door een technische storing kan er geen verbinding worden gemaakt met de server. Onze excusses voor het ongemak.\nFile: " . __FILE__  . ", Line: " . __LINE__ . ".");
                }
            }


            // Function to execute a SQL stetement (eg. DELETE/INSERT/UPDATE).
            function execute($sql)
            {

                if(mysql_query($sql, $this->resource))
                {

                    return true;
                }

                else
                {
                    exit("Fout in sql statement:\n" . $sql . "\n" . mysql_errno() . " : " . mysql_error() . "\nFile: " . __FILE__  . ", Line: " . __LINE__ . ".");
                }
            }


            // Returns the list of fieldnames within a table.
            function getFields($tableName, $sort = true)
            {

                $result = array();

                $fields = mysql_list_fields($this->name, $tableName, $this->resource);
                $field_count = mysql_num_fields($fields);

                for ($i = 0; $i < $field_count; $i++)
                {

                    $result[] = mysql_field_name($fields, $i);
                }


                if($sort)
                {

                    if(sizeof($result) > 1)
                    {

                        usort($result, "strcasecmp");
                    }
                }


                return $result;
            }


            // Returns the last created record-id (only works after an INSERT-statement).
            function getId()
            {

                return mysql_insert_id($this->resource);
            }


            // Returns the list of tables within the current database.
            function getTables($sort = true)
            {

                $result = array();

                $tables = mysql_list_tables($this->name, $this->resource);

                while($table = mysql_fetch_row($tables))
                {

                    $result[] = $table[0];
                }


                if($sort)
                {

                    if(sizeof($result) > 1)
                    {

                        usort($result, "strcasecmp");
                    }
                }


                return $result;
            }


            // Returns upto 1 record after running a SQL-statement.
            // No results will return FALSE.

            function getRecord($sql)
            {

                $result = array();

                if($oCols = mysql_query($sql, $this->resource))
                {

                    $cols = array();

                    while($oCol = mysql_fetch_field($oCols))
                    {

                        $cols[] = $oCol->name; // save columnname
                    }

                    if($oRows = mysql_query($sql, $this->resource))
                    {

                        if($oRow = mysql_fetch_row($oRows))
                        {

                            for($i = 0; $i < sizeof($cols); $i++)
                            {

                                $result[$i] = $oRow[$i]; // For sorting by index
                                $result[$cols[$i]] = $oRow[$i]; // For sorting by columnname
                            }
                        }

                        else
                        {
                            $result = false;
                        }
                    }

                    else
                    {
                        exit("Fout in sql statement:\n" . $sql . "\n" . mysql_errno() . " : " . mysql_error() . "\nFile: " . __FILE__  . ", Line: " . __LINE__ . ".");
                    }


                    mysql_free_result($oRows);
                }

                else
                {
                    exit("Fout in sql statement:\n" . $sql . "\n" . mysql_errno() . " : " . mysql_error() . "\nFile: " . __FILE__  . ", Line: " . __LINE__ . ".");
                }


                mysql_free_result($oCols);

                return $result;
            }


            // Returns all records after running a SQL-statement.
            // The columnnames are stored at index 0.
            // No results will return an array with only the columnnames (at index 0).

            function getRecords($sql)
            {

                $result = array();

                if($oCols = mysql_query($sql, $this->resource))
                {

                    $cols = array();

                    while($oCol = mysql_fetch_field($oCols))
                    {

                        $cols[] = $oCol->name; // save columnname
                    }

                    $result[] = $cols;

                    if($oRows = mysql_query($sql, $this->resource))
                    {

                        while($oRow = mysql_fetch_row($oRows))
                        {

                            $temp = array();

                            for($i = 0; $i < sizeof($cols); $i++)
                            {

                                $temp[$i] = $oRow[$i]; // For sorting by index
                                $temp[$cols[$i]] = $oRow[$i]; // For sorting by columnname
                            }

                            $result[] = $temp;
                        }
                    }

                    else
                    {
                        exit("Fout in sql statement:\n" . $sql . "\n" . mysql_errno() . " : " . mysql_error() . "\nFile: " . __FILE__  . ", Line: " . __LINE__ . ".");
                    }


                    mysql_free_result($oRows);
                }

                else
                {
                    exit("Fout in sql statement:\n" . $sql . "\n" . mysql_errno() . " : " . mysql_error() . "\nFile: " . __FILE__  . ", Line: " . __LINE__ . ".");
                }


                mysql_free_result($oCols);

                return $result;
            }


            // Returns true if a field exists, false otherwise.
            // Note: Fieldnames are CASE SENSITIVE!!

            function isField($tableName, $fieldName)
            {

                // Get all fields withing table
                $fields = $this->getFields($tableName);
                return in_array($fieldName, $fields);
            }


            // Returns true if a field table, false otherwise.
            // Note: Tablenames are CASE SENSITIVE!!

            function isTable($tableName)
            {

                // Get all tables withing database
                $tables = $this->getTables();
                return in_array($tableName, $tables);
            }


            // Print SQL output into a HTML based table.
            // Note: This function was added to support the testing of SQL queries.

            function printSQL($sql)
            {

                // Execute SQL and retrieve records
                $xRecords = $this->getRecords($sql);

                $result = "";
                $result .= "<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n";

                // Generate header
                $result .= "<tr>\n";
                
                for($col = 0; $col < sizeof($xRecords[0]); $col++)
                {

                    $result .= "<th align=\"left\" valign=\"top\">" . str_replace("\n", "<br />", htmlentities($xRecords[0][$col])) . "&nbsp;</th>\n";
                }


                $result .= "</tr>\n";

                // Generate records
                for($row = 1; $row < sizeof($xRecords); $row++)
                {

                    $result .= "<tr>\n";

                    for($col = 0; $col < sizeof($xRecords[0]); $col++)
                    {

                        $result .= "<td align=\"left\" valign=\"top\">" . str_replace("\n", "<br />", htmlentities($xRecords[$row][$col])) . "&nbsp;</td>\n";
                    }


                    $result .= "</tr>\n";
                }


                $result .= "</table>\n";

                // Print output
                print($result);
            }
        }


    ?>


    Een extra voordeel van het gebruik van een database class is dat je eenvoudig meerdere databases tegelijk 'open' kan hebben staan.
    Dat is vaak noodzakelijk bij het ontwikkelen van bijv. CMS systemen waarbij je doorgaans een 'systeem database' en een domein specifieke database' hebt.

    Je kan deze class als volgt toepassen:

    Code (php)
    PHP script in nieuw venster Selecteer het PHP script
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?

        $db
    = new Database("gebruikersnaam", "wachtwoord", "databasenaam");

        // Uitvoeren van een query
        $db->execute("DELETE FROM...");
        
        // Weergeven van een SELECT query (voor testmogelijkheden)
        $db->printSQL("SELECT * FROM...");

        // Geeft het eerst gevonden record terug als deze beschikbaar is, geeft anders een 'false'.
        $record = $db->getRecord("SELECT * FROM...");

        // Geeft een recordset terug als 2D array.
        // Rij 0 bevat ALTIJD de kolomkoppen.
        // Begin een for-lus dus altijd bij 1!
        // Om te controleren of de recordset 'leeg' is, gebruik dan ook (sizeof($records) > 1)

        $records = $db->getRecords("SELECT * FROM...");

    ?>
    Mistery
    mistery
    21 jaar geleden
     
    0 +1 -0 -1
    waar is de functie selectRows($table,$criterion) voor als je een execQuery() gebruikt om je gegevens op te halen?
    PHP hulp
    PHP hulp
    0 seconden vanaf nu
     

    Gesponsorde koppelingen
    Remco
    Remco
    20 jaar geleden
     
    0 +1 -0 -1
    Oud topic maar erg interessant.

    Ben een beetje meer aan het leren over OOP in php (ik moet helaas nog versie 4 gebruiken).

    Dit script is vreselijk leerzaam, maar een ding snap ik niet, hoe zou ik een mySql query als (SELECT $argument_1 FROM tabel_naam WHERE argument_1="$argument_2" AND argument_2 ="$argument_3") moeten laten uitvoeren in dit script.

    Ben al een tijdje bezig dit voor elkaar te krijgen, maar ik krijg het maar niet voor elkaar. Ik denk dat ik daarvoor een paar dingen in deze class moet herschrijven (heb dingen geprobeerd met function selectRows zodat het meerdere argumenten accepteert. En ik heb getest of het gegevens ophaalt maar ik krijg de waarden niet uit de array getrokken) maar heb geen idee meer wat.

    Om te reageren heb je een account nodig en je moet ingelogd zijn.

    Inhoudsopgave

    1. database-class

    Labels

    • Geen tags toegevoegd.

    Navigatie

     
     

    Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.