Ik ben bezig een beetje OOP te leren, en ben begonnen met een volgend script:
<?
class Connection {
protected $link, $server, $username, $password, $db;
protected function connect()
{
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
}
}
$connect = new Connection();
$connect->setupconnection('server', 'username', 'wachtwoord', 'database');
?>
Maar mijn vraag: Wat is hier nou "beter" aan dan gewoon even te typen:
mysql_connect(bla);
mysql_select_db(bla,bla);
???
Ik vind het er trouwens wel stoer uit zien :P
Op zo'n kleine schaal heeft OOP weinig 'beters'. Het voordeel van OOP is schaalbaarheid en onderhoudbaarheid omdat je modulair werkt, dus met blokken herbruikbare code.
In je class Connection heb je overigens nog een constructor nodig, die er zo uitziet:
<?php
public function __construct () {
// hier de dingen die je wilt uitvoeren als er een nieuwe instantie van je class aangemaakt wordt.
}
?>
Probeer zo eens (niet gecheckt):
<?php
class Connection {
public function __construct ($db_host, $db_user, $db_pass, $db_name) {
if (!mysql_connect ($db_host, $db_user, $db_pass)) {
throw new Exception ('<p>Connectie met DB is mislukt.</p>');
}
if (!mysql_select_db ($db_name)) {
throw new Exception ('<p>Fout bij het selecteren van de database</p>');
}
}
}
Wat ik zelf een groot voordeel vind is dat je veeeeel minder dubbele code hebt als dat je alleen functies gebruikt.
Waardoor je applicatie dus veel beter te beheren is, niet dat je iets aanpast en het ergens anders vergeet en alles in de soep loopt (dat kennen we allemaal denk ik wel).
Dat is hoe ik het ervaar.
Ben me toch nog maar wat meer gaan verdiepen, ben inmiddels begonnen met een heel erg simpel statistieken systeem, maar kom er niet helemaal uit met mysqli:
<?
/**
CREATE TABLE `nl_stats` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`datum` DATE NOT NULL,
`ip` VARCHAR( 80 ) NOT NULL ,
`browser` VARCHAR( 80 ) NOT NULL ,
`hits` INT( 10 ) NOT NULL ,
PRIMARY KEY ( `id` )
);
**/
$server = 'localhost';
$user = 'username';
$password = 'password';
$database = 'database';
public function checkbefore()
{
global $server;
global $user;
global $password;
global $database;
$mysqli = new mysqli($server, $user, $password, $database);
if(mysqli_connect_errno())
{
trigger_error('Er is een fout opgetreden tijdens het verbinden: '.$mysqli->error);
}
$sql = "SELECT datum FROM nl_stats WHERE ip = '".$this->getip()."'";
if(!$result = $mysqli->query($sql))
{
trigger_error('Fout in query: '.$mysqli->error);
}
else
{
//doe iets extras
}
}
}
?>
Wat is mijn probleem nu: Als ik zo doorwerk dan moet ik net als in checkbefore() aldoor opnieuw een verbinding opzetten met mijn database. Hoe zet ik de mysqli in een object die ik kan aanroepen binnen mijn functies zoals checkbefore. Dus ik wil in mijn functie checkbefore hebben staan:
<?php
public function checkbefore()
{
$sql = "SELECT datum FROM nl_stats WHERE ip = '".$this->getip()."'";
if(!$result = $mysqli->query($sql))
{
trigger_error('Fout in query: '.$mysqli->error);
}
else
{
//doe iets extras
}
}
?>
Dus zonder telkens de variabelen te moeten importeren en een nieuwe mysqli op te zetten? Iemand enig idee (of snapt iemand überhaupt wat ik bedoel)? Of iemand tips over mijn script?
Ok das al iets, ik denk dat mijn logisch nadenken nog even aan moet worden gezet, logisch dat die $_SERVER al een IP geeft :P
IPv6 is toch irritant (die crasth thuis mijn internetverbinding :P dus lekker uitgezet) maar kun je die niet ook gewoon ophalen met $_SERVER?
en ik heb nu:
private $ip = $_SERVER['REMOTE_ADDR']