Hallo allemaal,

Ik ben bezig een beetje OOP te leren, en ben begonnen met een volgend script:
<?
class Connection {
protected $link, $server, $username, $password, $db;

public function setupconnection($server, $username, $password, $db)
{
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}

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.
    }
?>
Hmm, die zin snap ik al niet :)
iets als $this->server = $server? :)

Reinder
Ik wil het trouwens wel groot gaan toepassen :)
Tip: Ga niet het wiel voor de 2de keer uitvinden, maar maak gebruik van PDO.
Hier een goed artikel erover: http://www.phphulp.nl/php/tutorials/8/534/

Als je OOP wilt leren begin dan met iets als een Gastenboek of Fotoalbum oid.
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>');
}
}
}

try {
$connect = new Connection('server', 'username', 'wachtwoord', 'database');
}
catch (Exception $e) {
echo $e->getMessage ();
}
?>
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.
Als je dan toch al in OOP en php5 zit te werken, kijk dan meteen ook eens naar PDO en/of mysqli.
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';

class Statistieken
{
private $ip;
private $browser;
private $before = false;

public function getip()
{
if(preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$_SERVER['REMOTE_ADDR']))
{
$this->ip = $_SERVER['REMOTE_ADDR'];
return $this->ip;
}else{
$this->ip = 'Unknown';
return $this->ip;
}
}


public function getbrowser()
{
if(ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'], $log_version))
{
$this->browser = $log_version[0];
return $this->browser;
}elseif(ereg('Opera ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'], $log_version))
{
$this->browser = $log_version[0];
return $this->browser;
}elseif(ereg('Mozilla/([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'], $log_version))
{
$this->browser = substr($_SERVER['HTTP_USER_AGENT'], -16);
return $this->browser;
}else{
$this->browser = 'Anders';
return $this->browser;
}
}

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?
<?php
public function getip()
{
if(preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$_SERVER['REMOTE_ADDR']))
{
$this->ip = $_SERVER['REMOTE_ADDR'];
return $this->ip;
}else{
$this->ip = 'Unknown';
return $this->ip;
}
}
?>

De helft van deze functie is niet nodig. de array key $_SERVER['REMOTE_ADDR'] bevat altijd het ip adres.

<?php

public function getip
{
$this->ip = $_SERVER['REMOTE_ADDR'];
}

?>

is voldoende. Maar dat is opzich niet nodig je kunt hem natuurlijk ook direct toewijzen in je variablen.

edit: Jou functie zoals je hem nu hebt is ook niet IPv6 ready. Nu kunnen alleen de addressen van IPv4 mensen lezen.
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']
hmm die werkte ook niet gewoon in functie gestampt :) Werkt nu lekker alleen nog die verbinding buiten de functie halen

Reageren