Error bij escapen van een string
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)
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
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();
}
?>
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
Je kan toch ook direct $db->quote gebruiken?
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
vervolgens moet je dan ook wel een waarde meegeven bij het aanroepen zoals op regel 28
- Aar - op 20/07/2014 20:41:19:
wat is het nut van die esc() functie?
Je kan toch ook direct $db->quote gebruiken?
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.
Het lijkt er op alsof de PDO-verbinding niet tot stand gebracht wordt.
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)
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
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();
}
?>
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
Code (php)
en regel 28:
even over dit:
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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();
}
}
?>
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
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)
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
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();
}
?>
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();
}
?>
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.