[PHP] dbClass gebouwd, verveel me, wat voor feats toevoegen?

Pagina: 1
Acties:
  • 103 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Ik heb een database class gebouwd in PHP.

Features:
• Database server onafhankelijk (MySQL en PostgreSQL werkt nu)
• Ingebouwde cache voor SELECT/EXPLAIN/SHOW/DESCRIBE queries.
• Automatische SQL-Injection voorkomer
• Bijhouden van statistieken (database tijd, aantal queries, gecachede queries)

Wat voor features horen / kunnen er nog meer in een database class?

Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
aparte functie voor een aantal query's zoals ophalen van databaselayout (tabellen en columns) en gewone select-queries

Acties:
  • 0 Henk 'm!

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 20-08 21:38
Feature: Minimale parsetime en een ligtmodus waradoor je al die ranzige extra functies niet laadt :+.
Daarnaast zou het erg leuk zijn als je hem Open source hier @ GoT aanbied. Of iig voor iedereen bruikbaar.

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Misschien een mogelijkheid om snelheidsverbeteringen in query's overzichtelijk te testen en te benchmarken?

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Okay, hier is de code (v1.1, dus zonder de suggesties die in dit topic genoemd zijn). 'k Hoop dat het niet tegenvalt.

niet gehightlighed (32kb)
highlighted source(134kb)
Highlighted, sponsored by drm

[ Voor 36% gewijzigd door Skaah op 02-01-2004 15:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Kijk eens naar ADODB en put daar wat inspiratie uit.

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Ik heb voor mijn DB Class ( wie heeft geen een gemaakt :) ) een mogelijkheid om assoc array te dumpen naar een rij om te inserten of te updaten.

$class->insert(<TABLE>, <ARRAY>);
of
$class->update(<TABLE>, <ARRAY>, <WHERE>);

Dat maakt het opbouwen van je data voor opslag erg makkelijk. Je kan bij wijze van rechtstreeks een form naar je database zetten. Als je intresse hebt wil ik de code wel geven... Maar zelf bouwen is meestal leuker.. :)

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Ziet er netjes uit :)

Suggestie:

Je hebt nu bij db_select, db_delete, db_insert , db_ update iedere keer een switch statement om de query uit te voeren. Is het niet handiger om een functie te maken die dit voor je afhandelt.

Dus:
PHP:
1
2
3
4
5
function db_query()
{
 //en dan hier je switch statement om een query uit te voeren.

}


En dan doe je in die andere functies.
PHP:
1
$this->db_query($query);

Dat lijkt me alweer een hoop code te schelen.

[ Voor 13% gewijzigd door Brakkie op 08-01-2004 16:14 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

Verwijderd

je kan maar een ding tegelijk updaten of heb ik ergens overheen gelezen?

Acties:
  • 0 Henk 'm!

  • gomaster
  • Registratie: Februari 2002
  • Laatst online: 19-09 12:45
Functie om het aantal rijen te returnen. Je kan ook nog iets maken voor als je maar een resultaat wilt. Dus dat zou je een var kunnen noemen die je uit de db trekt.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Paging in de resultaten, dus de resultaten over meerdere pagina's kunnen tonen zoals bij een zoekmachine?

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

als de database plat ligt moet er wel een mailtje naar jouw met een limiet van 1 per uur ofzo.

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:31

gorgi_19

Kruimeltjes zijn weer op :9

AW_Bos schreef op 08 januari 2004 @ 17:43:
als de database plat ligt moet er wel een mailtje naar jouw met een limiet van 1 per uur ofzo.
Imho is dit geen taak van een database class, maar van een errorlogger class. De database class gooit een exceptie op; welke elders wordt opgevangen.

Vervolgens kan je mbv de errorlogger bepalen wat er gebeurd; een mailtje sturen, opslaan in een XML-bestand, eventlog, etc.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

gorgi_19:
Imho is dit geen taak van een database class, maar van een errorlogger class. De database class gooit een exceptie op; welke elders wordt opgevangen.
In PHP zou dat beteken dat je een error handler implementeert en gebruik maakt van trigger_error. Dat moet je imho sowieso doen. Veel beter dan al die die () en exit () toestanden.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Brakkie schreef op 08 januari 2004 @ 16:11:
Ziet er netjes uit :)

Suggestie:

Je hebt nu bij db_select, db_delete, db_insert , db_ update iedere keer een switch statement om de query uit te voeren. Is het niet handiger om een functie te maken die dit voor je afhandelt.

Dus:
PHP:
1
2
3
4
5
function db_query()
{
 //en dan hier je switch statement om een query uit te voeren.

}


En dan doe je in die andere functies.
PHP:
1
$this->db_query($query);

Dat lijkt me alweer een hoop code te schelen.
Dat vind ik een hele goede tip! Ga ik zeker inplementeren.
Verwijderd schreef op 08 januari 2004 @ 16:25:
je kan maar een ding tegelijk updaten of heb ik ergens overheen gelezen?
Ja dat klopt, maar ik zou met een array, waarbij de keys voor velden staan en de values voor de nieuwe waardes wel iets kunnen maken.
gomaster schreef op 08 januari 2004 @ 17:09:
Functie om het aantal rijen te returnen. Je kan ook nog iets maken voor als je maar een resultaat wilt. Dus dat zou je een var kunnen noemen die je uit de db trekt.
PHP:
1
2
$result = $db->db_query($query);
$aantalrijen = count($result);

en als je maar één resultaat wilt:
SQL:
1
SELECT a FROM b WHERE c = d LIMIT 1
drm schreef op 08 januari 2004 @ 17:57:
[...]
In PHP zou dat beteken dat je een error handler implementeert en gebruik maakt van trigger_error. Dat moet je imho sowieso doen. Veel beter dan al die die () en exit () toestanden.
Ga ik me in verdiepen...

Bedankt allemaal.

[ Voor 3% gewijzigd door Skaah op 11-01-2004 11:42 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?PHP
// custom error handler
function eh($type, $msg, $file, $line, $context)
{
    switch($type)
    {
        case E_WARNING:
    }
}
// turn on all error reporting
error_reporting(E_ALL);

// define a custom error handler
set_error_handler("eh");

//er gaat iets fout:
trigger_error('hellup', E_USER_WARNING);
?>

[ Voor 24% gewijzigd door djluc op 11-01-2004 11:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

'k Heb de code nog niet doorgespit, maar hier een paar dingen waar je op moet letten of leuke features:
- automatisch connectie en xxxSQL objecten regelen (dus in een keer queries op object kunnen loslaten zonder dat programmeur expliciet een connect moet doen)
- bij meerdere connecties naar zelfde MySQL db/table met zelfde inloggegevens kan PHP connecties gaan hergebruiken (en dan kunnen queries elkaar dwarszitten!); forceer een nieuwe connectie!
- automatische ondersteuning MySQL master/slave model (INSERTs op master, (meeste) SELECTs op slave, etc.), met mogelijkheid om keuze te forceren.
- optioneel lastinsert_id (MySQL) teruggeven bij insert

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
- automatische ondersteuning MySQL master/slave model (INSERTs op master, (meeste) SELECTs op slave, etc.), met mogelijkheid om keuze te forceren.
Daar beschikt MySQL toch al over, wat zou je daar verder nog aan willen veranderen in je scripts?
een artikeltje: http://phpbuilder.com/columns/tanoviceanu20000912.php3
En een leuk stukje code hiervoor:
PHP:
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
<?php

/********************************************************
function db_connect_plus()

returns a link identifier on success, or false on error
********************************************************/
function db_connect_plus(){
    $username = "username";
    $password = "password";
    $primary = "10.1.1.1";
    $backup = "10.1.1.2";
    $timeout = 15;  // timeout in seconds

    if($fp = fsockopen($primary, 3306, &$errno, &$errstr, $timeout)){
        fclose($fp);
        return $link = mysql_connect($primary, $username, $password);
    }
    if($fp = fsockopen($secondary, 3306, &$errno, &$errstr, $timeout)){
        fclose($fp);
          return $link = mysql_connect($secondary, $username, $password);
    }

    return 0;
}

?>

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 17:32

Robtimus

me Robtimus no like you

Een tweede insert functie, waarbij je ook de kolommen kan opgeven.

Daarmee kun je dus statements als
SQL:
1
INSERT INTO table (col1, col2) VALUES (val1, val2)
uitvoeren

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
IceManX schreef op 12 januari 2004 @ 14:58:
Een tweede insert functie, waarbij je ook de kolommen kan opgeven.

Daarmee kun je dus statements als
SQL:
1
INSERT INTO table (col1, col2) VALUES (val1, val2)
uitvoeren
Een associatieve array als:
array('veldnaam' => 'waarde') zou wel handig werken denk ik.

Acties:
  • 0 Henk 'm!

Verwijderd

djluc schreef op 12 januari 2004 @ 14:35:
[...]
Daar beschikt MySQL toch al over, wat zou je daar verder nog aan willen veranderen in je scripts?
een artikeltje: http://phpbuilder.com/columns/tanoviceanu20000912.php3
Dit ging over een backupserver...
Overigens is het niet leuk om voor elke connect nog een extra connectie te hebben, alleen om te testen of je wel kunt connecten...
Arme database server... die start toch steeds een mysql proces op voor die eerste connect!

Verder ging het mij niet om een backup voor een database, maar om het master-slave systeem. Dan is het slimmer om de hele 'logica' voor welke query waarheen te sturen in je class af te handelen.

De PHP functies voor MySQL < 4.1 kennen geen mogelijkheden voor het master-slave model. Pas bij PHP5 en MySQL >= 4.1 kun je de mysqli functies gebruiken.
Maar ook die doen niet automatisch voor je...
Pagina: 1