[OOP & MySQL] Aantal queries tellen
Ik heb er al eerder problemen mee gehad, destijds in een functie (Topic), en nu dus weer, maar dan in een class.
Ik wil dus het aantal queries tellen, en de totale tijd die benodigd was om alle queries uit te voeren. Nu dacht ik dat zo op te lossen:
Class database:
Class gebruikers:
Ik roep de class zo aan:
Nu krijg ik keurig de resultaten terug van de query, maar geen statistieken.
Ik heb het idee dat het aan de $database = new Database; (r 4 in de class Gebruikers), maar ik heb ook nog geen andere oplossing kunnen vinden voor het aanroepen van een class, in een class (dus class Database oproepen in class Gebruikers).
Moet ik nu alles in 1 grote class zetten? Moet ik dingen anders aanroepen?
Graag zou ik zo veel mogelijk tips, aan en opmerkingen willen. Aan de error-afhandeling ga ik nog werken, en ik ben me er van bewust dat nog niet alles klopt.
Ook is dit het eerste wat ik script in (wat ik hoop dat het is) OO stijl, hiervoor heb ik altijd alles in 'gewone' functies gedaan.
---
Oh ja, en kan iemand mij vertellen hoe ik in een class variabelen kan opvragen die gezet zijn voor de class? Voorbeeld:
Ik wil dus het aantal queries tellen, en de totale tijd die benodigd was om alle queries uit te voeren. Nu dacht ik dat zo op te lossen:
Class database:
Code (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
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
<?php
class Database {
var $link_database;
var $queries = 0;
var $tijd = 0;
var $server = 'localhost'; //DB server
var $username = ''; //DB username
var $password = ''; //DB password
var $database = ''; //DB database
function verbind(){
if($this->link_database = mysql_connect($this->server,$this->username,$this->password)){
if(mysql_select_db($this->database,$this->link_database)){
return true;
}else{
return false;
}
}else{
return false;
}
}
function query($input_query){
$tijd_start = microtime();
if(!isset($this->link_database)){
if(!$this->verbind()){
return false;
}
}
if($output_query = mysql_query($input_query,$this->link_database)){
$this->tijd += round(microtime() - $tijd_start,4);
$this->queries++;
return $output_query;
}else{
return false;
}
}
function statistiek(){
return array($this->queries,$this->tijd);
}
}
?>
class Database {
var $link_database;
var $queries = 0;
var $tijd = 0;
var $server = 'localhost'; //DB server
var $username = ''; //DB username
var $password = ''; //DB password
var $database = ''; //DB database
function verbind(){
if($this->link_database = mysql_connect($this->server,$this->username,$this->password)){
if(mysql_select_db($this->database,$this->link_database)){
return true;
}else{
return false;
}
}else{
return false;
}
}
function query($input_query){
$tijd_start = microtime();
if(!isset($this->link_database)){
if(!$this->verbind()){
return false;
}
}
if($output_query = mysql_query($input_query,$this->link_database)){
$this->tijd += round(microtime() - $tijd_start,4);
$this->queries++;
return $output_query;
}else{
return false;
}
}
function statistiek(){
return array($this->queries,$this->tijd);
}
}
?>
Class gebruikers:
Code (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
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
<?php
class Gegevens {
function gebruiker($input_gebruiker,$input_id){
$database = new Database;
$controle_gebruiker_array = array('id','loginnaam','email','voornaam','achternaam');
$input_gebruiker_array = explode(',',$input_gebruiker);
if(empty($input_id) OR !ctype_digit($input_id)){
return false;
}
foreach($input_gebruiker_array as $waarde){
if(!in_array($waarde,$controle_gebruiker_array)){
return false;
}
}
$query_gebruiker = "SELECT `";
$query_gebruiker .= implode("`, `",$input_gebruiker_array);
$query_gebruiker .= "` FROM `gebruikers` WHERE `id` = ";
$query_gebruiker .= $input_id;
$query_gebruiker .= " LIMIT 1";
$result_gebruiker_array = mysql_fetch_assoc($database->query($query_gebruiker));
return $result_gebruiker_array;
}
}
?>
class Gegevens {
function gebruiker($input_gebruiker,$input_id){
$database = new Database;
$controle_gebruiker_array = array('id','loginnaam','email','voornaam','achternaam');
$input_gebruiker_array = explode(',',$input_gebruiker);
if(empty($input_id) OR !ctype_digit($input_id)){
return false;
}
foreach($input_gebruiker_array as $waarde){
if(!in_array($waarde,$controle_gebruiker_array)){
return false;
}
}
$query_gebruiker = "SELECT `";
$query_gebruiker .= implode("`, `",$input_gebruiker_array);
$query_gebruiker .= "` FROM `gebruikers` WHERE `id` = ";
$query_gebruiker .= $input_id;
$query_gebruiker .= " LIMIT 1";
$result_gebruiker_array = mysql_fetch_assoc($database->query($query_gebruiker));
return $result_gebruiker_array;
}
}
?>
Ik roep de class zo aan:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
error_reporting(E_ALL);
require('database.php');
require('gegevens.php');
$gegevens = new Gegevens;
$database = new Database;
print_r($gegevens->gebruiker('id,loginnaam','2'));
print_r($database->statistiek());
?>
error_reporting(E_ALL);
require('database.php');
require('gegevens.php');
$gegevens = new Gegevens;
$database = new Database;
print_r($gegevens->gebruiker('id,loginnaam','2'));
print_r($database->statistiek());
?>
Nu krijg ik keurig de resultaten terug van de query, maar geen statistieken.
Ik heb het idee dat het aan de $database = new Database; (r 4 in de class Gebruikers), maar ik heb ook nog geen andere oplossing kunnen vinden voor het aanroepen van een class, in een class (dus class Database oproepen in class Gebruikers).
Moet ik nu alles in 1 grote class zetten? Moet ik dingen anders aanroepen?
Graag zou ik zo veel mogelijk tips, aan en opmerkingen willen. Aan de error-afhandeling ga ik nog werken, en ik ben me er van bewust dat nog niet alles klopt.
Ook is dit het eerste wat ik script in (wat ik hoop dat het is) OO stijl, hiervoor heb ik altijd alles in 'gewone' functies gedaan.
---
Oh ja, en kan iemand mij vertellen hoe ik in een class variabelen kan opvragen die gezet zijn voor de class? Voorbeeld:
Code (php)
Edit:
Dode link..
p.s. Ik gebruik PHP4, dus geen PHP5.
Dode link..
p.s. Ik gebruik PHP4, dus geen PHP5.
Gewijzigd op 01/01/1970 01:00:00 door Andries Louw Wolthuizen
Je kunt zorgen dat de ene class een membervariabele wordt van een andere class:
Code (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
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
<?php
class test1 {
var $naam;
function test1 ($naam) {
$this->naam = $naam;
}
}
class test2 {
var $test;
var $plaats;
function test2 ($plaats) {
$this->plaats = $plaats;
}
function show_info () {
foreach ($this as $key => $value) {
echo '<p>' . $ker . ': ' . $value . '</p>';
}
}
}
$t1 = new test1 ('jantje');
$t2 = new test2 ('alkmaar');
$t2->test = $t1;
$t2->show_info ();
?>
class test1 {
var $naam;
function test1 ($naam) {
$this->naam = $naam;
}
}
class test2 {
var $test;
var $plaats;
function test2 ($plaats) {
$this->plaats = $plaats;
}
function show_info () {
foreach ($this as $key => $value) {
echo '<p>' . $ker . ': ' . $value . '</p>';
}
}
}
$t1 = new test1 ('jantje');
$t2 = new test2 ('alkmaar');
$t2->test = $t1;
$t2->show_info ();
?>
@Jan:
Dus, als ik het goed begrijp:
En in gegevens:
Zo ongeveer?
Dus, als ik het goed begrijp:
En in gegevens:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
class Gegevens{
var $database;
function gebruiker($input_gebruiker,$input_id){
(...)
$result_gebruiker_array = mysql_fetch_assoc($database->query($query_gebruiker));
(...)
}
}
?>
class Gegevens{
var $database;
function gebruiker($input_gebruiker,$input_id){
(...)
$result_gebruiker_array = mysql_fetch_assoc($database->query($query_gebruiker));
(...)
}
}
?>
Zo ongeveer?
@Jan, op die manier vergeet je iets belangrijks van OOP , information hiding.
Wijzig zo min mogelijk variabelen binnen de classe rechtstreeks van buiten, zorg dat je dit via een zo genaamde set methode (is een netter woord voor maar dat kan ik zo even niet bedenken) doet. In dit geval zou het misschien ook voldoen deze via de constructor mee tegeven.
Wijzig zo min mogelijk variabelen binnen de classe rechtstreeks van buiten, zorg dat je dit via een zo genaamde set methode (is een netter woord voor maar dat kan ik zo even niet bedenken) doet. In dit geval zou het misschien ook voldoen deze via de constructor mee tegeven.
Edit:
The magic word: mutator method
Gewijzigd op 01/01/1970 01:00:00 door Bo az
@ Andries: Ja precies!
@ Boaz: heb je gelijk in. Voor elke membervariabelen set- en get-methoden in verband met data hiding, plus dat je controle en foutafhandeling aan de class kunt overlaten.
@ Boaz: heb je gelijk in. Voor elke membervariabelen set- en get-methoden in verband met data hiding, plus dat je controle en foutafhandeling aan de class kunt overlaten.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
@Jan:
Ok, ik heb nu dit:
Class database:
Class gebruikers:
Ik roep nu aan met:
Maar ik krijg een 2 tal errors op lijn 24 in de class gebruikers:
Notice: Undefined variable: database (on line 24 class gebruikers)
En:
Fatal error: Call to a member function query() on a non-object (on line 24 class gebruikers)
Hoe moet ik dit oplossen?
Ok, ik heb nu dit:
Class database:
Class gebruikers:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
class Gegevens {
var $database;
function gebruiker($input_gebruiker,$input_id){
(...) Line 24:
$result_gebruiker_array = mysql_fetch_assoc($database->query($query_gebruiker));
(...)
}
}
?>
class Gegevens {
var $database;
function gebruiker($input_gebruiker,$input_id){
(...) Line 24:
$result_gebruiker_array = mysql_fetch_assoc($database->query($query_gebruiker));
(...)
}
}
?>
Ik roep nu aan met:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
error_reporting(E_ALL);
require('database.php');
require('gegevens.php');
$database = new Database;
$gegevens = new Gegevens;
$gegevens->database = $database;
print_r($gegevens->gebruiker('id,loginnaam','2'));
print_r($database->statistiek());
?>
error_reporting(E_ALL);
require('database.php');
require('gegevens.php');
$database = new Database;
$gegevens = new Gegevens;
$gegevens->database = $database;
print_r($gegevens->gebruiker('id,loginnaam','2'));
print_r($database->statistiek());
?>
Maar ik krijg een 2 tal errors op lijn 24 in de class gebruikers:
Notice: Undefined variable: database (on line 24 class gebruikers)
En:
Fatal error: Call to a member function query() on a non-object (on line 24 class gebruikers)
Hoe moet ik dit oplossen?
Gewijzigd op 01/01/1970 01:00:00 door Andries Louw Wolthuizen
Regel 9 zou nu zo moeten:
print_r($gegevens->database->statistiek());
print_r($gegevens->database->statistiek());
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
Ok, ik heb ook regel 9 aangepast, maar de fout op regel 24 is er nog steeds. Op een of andere manier kan ik dus zo de class niet inladen, of wordt $database niet gezet in class gegevens.
Heeft iemand nog een idee?
Heeft iemand nog een idee?
Verander deze regel:
$result_gebruiker_array = mysql_fetch_assoc($database->query($query_gebruiker));
in dit:
$result_gebruiker_array = mysql_fetch_assoc($this->database->query($query_gebruiker));
Je moet dan wel zorgen dat de membervariabele database al is toegekend.
$result_gebruiker_array = mysql_fetch_assoc($database->query($query_gebruiker));
in dit:
$result_gebruiker_array = mysql_fetch_assoc($this->database->query($query_gebruiker));
Je moet dan wel zorgen dat de membervariabele database al is toegekend.
@Jan:
Hartelijk dank! Dat was de oplossing! Ik begin nu ook te snappen hoe ik variabelen toeken in een class, bedankt!
Hartelijk dank! Dat was de oplossing! Ik begin nu ook te snappen hoe ik variabelen toeken in een class, bedankt!
Ok, nog 1 klein vraagje:
Ik probeer nu variabelen van buiten af in de class te krijgen door:
En in database class:
Echter komen nu de variabelen niet aan, hoe moet dit anders?
Ik probeer nu variabelen van buiten af in de class te krijgen door:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
require('database.php');
require('gegevens.php');
$database = new Database;
$database->server = 'localhost'; //DB server
$database->username = ''; //DB username
$database->password = ''; //DB password
$database->database = ''; //DB database
$gegevens = new Gegevens;
$gegevens->database = new Database;
?>
require('database.php');
require('gegevens.php');
$database = new Database;
$database->server = 'localhost'; //DB server
$database->username = ''; //DB username
$database->password = ''; //DB password
$database->database = ''; //DB database
$gegevens = new Gegevens;
$gegevens->database = new Database;
?>
En in database class:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class Database {
var $link_database;
var $queries = 0;
var $tijd = 0;
var $server;
var $username;
var $password;
var $database;
function verbind(){
if($this->link_database = mysql_connect($this->server,$this->username,$this->password)){
if(mysql_select_db($this->database,$this->link_database)){
(...)
}
}
}
}
?>
class Database {
var $link_database;
var $queries = 0;
var $tijd = 0;
var $server;
var $username;
var $password;
var $database;
function verbind(){
if($this->link_database = mysql_connect($this->server,$this->username,$this->password)){
if(mysql_select_db($this->database,$this->link_database)){
(...)
}
}
}
}
?>
Echter komen nu de variabelen niet aan, hoe moet dit anders?
Dat komt door regel 9 van je eerste voorbeeld. Daar doe je:
$gegevens->database = new Database;
maar dan ken je gewoon een nieuw (dus leeg) object toe. Je moet simpelweg het zojuist aangemaakte (en gevulde) object toekennen:
$gegevens->database = $database;
$gegevens->database = new Database;
maar dan ken je gewoon een nieuw (dus leeg) object toe. Je moet simpelweg het zojuist aangemaakte (en gevulde) object toekennen:
$gegevens->database = $database;
En alweer bedankt, nu denk ik dat ik voorlopig wel weer even zoet ben met de rest van het systeem te programmeren.
Bedankt voor je hulp Jan!
Bedankt voor je hulp Jan!
Aanvulling: en als je het dus echt netjes wilt doen, maak je een memberfunctie set_database in de klasse Gegevens.




