Class: Databases - Overig - PHP scripts - PHPhulp
Door Tom Janssen, 15 jaar geleden, 3.146x bekeken
Ik heb deze class geschreven omdat ik ten eerste aan het experimenteren ben met OOP en ik makkelijk van database zou willen wisselen. Dus als ik over 2 weken denk van: Laat ik nu eens MySQLi gebruiken i.p.v. MySQL dan schrijf ik die class (door het gebruikenv an de bestaande class) en verander het type en mijn systeem werkt op MySQLi. Hoe simpel kan het zijn. Dus je kan óók tussen PostgreSQL en MySQL switchen (voor zover de sql code hetzelfde blijft). Verdere documentatie zit in de code. Ik heb dit script óók op phpfreakz gepost (dus het is géén rip).
Ik post deze hier omdat ik zelf geen class kan vinden die je zo kunt uitbreiden en er geen kan vinden die query's opslaat. Je hoeft dus niet per sé een resource mee te geven omdat het script deze zelf opslaat en gebruikt (van de laatste query).
class-databases
Er zijn 6 reacties op 'Class databases'
Hiervoor is PDO gemaakt.
Ben het helemaal met Jonathan eens, PDO is een betere keuze wanneer je meerdere databases wilt gaan ondersteunen. Ik zie bovenstaande code nog niet zo 1-2-3 veranderen in een classe voor het gebruik van PostgreSQL en een flink aantal functies zijn dan totaal overbodig. Multiquery is standaard met PostgreSQL, evenals fetch_all() (die hier mist) en prepared statements (die eveneens ontbreken).
Ik zou een specifieke database classe gebruiken voor een specifieke database (mysqli voor MySQL) of PDO voor het ondersteunen van een heel aantal databases. Maar om anno 2009 nog met mysql-functies aan te komen, ik zou het niemand aanraden.
Kijk, dat zegt dus iedereen. Maar ik kan wél geen database class vinden die dus meer databases ondersteund door alleen het type te veranderen, of tenminste ik kan ze niet vinden. Ik heb naar PDO gekeken maar ik zelf vind dit ingewikkeld. En ja, ik moet me nog even verdiepen in MySQLi en PostgreSQL en dan kan het zijn dat daar meer functies bijkomen. Maar het is dat ik zelf voor MySQL mijn functies zo compleet zijn (en voor de meeste hier). Verder kan ik ook geen class vinden die de resource opslaat en als er niets is meegegeven, die resource gebruikt. En daar doelde ik op, omdat ik er ziek van werd steeds opnieuw die resource mee te moeten geven. Het kán wel, maar hoeft niet.
En als ik het goed heb gelezen zijn de SQL codes van MySQL, MySQLi en PostgreSQL toch metzelfde? Dan hoef je alleen de afwerkende functies te veranderen en je bent er.
Bij jou moet je alsnog voor elke database een nieuwe class schrijven die toevallig jou databaseCore extend. Het krijg er geen enkel voordeel van, want alle methodes moeten overschreven worden per database type.
Het voordeel van PDO is juist dat het al voor je gedaan is verder zie ik niks voor prepared statements, als je toch je code minder afhankelijk van je database wilt maken is dat juist handig.
En als ik het goed heb gelezen zijn de SQL codes van MySQL, MySQLi en PostgreSQL toch metzelfde?
De SQL is al verschillend (MySQL houdt zich slecht aan de standaarden en kan echt hele rare dingen doen), maar dat heeft niets met de PHP-functies te maken die je nodig hebt om met de database te kletsen. Die functies zijn namelijk ook weer verschillend, pg_query() kan gewoon in 1x meerdere queries verwerken, mysql_query() kan dat niet. mysql_insert_id() geeft het id retour die met auto_increment is aangemaakt, in PostgreSQL (en andere databases) bestaat er geen auto_increment en dus geen functie om het id op te vragen. Het id vraag je dan op met SQL of laat je in 1x retourneren met RETURNING (PostreSQL).
Prepared statements zitten standaard in de PHP-functies voor PostgreSQL, zie pg_query_params(). Ideaal, SQL-injection is onmogelijk en je hoeft er niet meer aan te denken. Wat wil je nog meer?
Databases zijn zeer verschillend en daarbij is vooral MySQL een uitzondering. Een generieke class schrijven die meerdere soorten databases ondersteunt, zonde van je tijd, pak dan gewoon PDO. Dat is vele malen eenvoudiger en veiliger. Even een half uurtje mee stoeien en je hebt de basis onder de knie.
Dodo, je abstracte functie databaseCore.__construct heeft 1 parameter (een boolean). Je implemented functie mysqlDatabase.__construct heeft er drie (!?) waarvan de eerste geen boolean is (je typeforcet er zelfs een array van). Heel erg raar, al zeg ik het zelf. In PHP kunnen zulke dingen, maar het is niet erg netjes en misschien slim om af te leren. Zeker in dit geval waar je een boolean in de superclass verwacht, en dan een array forcet in de subclass.
Ik ben het wel met je eens Dodo, dat PDO te uitgebreid is en er weinig goede abstracte db classes zijn. Ik heb er zelf ook een gemaakt, een simpele.