CodeigniterEen solide basis

De verbinding met een database maken

CodeIgniter - de verbinding met een database maken

 

Er zullen weinig web applicaties zijn welke zonder een database werken.

 

Codeigniter heeft daar zijn eigen voorzieningen voor.

 

Het instellen van de database

 

Hier gebruiken we de world database van MySQL zelf voor.

Download link

 

Plaats de sql file in de database world.

Het artikel zal van deze database uitgaan.

 

We dienen CodeIgniter wel te vertellen dat er een database gebruikt gaat worden en welke database dat is.

 

Allereerst dienen we Codeigniter te vertellen dat er een database gebruikt gaat worden.

Dit doen we door aan de configuratie file autoload.php de library database te activeren.

Je kunt ook de library aanroepen op het moment dat deze nodig is, maar de kans op het vergeten aan te roepen of het vele type werk wat hier extra bij komt kun je voorkomen door deze library bij het aanroepen van de applicatie al beschikbaar te maken

 
    pad naar de file autoload.php  
./system/application/config/autoload.php
 

 

Verander het volgende

 
    van  
$autoload['library'] = array();
 
    naar  
$autoload['library'] = array('database');

 

Het kan zijn dar er al library's zijn toegevoegd.

De syntax voor het bijvoegen van een library is :

 
$autoload['library'] = array('library_naam', 'database');

 

Daarna gaan we CodeIgniter vertellen welke database gebruikt dient te worden en welke de aanmeld gegevens zijn.

Dit doen we in de configuratie file database.php

 
    pad naar de file database.php  
./system/application/config/database.php
 

 

Verander het volgende

 
    van  
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "";
$db['default']['password'] = "";
$db['default']['database'] = "";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
 
    naar  
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "inlog_naam";
$db['default']['password'] = "uw_wachtwoord";
$db['default']['database'] = "uw_database_naam";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";

 

De controller voor het uitlezen van de tabel

 

Er vanuit gaande dat de standaard controller welkom.php is,

( zie hiervoor het voorgaande artikel) ,

ga ik de standaard functie van die controller ( index ) gebruiken om de MySQL tabel uit te lezen.

 

Om het gehele plaatje van Model, Controller, View rond te krijgen zal ik in alle 3 de secties iets gaan schrijven.

In de Model sectie het gedeelte van de interactyie met de database.

In de View sectie het gedeelte van het weergeven van alle informatie in HTML.

En als verbindende schakel in de Controller sectie het oproepen van de database gegevens en het koppelen van deze gegevens met de view en het weergeven van de view

 

De controller welkom.php

 

    pad naar de controller file welkom.php  
./system/application/controllers/welkom.php
 

Deze ziet er als volgt uit

 
<?php

class Welkom extends Controller {

    function 
Welkom()
    {
        
parent::Controller();    
    }
    
    function 
index()
    {        
        
$this->load->view('welkom');
    }
    
}
/* End of file welkom.php */
/* Location: ./system/application/controllers/welkom.php */

 

Om te zorgen dat we niet teveel aanpassingen later dienen te maken heb ik de controller aangepast.

Er gaan nu 3 view's aangeroepen worden.

  • header
  • inhoud
  • footer

Hierdoor hoef je bij een aanpassing van de daarwerkelijke inhoud alleen view inhoud.php aan te passen.

En inderdaad gebruik ik geen php extensie bij de view's.

Codeigniter is slim genoeg om deze zelf te plaatsen

 

De controller welkom.php gaat er als volgt uitzien

 
<?php

class Welkom extends Controller {

    function 
Welkom()
    {
        
parent::Controller();    
    }
    
    function 
index()
    {        
        
$this->load->view('header');
        
$this->load->view('inhoud');
        
$this->load->view('footer');        
    }
    
}
/* End of file welkom.php */
/* Location: ./system/application/controllers/welkom.php */

 

De view's

De view header.php gaat er als volgt uitzien

 
<html>
<head>
<title>Welkom bij CodeIgniter</title>

<style type="text/css">
body {
 background-color: #fff;
 margin: 40px;
 font-family: Lucida Grande, Verdana, Sans-serif;
 font-size: 14px;
 color: #4F5155;
}
a {
 color: #003399;
 background-color: transparent;
 font-weight: normal;
}
h1 {
 color: #444;
 background-color: transparent;
 border-bottom: 1px solid #D0D0D0;
 font-size: 16px;
 font-weight: bold;
 margin: 24px 0 2px 0;
 padding: 5px 0 6px 0;
}
code {
 font-family: Monaco, Verdana, Sans-serif;
 font-size: 12px;
 background-color: #f9f9f9;
 border: 1px solid #D0D0D0;
 color: #002166;
 display: block;
 margin: 14px 0 14px 0;
 padding: 12px 10px 12px 10px;
}
</style>
</head>
<body>

 

Standaard dus.

 

De view inhoud.php gaat er als volgt uitzien

 

<h1>Welkom bij CodeIgniter! - door van Wijhe Consultancy</h1>

<p>Als je deze pagina wilt aanpassen, ga dan naar:</p>
<code>system/application/views/welkom.php</code>

<p>De bijbehorende controller kun je vinden op:</p>
<code>system/application/controllers/welkom.php</code>

<p><br />Pagina rendering in 0.0530 seconden</p>

 

De view footer.php gaat er als volgt uitzien

 

</body>
</html>

 

Eigenlijk is de oude view in 3 stukken gehakt.

Alle aanpassingen zullen in inhoud.php plaatsvinden.

 

De model

 

We zullen eerst een model dienen te maken.

Standaard zijn er geen model aanwezig.

De model zal als naam model_vb.php krijgen

De basis opzet van alle models is wel gelijk.

De controller dient een verbinding met Codeigniter te krijgen.

Dat ziet als volgt uit

 
<?php

class Model_vb extends Model {
 
    function 
Model_vb()
    {
        
// Call the Model constructor        
        
parent::Model();
    }
    
// ----- /Model_vb    
/* Location: ./system/application/models/model_vb.php */

 

Je mag elke naam eigenlijk kiezen.

Probeer hier wel enige logica in te houden.

Ik zelf laat altijd in de models's de naam model terug komen, ook hier.

Let op het hoofdletter gebruik in de class.

In de fysieke naam zie je dit niet weer.

 

We dienen Codeigniter nog wel te vertellen dat we gebruik gaan maken van een model.

Het is niet verplicht, maar wel zo handig.

in feite kan ik mij niet voorstellen dat je zonder een model werkt.

Het zou betekeken dat je het MVC model zou verlaten en er een VC model van zou maken.

Over verarming gesproken.

 

Verander het volgende in de file autoload.php

Deze hebben we hierboven al eens gebruikt.

 

Verander het volgende

 
    van  
$autoload['model'] = array();
 
    naar  
$autoload['model'] = array('Model_vb');

 

We kunnen nu veilig de de model class Model_vb gebruiken en overal inzetten.

 

De aanpassing aan het model

Eerst de aanpassing aan het model.

 

<?php

class Model_vb extends Model {
 
    function 
Model_vb()
    {
        
// Call the Model constructor        
        
parent::Model();
    }
    

    
/*
        alle_records
    */
    
function alle_records()
    {
        
$this->db->select(array('Code'
                                
'Name'
                                
'Continent'
                                
'Region'));        
        
        
$this->db->orderby('Name''asc');        
         
        
$query $this->db->get('country');
         
        return 
$query->result_object();    
    }
    
//-----/alle_records

    
//-----/Model_vb    
/* Location: ./system/application/models/model_vb.php */

 

Je ziet dat er een functie is bijgekomen, namenlijk alle_records()

Aan de kleur codering en de accolades zie je waar deze begint en stopt.

 

Aan elke functie kun je variabelen meegeven.

Deze plaats je tussen de accolades.

Aangezien we geen variabelen op dit moment willen gebruiken en alle records willen zien, hoeven we nu niets tussen de accolades te plaatsen.

 

De volgende regel begint met $this->

Dit is om binnen de gecreerde werkruimte binnen PHP de gegevens beschikbaar te maken en houden.

 

De code $this->db geeft aan dat we met de ter beschikkeng gestelde class db werken.

En ja, deze verzorgt de interactie met de database.

( Zie hiervoor bv. https://www.vanwijhecons.nl/codeigniter/gebruikers_gids/database/active_record.html )

Deze regel zegt ons dat we de volgende velden willen selecteren:

  • Code
  • Name
  • Continent
  • Region

Het woord array geeft aan dat we resultaten kunnen verwachten in een array.

 

De volgende regel laat een sortering plaats vinden op het record Name en wel Ascending ( asc )

 

De hierop volgende regel laat zoeken in de tabel country en wijst de vraag toe aan de variable $query.

 

De laatste regel laat deze query uitvoeren en als uitvoer terug geven.

 

En hoe nu verder?

 

De volgende stap is deze uitvoer te koppelen aan onze controloler welkom.php om deze de gegevens te laten doorgeven aan de view.

De cirkel is dan rond.

 

In logico opbouw hebben we dan het volgende gedaan:

  1. De controller welkom.php wordt aangeroepen
  2. Deze haalt gegevens op van de model model_vb.php middels de functie alle_records()
  3. Vervolgens worde deze deze gegvens aan de view inhoud.php doorgegeven.

 

Het doorgegeven van de gegevens aan de view via de controller.

Hiertoe passen we de controller welkom.php aan

 

Verander het volgende:

 

<?php

class Welkom extends Controller {

    function 
Welkom()
    {
        
// Call the Controller constructor
        
parent::Controller();    
    }
    
    function 
index()
    {        
        
$data['landen']                =    $this->Model_vb->alle_records() ;
        
        
$this->load->view('header');    
        
$this->load->view('inhoud'$data);    
        
$this->load->view('footer');
    }
    
}
/* End of file welkom.php */
/* Location: ./system/application/controllers/welkom.php */

 

De aanpassingen zitten in het toewijzen van gegevens aan de variabele $data['landen']

en aan het meesturen van deze data met de view inhoud $this->load->view('inhoud', $data);

 

De eerste aanpassing is nodig om in het script de gegevens beschikbaar te krijgen.

De geneste array structuur $data[] wordt hiervoor gebruikt.

In dit geval wordt de sub array $data['landen'] hier voor gebruikt.

 

De tweede aanpassing is het toewijzen van gegevens aan een view

Hiertoe wordt de geneste array $data teoegewezen aan de view inhoud.php

Zo kun je aan elke view gegevens mee geven.

 

Tevens zie je hoe de controller de spin in het web wordt.

Gegevens worden toegewezen aan variabelen en deze variabelen worden verder toegewezen aan views

Je kunt zo aan elke view gegevens mee geven.

 

De aanpassing aan de view

 

De view inhoud.php wordt volledig aangepast.

Alleen de gegevens vanuit de database wil ik hier zichtbaar hebben.

 

Verander het volgende:

 

<?php

echo '<table>'."\n"  ;

foreach(
$landen as $rij)
{
    echo 
'<tr>'."\n" ;
    echo 
'<td>' ;    
    echo 
$rij->Code ;
    echo 
'</td>'."\n" ;    
    echo 
'<td>' ;    
    echo 
$rij->Name ;
    echo 
'</td>'."\n" ;    
    echo 
'<td>' ;    
    echo 
$rij->Continent ;
    echo 
'</td>'."\n" ;    
    echo 
'<td>' ;    
    echo 
$rij->Region ;    
    echo 
'</td>'."\n" ;    
    echo 
'</tr>'."\n" ;    
}

echo 
'</table>'."\n" ;

?>

 

Je ziet hier een tabel onstaan uit de array $landen

Deze wordt eerst in rijen omgezet $rij

waarna deze per rij verder wordt weergegeven.

 

En in de browser

 

Zou je zoiets als volgende dienen te krijgen.

 

 

AFGAfghanistanAsiaSouthern and Central Asia
ALBAlbaniaEuropeSouthern Europe
DZAAlgeriaAfricaNorthern Africa
ASMAmerican SamoaOceaniaPolynesia
ANDAndorraEuropeSouthern Europe
AGOAngolaAfricaCentral Africa
AIAAnguillaNorth AmericaCaribbean
ATAAntarcticaAntarcticaAntarctica
ATGAntigua and BarbudaNorth AmericaCaribbean
ARGArgentinaSouth AmericaSouth America
ARMArmeniaAsiaMiddle East
ABWArubaNorth AmericaCaribbean
AUSAustraliaOceaniaAustralia and New Zealand

 

Tot slot

 

CodeIgniter heeft nu een verbinding met een database.

 

Probeer het uit, zou ik zeggen.

 

Het volgende artikel zal gaan over het aanpassen van gegeven in de database.



Veel programmeer plezier ermee.


Tot ziens,

Ubel Jan van Wijhe
van Wijhe Consultancy
E-mail naar info@vanwijheweb.nl