PDO met OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jasper Sni

Jasper Sni

22/09/2009 16:49:00
Quote Anchor link
Heey,

Ik ben een beetje bezig OOP te leren.

Nu heb ik een probleempje, ik krijg een variabele niet in een andere function.
Ik kan wel globals gaan gebruiken, maar het lijkt me dat er een andere manier moet zijn.

Heb nu al de hele middag gezocht, zou iemand me kunnen helpen?
B.v.d.

hier mijn code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

class connect_db
{
    private $host = 'localhost';
    private $db = 'database';
    private $username = 'root';
    private $password = '';
    
    function
connect_db()
    {

    try {
        $dbh = new PDO("mysql:host=$this->host;dbname=$this->db", $this->username, $this->password);
        }

    catch(PDOException $e)
    {

    echo $e->getMessage();
    }
    }
    function
output_users()
    {

        $sql = "SELECT * FROM users";
        foreach ($dbh->query($sql) as $row)
        {

            echo $row['username'] .' - '. $row['password'] . '<br />';
        }
    }
}

?>


Error: Notice: Undefined variable: dbh in C:\wamp\www\Project\includes\classes\database_verbinding.inc.php on line 23
 
PHP hulp

PHP hulp

27/04/2024 14:15:18
 
Jan Willem van der Veer

Jan Willem van der Veer

22/09/2009 16:54:00
Quote Anchor link
Het gaat om regel 23, dat is heel duidelijk. Dat is deze regel:
foreach ($dbh->query($sql) as $row)

Zoals je ziet, wordt hier de variabele $dbh gebruikt waarop de functie query wordt aangeroepen. En inderdaad: dat is niet goed. In de voorgaande regels
(
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?
function output_users()
    {

        $sql = "SELECT * FROM users";
?>
)
Zie ik nergens een initialisatie van de variabele $dbh. Maar ik zie er wel eentje in de eerste functie (connect_db), die je wellicht wilt gebruiken. In dat geval zul je hem in je object moeten opslaan. Dus misschien moet je er eens $this->dbh van maken op de één of andere manier (hoe, dat laat ik aan jou over).
 
Jasper Sni

Jasper Sni

22/09/2009 17:02:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
private $dbh;

$this->dbh = new PDO("mysql:host=$this->host;dbname=$this->db", $this->username, $this->password);

foreach ($this->dbh->query($sql) as $row)
?>


De stukjes die ik veranderd heb staan hierboven, is dit juist, het werkt tenminste wel, maar is het goed?

En wat nu als ik de databaseconnectie ($dbh) in een andere class wil aanroepen?
Gewijzigd op 01/01/1970 01:00:00 door Jasper Sni
 
Jan geen

Jan geen

22/09/2009 18:35:00
Quote Anchor link
lees dit eens door, je bent niet echt object georienteerd bezig.
 

22/09/2009 18:38:00
 
Jan Willem van der Veer

Jan Willem van der Veer

22/09/2009 18:39:00
Quote Anchor link
Quote:
En wat nu als ik de databaseconnectie ($dbh) in een andere class wil aanroepen?

Waarom zou je dat niet via één class laten verlopen? Bijvoorbeeld door middel van een singleton-constructie (zie wikipedia).

Maar waarom scheid je de functionaliteit niet meer? Dus dat je één class maakt voor de connectie met de database en de queries. En één class maakt voor de gebruikers (en het ophalen van alle gebruikers e.d.)?
Dat is min of meer het idee van OOP.
 
Jasper Sni

Jasper Sni

22/09/2009 22:12:00
Quote Anchor link
Uhm,

Ik heb nu een script voor verwerken van registratie, die checkt of naam nog niet bestaat en of hij tussen 3 en 16 tekens in ligt, meer functies komen nog, is dat idee goed?

hoe moet ik het precies scheiden dan, gewoon alle queries in een include en alle verwerkingen in een include of hoe bedoel je het

dit is mijn Register class:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
abstract class register
{    
    public function name_exists($name)
    {
        
        $user_check = $this->dbh->prepare('SELECT * FROM users WHERE username = "' . $name . '"');
        $user_check->execute();
        if($user_check->rowCount() > 0)
        {

            $error = 'Gebruikersnaam reeds in gebruik! <BR />';
            return $error;
        }    
    }

    
    public function name_length($name)
    {

        if(strlen($name) < 4 OR strlen($name) > 16)
        {

            $error = 'Naam moet minimaal 4 en maximaal 16 tekens bevatten <BR />';
            return $error;
        }
    }
}

?>


Dat boek heb ik ook beetje doorgelezen, staat wel nuttige informatie in, jammer dat het in het engels is, leest wat minder makkelijk door.
Gewijzigd op 01/01/1970 01:00:00 door Jasper Sni
 
Jan Koehoorn

Jan Koehoorn

22/09/2009 22:26:00
Quote Anchor link
Eén van de manieren om vanuit een class bij een variabele van een andere class te kunnen is overerving. Je zou dus een class user kunnen hebben die een class database extend.
 
Jan Willem van der Veer

Jan Willem van der Veer

23/09/2009 10:24:00
Quote Anchor link
Quote:
Je zou dus een class user kunnen hebben die een class database extend.
Bah, dan kun je op alle user-classes functies gaan aanroepen als query, fetch_values, e.d.
Ik zou dan eerder voor singleton gaan die men aan kan roepen. Of een algemene variabele die de database voorstelt, die men overal kan benaderen.

Maar in elk geval zou ik gaan voor een goede scheiding van functionaliteiten.

Waarom is de class register overigens abstract?
Gewijzigd op 01/01/1970 01:00:00 door Jan Willem van der Veer
 
Jan geen

Jan geen

23/09/2009 13:27:00
Quote Anchor link
Die overerving is inderdaad niet zo mooi omdat een user geen database is.
Abstract class gebruik je alleen als bepaalde functies niet geïmplementeerd zijn. Lijkt op een halve interface
 
Jasper Sni

Jasper Sni

23/09/2009 14:59:00
Quote Anchor link
Het was maar een probeerscriptje om het te leren, niet op details gelet.

Nu heb ik iets anders, een kolomhead en kolominhoud en ik wil ze bovenin defineren zodat ze automatisch worden weergegeven.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

class template
{

private static $title = 'Parites - De verliezers gaan van de plank.';
private static $menubar = array('linkje','linkje','linkje','linkje');
private static $kolommen = array('Menu','Opties');
private static $kolomMenu = array('linkje','linkje');
private static $kolomOpties = array('linkje2','linkje2');


function
header()
{

    echo '<html>
          <head>
          <title>'
. self::$title . '</title>
          <link rel="stylesheet" href="style.css" type="text/css">
          </head>
          <body>
          
          <div id="container">
          
          <div id="content">
          
          <div class="status">'
;
              /* Hier tekst voor het blok links van de header */
          echo'
          </div>
          
          <div id="header">
          <a href="#"><img src="images/layout/tutorial_guide.gif" class="tutorial" alt="Tutorial op dit moment nog niet beschikbaar!"></a>
          </div>
          
          <ul id="menubar">
          '
;
          foreach(self::$menubar as $link)
          {

              echo '<li><a href="parites.php?id=' . $link . '">' . $link . '</a></li>';
            }

            echo '
            </ul>
          
            <div id="column_wrapper">
          '
;
          foreach(self::$kolommen as $kolomhead)
          {

              echo '
              <div id="column_head">'
. $kolomhead . '</div>
          
              <div id="column_content">
              <ul>
              '
;
              foreach(self::$kolom.$kolomhead as $kolominhoud)
              {

                  echo '
                  <li><a href="parites.php?id='
. $kolominhoud . '">' . $kolominhoud . '</a></li>
                  '
;
              }

              echo'
              </ul>
              </div>
              '
;
          }

          echo '
          </div>
          '
;
          ?>


Nu krijg ik
Fatal error: Access to undeclared static property: template::$kolom

Omdat hij niet zoals in normale PHP, de .$kolomhead niet pakt.

Iemand een idee hoe dit wel moet, of is het echt onmogelijk?
Gewijzigd op 01/01/1970 01:00:00 door Jasper Sni
 
Jan Willem van der Veer

Jan Willem van der Veer

23/09/2009 15:09:00
Quote Anchor link
Je kleurcodering klopt ook niet. En kun je eventjes gewoon de hele code geven. Ik neem aan dat dit binnen een class is (gezien het keyword self).

Daarnaast vind ik: foreach(self::$kolom.$kolomhead as $kolominhoud)
wel een hele vreemde constructie...
 
Jasper Sni

Jasper Sni

23/09/2009 15:11:00
Quote Anchor link
Zie bovenstaand.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.