Error bij escapen van een string

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

A van Gent

A van Gent

20/07/2014 20:28:20
Quote Anchor link
Dag PHPHulp'ers,

Ik ben begonnen met het leren van PHP5 en heb zojuist mijn eerste script gemaakt, maar het werkt niet. Het is een script waarbij men een review kan toevoegen aan een MySQL database.

De errors:
Notice: Undefined variable: db in /*/toevoegen.php on line 8

Fatal error: Call to a member function quote() on a non-object in /*/toevoegen.php on line 8


Ik kom er absoluut niet uit :( wie o wie kan mij helpen?

Het script:

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
<?PHP
error_reporting(E_ALL);

$db = new PDO('mysql:host=localhost;dbname=deb58854_rev', 'deb58854_rev', 'debalie');

function
esc($db, $str)
{

    return $db->quote($str);
}

    
class Ervaring
{

    public $voornaam;
    public $achternaam;
    public $email;
    public $ervaring;

    public function __construct($voornaam, $achternaam, $email, $ervaring)
    {

    
        
        if (trim($voornaam == "") OR trim($achternaam == "") OR trim($email == "") OR trim($ervaring == ""))
        {

            throw new Exception ("<p>U heeft niet alle velden ingevuld.</p>");
        }

        
        $this->voornaam = esc($db, $voornaam);
        $this->achternaam = esc($db, $achternaam);
        $this->email = esc($db, $email);
        $this->ervaring = esc($db, $ervaring);
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->datum = time();
        
        $results = $db->exec("INSERT INTO Reviews (Ip, Datum, Voornaam, Achternaam, Email, Ervaring)
        VALUES ('$this->ip', $this->datum, $this->voornaam, $this->achternaam, $this->email, $this->ervaring)"
);
        
        if($results != 1)
        {

            throw new Exception ("DATABASE INVUL FOUT");
        }
        
    }
    
}


try
{
    $ervaring = new Ervaring('voornaam', 'achternaam', '[email protected]', 'het was goed');
}


catch (Exception $e)
{

    echo $e->getMessage();
}


?>
Gewijzigd op 20/07/2014 20:57:14 door A van Gent
 
PHP hulp

PHP hulp

20/04/2024 03:11:33
 
- Ariën  -
Beheerder

- Ariën -

20/07/2014 20:41:19
Quote Anchor link
wat is het nut van die esc() functie?

Je kan toch ook direct $db->quote gebruiken?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

20/07/2014 20:47:59
Quote Anchor link
Zo.. ik lees ik ben begonnen met PHP5 en ik zie al functies en zelfs een class :-)

Goed:
functies zijn min of meer geïsoleerde stukjes programmacode. Hetgeen wil zeggen dat als je buiten de functie een variabele declareert ($db in jouw geval) deze variabele nog niet bestaat binnen je functie.

Je zou dan bijvoorbeeld de variabele mee kunnen geven als een parameter net als $str
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?PHP
function esc($db, $str)
{

    return $db->quote($str);
}

?>


vervolgens moet je dan ook wel een waarde meegeven bij het aanroepen zoals op regel 28
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
        $this
->voornaam = esc($db, $voornaam);
?>
 
A van Gent

A van Gent

20/07/2014 20:49:11
Quote Anchor link
- Aar - op 20/07/2014 20:41:19:
wat is het nut van die esc() functie?

Je kan toch ook direct $db->quote gebruiken?


Klopt, maar dan zou ik elke keer opnieuw de database connectie moeten maken in elke class. Stel dat ik dan een keer de database settings wil wijzigen dan moet ik dat in elke class doen.
 
Pipo Clown

Pipo Clown

20/07/2014 20:53:25
Quote Anchor link
Het lijkt er op alsof de PDO-verbinding niet tot stand gebracht wordt.
 
A van Gent

A van Gent

20/07/2014 20:55:20
Quote Anchor link
Pipo Clown op 20/07/2014 20:53:25:
Het lijkt er op alsof de PDO-verbinding niet tot stand gebracht wordt.


De PDO-verbinding werkt!

@ Frank:
Ja klopt, ben er enorm enthousiast over :)
Ik heb het script aangepast maar krijg alsnog de foutmeldingen:

Notice: Undefined variable: db in /*/toevoegen.php on line 28

Fatal error: Call to a member function quote() on a non-object in /*/toevoegen.php on line 8

Hier het aangepaste script:

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
<?PHP
error_reporting(E_ALL);

$db = new PDO('mysql:host=localhost;dbname=XXXX', 'XXXX', 'XXXXX');

function
esc($db, $str)
{

    return $db->quote($str);
}

    
class Ervaring
{

    public $voornaam;
    public $achternaam;
    public $email;
    public $ervaring;

    public function __construct($voornaam, $achternaam, $email, $ervaring)
    {

    
        
        if (trim($voornaam == "") OR trim($achternaam == "") OR trim($email == "") OR trim($ervaring == ""))
        {

            throw new Exception ("<p>U heeft niet alle velden ingevuld.</p>");
        }

        
        $this->voornaam = esc($db, $voornaam);
        $this->achternaam = esc($db, $achternaam);
        $this->email = esc($db, $email);
        $this->ervaring = esc($db, $ervaring);
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->datum = time();
        
        $results = $db->exec("INSERT INTO Reviews (Ip, Datum, Voornaam, Achternaam, Email, Ervaring)
        VALUES ('$this->ip', $this->datum, $this->voornaam, $this->achternaam, $this->email, $this->ervaring)"
);
        
        if($results != 1)
        {

            throw new Exception ("DATABASE INVUL FOUT");
        }
        
    }
    
}


try
{
    $ervaring = new Ervaring('voornaam', 'achternaam', '[email protected]', 'het was goed');
}


catch (Exception $e)
{

    echo $e->getMessage();
}


?>
Gewijzigd op 20/07/2014 20:58:28 door A van Gent
 
Frank Nietbelangrijk

Frank Nietbelangrijk

20/07/2014 21:34:38
Quote Anchor link
Oh sorry vergeten maar ook je class is een geïsoleerde omgeving.
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
<?php
    
class Ervaring
{

    public $voornaam;
    public $achternaam;
    public $email;
    public $ervaring;
    private $db;

    public function __construct($db, $voornaam, $achternaam, $email, $ervaring)
    {

    $this->db = $db;

    // vervolg bestaande code
?>


en regel 28:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
        $this
->voornaam = esc($this->db, $voornaam);
?>


even over dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
    public $voornaam;
    public $achternaam;
    public $email;
    public $ervaring;
?>


dit zijn properties. Leer jezelf aan om die direct private te declareren. Weet je het verschil tussen private en public?

Toevoeging op 20/07/2014 21:43:42:

En een constructor is enkel bedoeld voor initialisatie. de rest hoort er niet in thuis.
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
<?php
class Ervaring
{

    private $voornaam;
    private $achternaam;
    private $email;
    private $ervaring;
    private $db;
    
    // een constructor is ALTIJD public dus van mij mag je dat weghalen. Het is echter niet fout (in PHP).
    /*public*/
function __construct($voornaam, $achternaam, $email, $ervaring)
    {

        $this->voornaam = esc($db, $voornaam);
        $this->achternaam = esc($db, $achternaam);
        $this->email = esc($db, $email);
        $this->ervaring = esc($db, $ervaring);
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->datum = time();
    }
    
}

?>
Gewijzigd op 20/07/2014 21:44:23 door Frank Nietbelangrijk
 
A van Gent

A van Gent

21/07/2014 14:18:13
Quote Anchor link
Bedankt voor je reactie, ik leer er veel van :)

Ik heb het script aangepast maar krijg nu de foutmelding: Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in /*/toevoegen.php on line 39

Ik kan natuurlijk de $db database connectie in de function __construct() plaatsen maar dan zou ik dat in elke class moeten doen die ik ga maken. Wat ik wil doen is een config.php includen in al mijn bestanden. In dat bestand wordt dan de database connectie gemaakt. Als ik dan ooit de db gegevens moet aanpassen dan hoef ik dat maar in 1 bestand te doen ipv in alle classes.


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
<?PHP
error_reporting(E_ALL);

$db = new PDO('mysql:host=localhost;dbname=XXX', 'XXX', 'XXX');

function
esc($db, $str)
{

    return $db->quote($str);
}

    
class Ervaring
{

    private $voornaam;
    private $achternaam;
    private $email;
    private $ervaring;
    private $db;

    function
__construct($db, $voornaam, $achternaam, $email, $ervaring)
    {

    
        $this->db = $db;
        
        if (trim($voornaam == "") OR trim($achternaam == "") OR trim($email == "") OR trim($ervaring == ""))
        {

            throw new Exception ("<p>U heeft niet alle velden ingevuld.</p>");
        }

        
        $this->voornaam = esc($this->db, $voornaam);
        $this->achternaam = esc($this->db, $achternaam);
        $this->email = esc($this->db, $email);
        $this->ervaring = esc($this->db, $ervaring);
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->datum = time();
        
    }

        
    $results = $db->exec("INSERT INTO Reviews (Ip, Datum, Voornaam, Achternaam, Email, Ervaring)
    VALUES ($this->ip, $this->datum, $this->voornaam, $this->achternaam, $this->email, $this->ervaring)"
);
        
        
    if($results != 1)
    {

        throw new Exception ("DATABASE INVUL FOUT");
    }
        
}

    

try
{
    $ervaring = new Ervaring('voornaam', 'achternaam', '[email protected]', 'het was goed');
}


catch (Exception $e)
{

    echo $e->getMessage();
}


?>
 
Erwin H

Erwin H

21/07/2014 14:36:22
Quote Anchor link
A van Gent op 21/07/2014 14:18:13:
Ik kan natuurlijk de $db database connectie in de function __construct() plaatsen

Daar gaat het niet om. Je kan geen losse code in een class hebben, alles moet binnen methods (functies) staan. Regels 39 t/m 46 bij jou staan niet binnen een method, dat kan dus niet.
 



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.