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:


<?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 gebruikers:


<?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;
	}
	
}
?>


Ik roep de class zo aan:


<?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());
?>


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:


<?php
$test_variabele = 'test';

class Experiment {
    function test2(){
        return $test_variabele;
    }
}

$test = new Experiment;
echo($test->test2());
?>


[edit]
Dode link..

p.s. Ik gebruik PHP4, dus geen PHP5.
[/edit]
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;
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!
Aanvulling: en als je het dus echt netjes wilt doen, maak je een memberfunctie set_database in de klasse Gegevens.

Reageren