[PHP/MySQL] Query klasse

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Als vakantieproject ben ik begonnen met schrijven van een nieuwe CMS. Ik heb enige ervaring met Java en OO programmeren. Mede daarom leek het me leuk deze CMS OO op te zetten. Vandaag ben ik na het lezen van enige artikelen en threads hier op GoT begonnen met het database gedeelte.

De code is in PHP4, omdat de twee domeinen die ik op dit moment bezit op een PHP4 draaien. Ik weet dat PHP5 veel meer features heeft qua OO, maar op dit moment maak ik nog gebruik van PHP4. Voor het database gedeelte heb ik nu 3 klasses geschreven. Database, Query en Result. Database maakt de connectie aan en bewaard deze (Singleton). De result klasse voert de query daadwerkelijk uit en hier zijn acties op uit te voeren zoals num_rows, fetch_array(), insert_id() etc.

Op dit moment bouw ik een query op de volgende manier op:
PHP:
1
2
3
4
5
6
7
8
9
10
//Nieuwe Query
$query = new Query();
$query->setFields("username, password");
$query->setTable(TBL_USERS);
$query->addWhere("userid", "=", $userid);
//Query uitvoeren en resultaat opslaan
$result = database->select($query);

$row =$result->fetch_array();
// Doe iets met $row


De database klasse maakt van het Query object een daadwerkelijke string. Zoals je kan zien in de implementatie van mijn Query klasse gebruik ik soms arrays, soms strings enz. Ik vind het daarom een beetje rommelig. Heeft iemand ideeen om dit te verbeteren?


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
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
$database =& Database::getInstance();

class Query {
    
    // ---------- Instance variables ---------------------------
    
    var $fields; // Fields to be selected
    var $tables; // Tables affected
    var $set; // sets
    var $where; // Where statements
    var $values; // Insert values
    var $limit; // Limit
    var $order;
    
    
    // ---------- Constructor -----------------------------------

    function Query(){       
        $this->set = array();
        $this->values = array();
        $this->where = array();
        $this->fields = "*";
        $this->limit = "0, 30";
    }
    
    
    // ---------- Queries --------------------------------------
    
    function getFields(){
        return $this->fields;
    }
    
    function getTables(){
        return $this->tables;
    }
    
    function getWhere(){
        return implode(" AND ", $this->where);
    }
    
    function getSet(){
        return implode(", ", $this->set);
    }
    
    function getLimit(){
        return $this->limit;
    }
    
    function getValues(){
        return implode(", ", $this->values);
    }
    
    // ---------- Commmands ------------------------------------
    
    function addWhere($field, $operator, $value){
        global $database;
        $value = $database->escape($value);
        $string = "$field $operator '$value'";
        array_push($this->where, $string);
    }
        
    function setFields($fields){
        $this->fields = $fields;
    }
        
    function setTables($tables){
        $this->tables = $tables;
    }
    
    function addSet($field, $value){
        $global database;
        $database->escape($value);
        $string = $field."=".$value;
        array_push($this->set, $string);
    }
    
    function addValue($value){
        global $database;
        $value = $database->escape($value);
        array_push($this->values, $value);
    }
    
    function setLimit($limit){
        $this->limit = $limit;
    }
    
    function setOrder($priority, $type = DESC){
        $this->order = $priority." ".$type;
    }
    
} // End of class Query

Computer Specs


Acties:
  • 0 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

Mischien is het een veel beter idee om in de Query klasse een functie aan te maken genaamt __toString(). Deze kun je op 3 manieren aanroepen, string conversie:
PHP:
1
2
<?php
$query = (string) $query;

Echo'en
PHP:
1
2
<?php
echo $query;

En natuurlijk gewoon de functie aanroepen.

Ik zou dan aanraden om alles in array's te zetten en dat bij elkaar te laten komen in de __toString(); functie.

Edit: Volgensmij zit er ook nog een bug in je klasse, lijn 87

PHP:
1
2
<?php
function setOrder($priority, $type = DESC){

Moet DESC niet 'DESC' zijn?

En nog even ter info, in een ORDER BY gedeelte kan je meerdere kolommen opgeven, dus dat kun je het beste met een array oplossen.

[ Voor 26% gewijzigd door kokx op 22-06-2007 19:19 ]


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Goed idee opzich. Dan moet ik dus alleen bij initialisatie opgeven wat het type is (select, update, delete, insert)

Computer Specs


Acties:
  • 0 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

Je kunt voor update, insert en delete beter gewoon een losse functie maken. En daar een array met WHERE values mee te geven, en bij insert de data + de velden ('field' => 'data').

En natuurlijk ook een tabel.

Deze functies kun je het beste in de Database klasse zetten.

Acties:
  • 0 Henk 'm!

  • Blaise
  • Registratie: Juni 2001
  • Niet online
Ik ben nieuwsgierig: wat ga je doen bij left/right/inner joins, of andere vormen van subqueries?

Acties:
  • 0 Henk 'm!

Verwijderd

Mij lijkt een query klasse schrijven onbegonnen werk en waar zit het voordeel? SQL is al zo opgesteld zodat het zo breed mogelijk gebruikt kan worden en tussen verschillende database systemen consistent is (is niet altijd zo helaas door verschillende dialecten).

Hoe wil je bijvoorbeeld een OR toevoegen aan je where statements? Of zoals hierboven JOINS maken? Volgens mij beperk je jezelf gigantisch door een query in een klasse te willen verpakken óf je klasse word zo complex dat het alsnog moeilijker is dan een simpele query in te voeren.

[ Voor 3% gewijzigd door Verwijderd op 22-06-2007 19:24 ]


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
ok zo heb ik het nu in principe ook. Maar de toString() van de hele klasse verscheelt dus door het type query dat je hebt. (Een UPDATE heeft SET A='B' etc). Dan zou je voor elke array een soort toString moeten maken.

Computer Specs


Acties:
  • 0 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

Blaise schreef op vrijdag 22 juni 2007 @ 19:22:
Ik ben nieuwsgierig: wat ga je doen bij left/right/inner joins, of andere vormen van subqueries?
Kijk naar het Zend Framework (Zend_Db_Select). Daar hebben ze al zoiets ;).

[ Voor 39% gewijzigd door kokx op 22-06-2007 19:27 ]


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Blaise schreef op vrijdag 22 juni 2007 @ 19:22:
Ik ben nieuwsgierig: wat ga je doen bij left/right/inner joins, of andere vormen van subqueries?
Idd dan word het al een stuk lastiger. Het is wel mogelijk maar de vraag is of je dan inderdaad niet beter gewoon db->execute($query); kan doen.

[ Voor 30% gewijzigd door GandalfTheGrey op 22-06-2007 19:27 ]

Computer Specs


Acties:
  • 0 Henk 'm!

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 10:08

Spockz

Live and Let Live

Het zou helemaal mooi zijn als je niet eens de mogelijkheid bied om queries uit te voeren, maar de DB class enkel bepaalde dingen laat serveren. Zo kan je heel makkelijk van db switchen zonder na te hoeven denken of het in de rest van je script nog wel goed gaat.

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Alleen als het systeem dan wat groter wordt heb je wel heel erg veel functies nodig om alle mogelijke queries uit te kunnen voeren.

Computer Specs


Acties:
  • 0 Henk 'm!

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 10:08

Spockz

Live and Let Live

Dat klopt, maar als je je eigen datamodel implementeert en ervoor zorgt dat degene die de plugins schrijven zich daarin kunnen hangen zit je ook goed.

Bovendien zou je er een soort van generator voor kunnen schrijven?

[ Voor 18% gewijzigd door Spockz op 22-06-2007 20:07 ]

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12:59
Kijk eens naar adodb, die besparen je veel werk!
http://adodb.sourceforge.net/

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

Ik vind adoDB niet echt handig werken. Je moet eigenlijk te veel onnodige functies gebruiken voor 1 query (om het resultaat te tonen vooral). Wat ik eigenlijk de beste DAAL vind, is pdo. Dit is een PHP extensie die er meestal al bijgevoegd wordt (je moet wel even de dll activeren op windows).
Pagina: 1