Dames, Heren,

class database extends bootstrap
class kenteken extends bootstrap

Vrij logisch dat ik vanuit kenteken niet $this->db->query($sql); kan doen.

MAAR, als ik in bootstrap het volgende doe in mijn constructor:

if(!class_exists('Database')){
                include_once('/var/www/KosLib/config/database.php');
                $this->db = new Database();


Waarom werkt het dan alsnog niet?
Je zit wel in de goede richting ;)

$bt = new bootstrap(new kenteken());
$bt->getKenteken()->checkNumbers();


Zoiets

Edit: een autoloader is ontzettend simpel te maken, kijk naar dit voorbeeld:

<?php
spl_autoload_register(function($clazz) {
    if(file_exists($clazz .'.php')) include $clazz .'.php';
});
?>


Stop dit als autoload.php in dezelfde folder waar al je classes staan, en je hoeft alleen nog maar
require 'autoload.php';
te doen en dan kun je gewoon al je classes aanroepen
En als ik nou vanuit de kenteken class de database wil benaderen.

Declareren in bootstrap als $this->db = new Database;

Benaderen in kenteken als ?
Chi Lion op 07/10/2013 08:01:01

En als ik nou vanuit de kenteken class de database wil benaderen.

Declareren in bootstrap als $this->db = new Database;

Benaderen in kenteken als ?


Dat kan... als je in de bootstrap al een databaseverbinding wilt openen en die vervolgens wilt doorgeven aan alle klassen die de databaseverbinding nodig hebben.


<?php
// Databaseverbinding openen
$dbh = new Database();
// Databasehandle meegeven aan de klasse Kenteken
$kenteken = new Kenteken($dbh);
?>


Je kunt het openen van de databaseverbinding echter ook uitstellen door de databaseverbinding pas in klasse Kenteken te openen.

Dat is een keuze. Hebben andere klassen dezelfde databaseverbinding nodig? En heeft de klasse Kenteken altijd meteen een geopende databaseverbinding nodig? Is het antwoord op beide vragen "nee", dan zou ik de klasse Kenteken het eigen databaseverkeer intern laten afhandelen.
Beide antwoorden zijn ja.

Ik heb nu het volgende:

Bestand dat 'framework' nodig is:

<?php

//@author Chilion Snoek <c.snoek@******.nl>

require_once '../../index.php';


if($_POST['submit'] == "Vraag op"){
    print_r($_POST);
    
    $KosC->db->query('koeien');
}

?>

<form action="#" method="POST" >
    <label for="sysNr">Systeemnummer</label><input type="text" name="sysNr" id="sysNr" /><br />
    <label for="debNr">Debiteurnummer</label><input type="text" name="debNr" id="debNr" /><br />
    
    <input type="submit" value="Vraag op" name="submit" />
</form>



Vervolgens required die dus index.php:

<?php

error_reporting(E_ALL);
//@author Chilion Snoek <c.snoek@******.nl>


require_once 'core/KosController.php';

$KosC = new KosController();
?>


Die initieert dus de basecontroller zeg maar.

<?php

//@author Chilion Snoek <c.snoek@******.nl>

class KosController
{
    public $db;
    
    function __construct()
    {
       
        //require standard classes file.
 
       require('../../config/database.php');
       $this->db = new Database();
        
    }

    function __autoload($className)
    {
        
        if(file_exists('../controllers/'.$className . '.php')) {
            require_once('../controllers/'.$className . '.php');    
        } 
        
        else {
            throw new Exception("Unable to load $className.");
        }
    }
    
    
    
   
}
?>


KosController haalt dus de DB op, in de DB zit de volgende functie:

<?php
function query($sql, $database = null)
    {
        exit('query gestart?');
        $result = mysqli_query($this->connect($database), $sql);
        
        return mysqli_fetch_object($result);
        
    }
?>


Ik krijg nu keurig op mijn scherm 'query gestart' terug.
maw, ea werkt.

Echter, is dit zoals het hoort? Netjes, veilig en vooral "zoals het hoort"?

ik mis elke vorm van foutafhandeling en de autoload functie (het is geen method) hoort niet in een klasse.

Tevens heb je een front controller die de database aanmaakt en deze doorgeeft aan de controller, de controller moet niet zelf een database aanmaken.
Foutafhandeling ontbreekt inderdaad nog. Nog niet ingebouwd ivm niet weten of dit zo goed is.
Kun je :
Tevens heb je een front controller die de database aanmaakt en deze doorgeeft aan de controller, de controller moet niet zelf een database aanmaken.


uitleggen?

Reageren