OOP MySQL class

Door SilverWolf NL, 17 jaar geleden, 11.976x bekeken

Dit is een vervanging van de mysqli-class. De performance zal slechter zijn, en ik raad ten alle tijde aan de standaard class te gebruiken als deze aanwezig is. Hij is ook nog in ontwikkeling, want het gedeelte van de prepared statements is nog niet af. De bedoeling is dat deze klasse geinclude kan worden, en dan vrijwel niets veranderd hoeft te worden om hem toch te laten draaien, ook al is het systeem op mysqli gebaseerd.

Voor iedereen die zijn steentje wil bijdragen:
-Post hier a.u.b. de bugs die je vindt, zodat ik ze kan verhelpen.
-Ik ben geen PHP-guru, dus er zullen vast voor bepaalde methoden slimmere oplossingen zijn. Vermeld dit a.u.b. ook, dan leer ik ook weer wat bij.

Er zijn nog een aantal verbeteringen nodig:
Van de result-class heb ik geen handige oplossing kunnen vinden voor $result->current_field
Van de STMT-class heb ik de volgende problemen niet kunnen oplossen:
-Data versturen in pakketjes (zowel nodig bij blob als bij send_long_data)
-Een vervanging voor bind_result()
-Een slimme manier voor $result->lengts
-De $result->fetch_field* functies missen nu nog een aantal data-items. Deze worden wel door mysqli maar niet door mysql teruggegeven. Ik heb niet kunnen vinden waar ik deze wel kan krijgen.
-Er missen nog een aantal functies in de basisclass, deze zal ik zo snel mogelijk erbij zetten.


Al met al:
Gebruik deze klasse alleen als er geen mysqli beschikbaar is en je niet de geaveranceerde functies nodig hebt. Ik raad voorlopig het gebruiken van prepared statements ook af, maar je zal er snel achter komen dat deze sowieso nog niet werken volgens mij ;)

Veel plezier ermee!

Gesponsorde koppelingen

PHP script bestanden

  1. mysql.class.php

 

Er zijn 10 reacties op 'Oop mysql class'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
Mooi gedaan, paar dingen:
Probeer zo min mogelijk @ te gebruiken, het mag makkelijker zijn, maar het is langzaam en niet net.

Ik zou het mooier vinden al je fetch modes met 1 functie te doen, met een constante als parameter.

Na free_result() moet je het object op een of andere manier uitschakelen, anders krijg je errors. Je kan dit doen met een protected functie checkFreed() die je bij elke call aanroept en die een exception gooit als free_result() is aangeroepen.

Voor $result->lengths kan je denk ik het beste 1 rij fetchen is numeric array mode, de tellen en dan de pointer terugzetten.

Waarom gooi je geen exceptions bij MySQL::query()? Of stel het in: Maar een protected functie error($name, $code) die wordt geroepen bij een fout en volgens een object property de fout afhandelt.

Gebruik geen global constants (define()) maar klasse constanten.

Je naamgeving in inconsistent.

Hoe moet je een fetch doen op een prepared statement? En je kan met een regex proberen ook parameters met :naam te doen. Iets als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
preg_match_all('/:([A-z_])+/', $query, $params);
?>
SilverWolf NL
SilverWolf NL
17 jaar geleden
 
0 +1 -0 -1
@Pim;
Allereerst bedankt voor deze tips, ik ga eens sleutelen. Verder heb ik nog een aantal antwoorden voor je:

Ik werk niet met exceptions omdat de standaard mysqli class dit ook niet doet. Zoals al vermeld wordt (geloof ik) heb ik dit script gemaakt zodat je, als je een stuk code van iets anders hergebruikt op een server zonder mysqli ondersteuning, dit alsnog kan gebruiken.

Ik zal eens kijken naar je protected/private error-idee, want dat is sowieso wel handig (ik had al zowat in mijn hoofd, maar moest nog even uitdenken hoe ik het ging maken).

De rede dat ik geen klasseconstanten gebuik is omdat je dat dan ook weer in de code moeten veranderen als je deze klasse als vervanging voor mysqli gebruikt, en daarvoor is het ontworpen (als ik mij niet vergis, moet je klasseconstanten als MySQL::MYSQL_NUM aanroepen).

Hetzelfde geldt ook voor de prepared statements. Ze doen het met ? in de officiële, en daarom hou ik dat aan. Ik vindt het ook een mooiere oplossing om het met :tag te doen, dat had ik zelfs in eerste instantie (net zoals de exceptions! :) ) maar ik bedacht me dat dan alsnog veel werk verricht zou moeten worden om de code om te bouwen. Ik gebruik zelf vrijwel altijd de mysqli class, omdat deze sowieso sneller is dan de mysql methodes en ook all OO is.

Ik wil trouwens wel eens weten of iemand met een goede oplossing kan komen voor $stmt->bind_result(), want ik heb nog geen werkende kunnen bedenken, maar dat zal wel aan mij liggen :P

Edit:

Zou je even kunnen aangeven waar ik inconsistent ben met naamgeving? Kan het zelf niet vinden, en ik ben sowieso slecht in consistentie :) )
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
Je bent inconsistent met de namen van de klassen: MySQLresult en MySQL_STMT

En over bind_result: maak een array met variabelen by reference. Zo haal je die op:
http://www.php.net/manual/en/function.func-get-args.php#90095

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
<?php
Class MySQL_STMT
    function bind_result(/*variable arguments*/) {
        $stack = debug_backtrace(false);
        $args = array();
        if (isset($stack[0]['args']))
            for($i=0; $i < count($stack[0]['args']); $i++)
                $this->bound_vars[$i] = & $stack[0]['args'][$i];
    }
    
    function
fetch() {
        $row = mysql_fetch_array($this->result,MYSQLI_NUM);
        foreach($row as $index => $value)
            if(isset($this->bound_vars[$index]))
                $this->bound_vars[$index] = & $value;
    }
}

?>

Ongetest, maar ik denk dat het werkt.
EDIT: Getest, en het werkt niet...

En denk je aan de error onderdrukking (@)?
SilverWolf NL
SilverWolf NL
17 jaar geleden
 
0 +1 -0 -1
Quote:
Ongetest, maar ik denk dat het werkt.
EDIT: Getest, en het werkt niet...


Dit probleem had ik dus ook al. Ik was al op het idee gekomen om ze te refereren, maar volgens mij geeft zowel debug_backtrace als func_get_args een array terug die niet gekoppeld is aan de waardes van de meegegeven variablen. Dat was ook de rede dat ik er niet uitkwam ;) (ja dat had ik erbij moeten zetten...)

Toch bedankt!

PS: als ik @ niet gebruik dan krijg je veel warnings te zien, ik zal kijken of ik een andere oplossing kan vinden daarvoor...
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
Ja, natuurlijk krijg je dan warnings, maar die moet je juist zien te voorkomen!
SilverWolf NL
SilverWolf NL
17 jaar geleden
 
0 +1 -0 -1
Hoe moet ik weten wat ik in bijvoorbeeld affected_rows moet stoppen als ik niet precies de query weet die uigevoerd wordt? Deze in namelijk bij SELECT statements gelijk aan num_rows en daarom gebruik ik max, maar dan moet ik wel allebij de functies ervoor aanroepen, en dat genereerd deze errors. Ik kan behalve de query's gaan nalopen er volgens mij niet veel aan doen. Ik heb trouwens wel een (niet zo nette) oplossing voor bind_result, ik zal hem zo even updaten...
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
Ja aan die oplossing had ik ook gedacht, maar ik vond hem te lelijk ;)

Verder maak je een vrij grote fout, die ook tot gevolg heeft dat je in de war raakt met affected - en num rows: je maakt te weining onderscheid tussen queries die data veranderen en die, die data ophalen. Zo mag je in het eerste geval natuurlijk geen result object teruggeven, maar gewoon de boolean true. Het type kan je uit mysql_info halen, of gewoon bepalen met een regex over de query. Dit kan je dan in een property opslaan en bij vervolghandelingen kijken wat het geval is.
Wesley Overdijk
wesley Overdijk
17 jaar geleden
 
0 +1 -0 -1
@Pim de haan:
'Mooi gedaan, paar dingen:
Probeer zo min mogelijk @ te gebruiken, het mag makkelijker zijn, maar het is langzaam....
'

Leg me eens uit hoezo het langzaam is? Het is inderdaad niet net, en een slechte zaak, want errors hoor je goed af te handelen. Maar langzaam? weet je iets dat ik niet weet?


17 jaar geleden
 
0 +1 -0 -1
WTF is het nut van set_error? Bij connection gebruik je hem niet.
Als je hem gaat gebruik, maak hem dan ook protected o.i.d.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
Idd, het valt wel mee. Op veel plaatsen wordt het beweerd, maar volgens http://vega.rd.no/articles/php-performance-error-suppression klopt dat niet. Het is daarintegen wel misleidend en het kan leiden tot onvindbare bugs.

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

Inhoudsopgave

  1. mysql.class.php

Labels

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.