Verder met PHP

Door josvane op dinsdag 7 augustus 2012 00:07 - Reacties (13)
Categorie: -, Views: 6.407

Naar aanleiding van mijn vorige post Seo vriendelijk met PHP heb ik een boek gekocht, en wel deze. link

Tegerlijkertijd heb ik mij ook verdiept in PDO, wat met onder andere met het prepare statement een hoop doet om sql injecties e.d. te voorkomen.

In de vorige post werd ik gewezen op het gebruik van globals (in negatieve zin), een zoektocht op internet met gevolg. De 1e opzet heb ik inmiddels werkend. Voor mij gevoel is de aanroep naar de DB goed. De connectie wordt eenmalig opgebouwd e.d.

De query's kan ik volgens mij beter, alleen vindt ik daar verschillende meningen over en niet alle varianten krijg ik werkend.

Vanuit de testFunction wordt de connectie met de DB gemaakt. Vervolgens moet ik de gehele query ook naar de Database class sturen, vervolgens zou ik eigenlijk al extra waardes mee moeten zenden om een verschil te kunnen maken tussen single row of een array.

Eigenlijk wil ik de query en de prepare statement in de testFunction zelf houden, of is dit de beste manier en moet ik inderdaad dit zo laten. Graag jullie mening daarover of wellicht een oplossing. Als dit met een bepaalde php term op te lossen is hoor ik die graag, dan ik daarop verder zoeken.

Waarom een blog en geen topic
De reden dat ik het in een blog plaats is omdat het een vervolg is op mijn vorige topic, en ik een blog uiteindelijk beter vindt voor kennisdeling



PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
// Example of a Singleton Database class
class Database
{
    // Store the single instance of Database
    private static $m_pInstance;
    private $db_con;

    // Private constructor to limit object instantiation to within the class
    private function __construct() 
    { 
        $DBserver       = 'localhost';
        $DBusername         = 'username';
        $DBpassword     = 'password';
        $DBdatabase     = 'database';
        
        try
        {
            $this->db_con = new PDO('mysql:host='. $DBserver . ';dbname=' . $DBdatabase . ';charset=UTF-8', $DBusername, $DBpassword);
            $this->db_con->setAttribute(PDO::ATTR_PERSISTENT, true);
            $this->db_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch ( PDOException $e ) 
        {
            print "Error!: " . $e->getMessage () . "\n" ;
            die () ;
        }
    }

    // Getter method for creating/returning the single instance of this class
    public static function getInstance()
    {
        if (!self::$m_pInstance)
        {
            self::$m_pInstance = new Database();
        }

        return self::$m_pInstance;
    }
    
    // Test function to simulate a query
    public function query($query)
    {
        $statement = $this->db_con->prepare($query);
        $statement->execute();
        $row = $statement->fetch(); // Use fetchAll() if you want all results, or just iterate over the statement, since it implements Iterator
        return $row;
    }
    
}

// Wrap the test code in a function 
class user
{
    function testFunction()
    {
        // Get the single instance of the Database class using the gettor 
        // method we created.  Then call it's query method to output some text
        $db = Database::getInstance();
        print '<pre>';
        print_r($db->query("select * from jstl_cms_menu where is_link = '1'"));
        print '</pre>';
    }
}

// Start the test
$user = new user();
$user->testFunction();

// After running this script you will see that the constructor was only called
// once, showing that only one instance of the class was created.

?>