ik heb een vraag, ik ben bezig met een mysql class omdat ik een site aan het maken ben met een cms, dus moet veel met database werken. daarom dacht ik dat het makkelijker was om een class te gebruiken om het te vereenvoudigen.

ik heb nu dit

<?php

/**
* @author Leon Kuipers
* @copyright 2012
*/

$dbnaam = 'test';

class mysql
{
private $wachtwoord, $verbinding;
public $dbnaam, $regles, $a_regels , $resultaat, $data, $naam;
private $host = 'localhost';


public function setup($naam, $wachtwoord)
{
$this->naam = $naam;
$this->wachtwoord = $wachtwoord;
}
public function mysql_verbinding($db)
{
if(!$this->$naam)
{
$this->naam = 'root';
}
if (isset($this->wachtwoord))
{
$this->wachtwoord = '';
}
$this->dbnaam = $db;
$this->id = mysql_connect($this->host, $this->naam, $this->wachtwoord)
or (mysql_error('Kan geen verbinding maken'));
}

public function database_selecteren($dbnaam)
{
mysql_select_db($db , $this->id) or (mysql_error('Kan de database niet selecteren'));
}

public function query_stukje ($query)
{
$this->resultaat = mysql_query($query, $this->id) or (mysql_error('Kan het stukje data niet ophalen.'));
$this->regels = mysql_num_rows($this->resultaat) or (mysql_error('Er mislukte iets met het tellen.'));
$this->a_regels = mysql_affected_rows($this->resultaat) or (mysql_error('Er ging iets mis met de functie affected_rows.'));
$this->data = mysql_fetch_assoc($this->resultaat) or (mysql_error('Er ging iets mis bij het ophalen van een stukje data.'));
return $this->data[0];
}

public function query_regel ($query)
{
$this->resultaat = mysql_query($query, $this->id) or (mysql_error('Kan de regel data kan niet ophalen.'));
$this->regels = mysql_num_rows($this->resultaat) or (mysql_error('Er mislukte iets met het tellen.'));
$this->a_regels = mysql_affected_rows($this->resultaat) or (mysql_error('Er ging iets mis met de functie affected_rows.'));
$this->data = mysql_fetch_assoc($this->resultaat) or (mysql_error('Er ging iets mis bij het ophalen van een regel data.'));
return $this->data;
}

public function assoc_dupliceren($regel)
{
mysql_data_seek($this->resultaat) or (mysql_error('Er is iets fout gegeaan bij het dupliceren met seek'));
$this->data = mysql_fetch_assoc($this->resultaat) or (mysql_error('Er ging iets mis bij het ophalen van duplo.'));
}

public function update ($query)
{
$this->resultaat = mysql_query($query, $this->id) or (mysql_error('Kan de regel data kan niet updaten.'));
$this->a_regels = mysql_affected_rows($this->result) or (mysql_error('Er ging iets mis met de functie affected_rows.'));
}
public function verwijderen ($query)
{
$this->resultaat = mysql_query($query, $this->id) or (mysql_error('Kan het stukje data verwijderen'));
$this->a_regels = mysql_affected_rows($this->result) or (mysql_error('Er ging iets mis met de functie affected_rows.'));
}

}

?>

maar als ik verbinding wil maken krijg ik elkekeer een error. ( ik weet dat me fout afhandeling niet goed is maar dit is nog puur om te testen)!

de errors zijn:

Notice: Undefined variable: naam in C:\wamp\www\_incl\mysql_class.php on line 24
Fatal error: Cannot access empty property in C:\wamp\www\_incl\mysql_class.php on line 24

ik heb de class zo aangeroeppen
<?php
include 'mysql_class.php';
$dbnaam = 'test';

$b = new mysql();
$b->setup('root', '');
$b->mysql_verbinding($dbnaam);
?>

als iemand mijn wil helpen ben ik hem dankbaar
Afgezien dat ik helemaal niet zo'n fan ben van dit soort classes, moet dit:

<?php

if (isset($this->wachtwoord))
{
  $this->wachtwoord   = '';
}

?>


niet zijn:


<?php

if (!isset($this->wachtwoord))
{
  $this->wachtwoord   = '';
}

?>
( ik weet dat me fout afhandeling niet goed is maar dit is nog puur om te testen)

Als je een huis bouwt bouw je toch ook eerst de fundering voor je verder gaat? Foutafhandeling is de basis van PHP zonder foutafhandeling kun jij niet debuggen en kan de gebruiker geen goed gebruik maken van je site. Foutafhandeling is het eerste wat je goed moet hebben, pas dan kun je pas gaan scripten.

Begin dus eerst met een goede foutafhandeling te gebruiken.

En kijk zelf eens naar het verschil tussen wat je hebt op regel 24 en op regel 25, teken voor teken. Valt je dan niks op?

Ook raad ik aan klassenamen met een hoofdletter te beginnen. En eens te gaan kijken naar PDO of MySQLi, hierdoor heb je hetgeen je hierboven hebt helemaal niet meer nodig.
Ook kun je de setup functie veel beter in de constructor zetten.

En waarom definieer je 2 keer $dbnaam? 1 keer is genoeg. Ook kun je mysql_ uit de mysql_ verbinding halen. Aangezien de method in de Mysql klasse zit moet het wel heel raar lopen wil het geen mysql verbinding zijn.
oke dank jullie wel voor de snelle recaties, en ik snap het en ga er aan werken.
trouwens die ene fout op regel 24 is wel erg dom. ik denk dat ik het over het hoofd heb gezien. als ik er mee klaar ben zal ik het opnieuw posten. nogmaals bedankt voor de snelle reacties.


[size=xsmall]Toevoeging op 09/05/2012 23:02:29:[/size]

wat vinden jullie trouwens van mijn ( indeeling van scripten ) is het overzichtelijk of niet?
Nou, op zich is de code wel goed te lezen. :)
Maar zoals ik al aangaf ben ik niet zo'n fan van dit soort database constructies.
Ik zou zoals Wouter J al aangaf meer voor een constructor gaan.
Ook ben ik er meer voor om benamingen in het engels te zetten.

Maar goed, als het een eerste test opzet is, dan kan er nog veel aan verbeterd worden he. Dus zou zeggen als je verder bent, laat hem nog eens bekijken.

EDIT:
Om je een tip te geven in je vervolg poging, kijk eens of je het meer onafhankelijk kunt maken. Dit werkt alleen als je een Mysql database hebt. Maar in OO is je code uitbreidbaar, dus zou logischer zijn als je ook andere soorten databases kunt aanspreken met de zelfde code.
Ik zou daar eens eerst even wat verder over nadenken.
Bart, let wel op hè. Dit is slechts een klasse geen OO. Als je OO gaat heb je naar mijn mening eigenlijk helemaal niet zo'n klasse nodig (op een ORM na dan). Dan 'moet' je werken met dingen als DataMappers enzo.

Tevens zou ik 1 overkoepelende interface maken die je vervolgens uitbouwt per aparte adapter. Een beetje het adapter pattern:
<?php
abstract class Database
{
protected $link_id;
protected $host, $user, $pass;
protected $db;

public function __construct($host, $user, $pass, $db)
{
// setters voor host, user, pass en db
}

abstract public function connect();
abstract public function executeQuery($query, array $placeholders = array());
abstract protected function parseQuery($query, array $placeholders = array());
}

class MySQLDataBase extends Database
{
public function connect()
{
$this->link_id = // mysql_connect;
// foutafhandeling
return $this->link_id;
}

public function executeQuery($query, array $placeholders = array())
{
// mysql_query($this->parseQuery($query, $placeholders));
// foutafhandeling
return $result;
}

public function parseQuery($query, array $placeholders = array())
{
// parse query met placeholders
}
}

abstract class PDODatabase extends Database
{
public function executeQuery($query, array $placeholders = array())
{
// $this->link_id->execute($this->parseQuery($query, $placeholders));
// foutafhandeling
return $result;
}
}

class MySQLPDODatabase extends PDODatabase
{
public function connect()
{
// new PDO(...)
}

public function parseQuery($query, array $placeholders = array())
{
$stmt = $this->link_id->prepare($query);
// $stmt->bindParam(...) voor elke placeholder

return $stmt;
}
}
// en zo verder
?>
Ziet er opzich leuk uit.
Persoonlijk zou ik zoals Wouter & Bart ook al aangeven gaan voor de __construct()
en een betere foutafhandeling (ook al is het een 'test')
Kijk bijvoorbeeld eens naar try/catch Exceptions...

Wat ik zelf doe in classes is een soort Debug_mode erin maken zodat je heel veel kan checken en kijken waar het eventueel fout gaat (nu ga ik daarin misschien een beetje ver maar dan weet je in elk geval zeker dat alles 'live' gaat werken)

Bart, let wel op hè. Dit is slechts een klasse geen OO. Als je OO gaat heb je naar mijn mening eigenlijk helemaal niet zo'n klasse nodig (op een ORM na dan). Dan 'moet' je werken met dingen als DataMappers enzo.


Nee, uiteraard niet Wouter ;)
Het viel mij gewoon op dat het browseltje van de TS alleen echt maar 1 ding kon doen.
En daar reageerde ik eigenlijk op om hem wat verder er over na te laten denken:
'als het ooit anders gaat worden'.
Ik weet niet hoe ver de TS is in de OO gedachten gang.
Vandaar dat ik het dus ook wat lichtjes bracht zonder meteen met zware, taaie termen te komen. ;)

Overigens ben ik wel gecharmeerd van jou voorbeeld code.
Dat ziet er al een stuk netter uit. Complimenten daarvoor.
Hopende dat de TS hier wat aan heeft. ;)
nu heb ik nog een vraag met bedtrekking tot het script

<?php

/**
* @author Leon Kuipers
* @copyright 2012
*/


class Mysql
{
private $wachtwoord, $verbinding;
public $dbnaam, $regles, $a_regels , $resultaat, $data, $naam, $bericht;
private $host = 'localhost';


public function __construct($naam, $wachtwoord)
{
$this->naam = $naam;
$this->wachtwoord = $wachtwoord;
}

private function error_bericht($bericht)
{
$this->bericht = "<font color=\"#FF0000\"><p>Error: ".$bericht.":";
$this->bericht .= mysql_error();
$this->bericht .= "</font>\n";
die($this->bericht);
}

public function verbinding($dbnaam)
{
if(isset($this->naam))
{
$this->naam = 'root';
}
if (isset($this->wachtwoord))
{
$this->wachtwoord = '';
}
$this->dbnaam = $dbnaam;
$this->id = mysql_connect($this->host, $this->naam, $this->wachtwoord) or $this->error_bericht('Kan geen verbinding maken');
}

public function database_selecteren($dbnaam)
{
mysql_select_db($dbnaam , $this->id) or $this->$this->error_bericht('De database kan niet geselecteerd worden');
}

public function query_stukje ($query)
{
$this->resultaat = mysql_query($query, $this->id) or $this->error_bericht('Er is een probleem met de query om een stukje data op te halen.');
$this->regels = mysql_num_rows($this->resultaat) or $this->error_bericht('Er mislukte iets met het tellen.');
$this->a_regels = mysql_affected_rows($this->resultaat) or $this->error_bericht('Er ging iets mis met de functie affected_rows.');
$this->data = mysql_fetch_assoc($this->resultaat) or $this->error_bericht('Er ging iets mis bij het ophalen van een stukje data.');
return $this->data[0];
}

public function query_regel ($query)
{
$this->resultaat = mysql_query($query, $this->id) or $this->error_bericht('Er is een probleem met de query om de regel data kan niet ophalen.');
$this->regels = mysql_num_rows($this->resultaat) or $this->error_bericht('Er mislukte iets met het tellen.');
$this->a_regels = mysql_affected_rows($this->resultaat) or $this->error_bericht('Er ging iets mis met de functie affected_rows.');
$this->data = mysql_fetch_assoc($this->resultaat) or $this->error_bericht('Er ging iets mis bij het ophalen van een regel data.');
return $this->data;
}

public function assoc_dupliceren($regel)
{
mysql_data_seek($this->resultaat) or $this->error_bericht('Er is iets fout gegeaan bij het dupliceren met seek');
$this->data = mysql_fetch_assoc($this->resultaat) or $this->error_bericht('Er ging iets mis bij het ophalen van duplo.');
}

public function update ($query)
{
$this->resultaat = mysql_query($query, $this->id) or $this->error_bericht('Er is een probleem met de query om de regel data kan niet updaten.');
$this->a_regels = mysql_affected_rows($this->result) or $this->error_bericht('Er ging iets mis met de functie affected_rows.');
}
public function verwijderen ($query)
{
$this->resultaat = mysql_query($query, $this->id) or $this->error_bericht('Er is een probleem met de query om het stukje data verwijderen');
$this->a_regels = mysql_affected_rows($this->result) or $this->error_bericht('Er ging iets mis met de functie affected_rows.');
}

}


?>

ik dacht dat ik zo een mooie faut afhandeling had ( maar krijg een error
Catchable fatal error: Object of class Mysql could not be converted to string in C:\wamp\www\_incl\mysql_class.php on line 46

waarom zou dit niet kunnen ( klinkt misschien dom maar ben nog groen op het gebied vanc classes

[size=xsmall]Toevoeging op 09/05/2012 23:46:51:[/size]

ps heb express een verkeerde databse naam gebruikt om te kijken of het werkte
kijk hier eens naar:
<?PHP
(46) $this->$this->error_bericht
?>

waarschijnlijk een kleine typo :P

<?php
   mysql_select_db($dbnaam , $this->id) or $this->$this->error_bericht('De database kan niet geselecteerd worden'); 
?>


Moet zijn:

<?php
   mysql_select_db($dbnaam , $this->id) or $this->error_bericht('De database kan niet geselecteerd worden'); 
?>


EDIT:
Marco was me voor. :S

Reageren