enduser vriendelijke errormessages
Als voorbeeld de verbinding met de database:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
ini_set('display_errors',1); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
//Connect to the dBase
$db = array (
'host' => 'localhost',
'dbname' => 'home',
'user' => 'root',
'pass' => ''
);
try {
$db = new PDO('mysql:host='.$db['host'].';dbname='.$db['dbname'], $db['user'], $db['pass']);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->query("SET SESSION sql_mode = 'ANSI,ONLY_FULL_GROUP_BY'");
}
catch(PDOException $e) {
$sMsg = '<p>
Linenumber: '.$e->getLine().'<br />
File: '.$e->getFile().'<br />
Errormessage: '.$e->getMessage().'
</p>';
trigger_error($sMsg);
}
?>
ini_set('display_errors',1); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
//Connect to the dBase
$db = array (
'host' => 'localhost',
'dbname' => 'home',
'user' => 'root',
'pass' => ''
);
try {
$db = new PDO('mysql:host='.$db['host'].';dbname='.$db['dbname'], $db['user'], $db['pass']);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->query("SET SESSION sql_mode = 'ANSI,ONLY_FULL_GROUP_BY'");
}
catch(PDOException $e) {
$sMsg = '<p>
Linenumber: '.$e->getLine().'<br />
File: '.$e->getFile().'<br />
Errormessage: '.$e->getMessage().'
</p>';
trigger_error($sMsg);
}
?>
Als ik nu bovenaan in het script de display_errors op 0 zet en de $sMsg omschrijf naar een vriendelijke errorregel, krijg ik geen enkele foutmelding meer, en verschijnt er een wit scherm. Eigenlijk wil ik dat er een melding komt en de pagina naar de vorige teruggestuurd wordt. Maar ik krijg dit niet voor elkaar. Wat doe ik fout?
En het tonen doe je gewoon met een echo, niet met trigger_error, want dan kom je weer in het loopje van exceptions afvangen en geen foutmeldingen laten zien.
Ja, dat is dus precies wat ik wil, maar ik weet niet hoe ik het moet doen. Zodra ik de display_errors op 0 zet, krijg ik het niet meer voor elkaar om welke foutmelding dan ook te genereren. Ik blijf hangen in een wit scherm.
Heb je mijn laatste regel wel gelezen?
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
ini_set('display_errors',0); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
//Connect to the dBase
$db = array (
'host' => 'localhost',
'dbname' => 'home',
'user' => 'root',
'pass' => ''
);
try {
$db = new PDO('mysql:host='.$db['host'].';dbname='.$db['dbname'], $db['user'], $db['pass']);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$db->query("SET SESSION sql_mode = 'ANSI,ONLY_FULL_GROUP_BY'");
if $db = FALSE {
return $sMsg = 'Kan geen verbinding maken';
}
}
catch {
echo $sMsg;
}
?>
ini_set('display_errors',0); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
//Connect to the dBase
$db = array (
'host' => 'localhost',
'dbname' => 'home',
'user' => 'root',
'pass' => ''
);
try {
$db = new PDO('mysql:host='.$db['host'].';dbname='.$db['dbname'], $db['user'], $db['pass']);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$db->query("SET SESSION sql_mode = 'ANSI,ONLY_FULL_GROUP_BY'");
if $db = FALSE {
return $sMsg = 'Kan geen verbinding maken';
}
}
catch {
echo $sMsg;
}
?>
Ik blijf een wit scherm houden.
Ik heb 2 problemen in de syntax die ik nog niet helemaal begrijp, omdat ik nog behoorlijk worstel met OOP. Hoe formuleer ik de foutmelding zodanig dat die door de catch opgenomen wordt en hoe check ik of de verbinding gelukt is.
Dus even terug.
Als je met exceptions gaat werken zijn er drie stappen.
1) bij elke fout, of onverwachte situatie (bepaal zelf wanneer dat is), gooi je een exception.
2) op bepaalde plekken in je code vang je die exceptions af in een try...catch blok. Je kan ook hier weer zelf bepalen waar je dat doet. Over het algemeen zal je verschillende niveaus vinden waarop je wil afvangen, omdat je ook verschillende niveaus hebt van problemen. Simpele problemen die je in de functie zelf direct kunt oplossen, grotere problemen die een effect hebben buiten de functie en zelfs fatale problemen die in feite je hele script nekken. Per fout bepaal je wat je doet en sla je de foutmelding eventueel op een in een variabele zodat je die later kunt gebruiken om te tonen.
3) Prik een plek in je script waarop je controleert of er meldingen zijn en toon die dan.
In code:
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
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
<?php
$msgs = array();
function connectToDb( array &$msgs ){
try{
//je probeert te connecten, lukt niet, gooi een fout
throw new Exception( 'geen databaseverbinding' );
} catch( Exception $e ){
//exception opgevangen, sla deze op
$msgs[] = $e->getMessage();
}
}
//connect met de db
connectToDb( $msgs );
?>
<html>
<body>
<?php
//zijn er fouten? Zo ja, toon ze.
if ( count( $msgs ) > 0 ){
foreach( $msgs as $msg ){
echo $msg;
}
}
?>
</body>
</html>
$msgs = array();
function connectToDb( array &$msgs ){
try{
//je probeert te connecten, lukt niet, gooi een fout
throw new Exception( 'geen databaseverbinding' );
} catch( Exception $e ){
//exception opgevangen, sla deze op
$msgs[] = $e->getMessage();
}
}
//connect met de db
connectToDb( $msgs );
?>
<html>
<body>
<?php
//zijn er fouten? Zo ja, toon ze.
if ( count( $msgs ) > 0 ){
foreach( $msgs as $msg ){
echo $msg;
}
}
?>
</body>
</html>
Gewijzigd op 14/08/2014 10:55:53 door Erwin H
Voor de volledigheid, dit is wat ik heb:
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
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
<?php
ini_set('display_errors',0); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
//Connect to the dBase
$db = array (
'host' => 'localhost',
'dbname' => 'home',
'user' => 'root',
'pass' => ''
);
$sMsg = array();
try {
$db = new PDO('mysql:host='.$db['host'].';dbname='.$db['dbname'], $db['user'], $db['pass']);
throw new Exception ('Kan geen verbinding maken');
}
catch(Exception $e) {
$sMsg[] = $e->getMessage();
}
?>
<html>
<body>
<?php
//zijn er fouten? Zo ja, toon ze.
if ( count( $sMsg ) > 0 ){
foreach( $sMsg as $msg ){
echo $msg;
}
}
?>
</body>
</html>
ini_set('display_errors',0); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
//Connect to the dBase
$db = array (
'host' => 'localhost',
'dbname' => 'home',
'user' => 'root',
'pass' => ''
);
$sMsg = array();
try {
$db = new PDO('mysql:host='.$db['host'].';dbname='.$db['dbname'], $db['user'], $db['pass']);
throw new Exception ('Kan geen verbinding maken');
}
catch(Exception $e) {
$sMsg[] = $e->getMessage();
}
?>
<html>
<body>
<?php
//zijn er fouten? Zo ja, toon ze.
if ( count( $sMsg ) > 0 ){
foreach( $sMsg as $msg ){
echo $msg;
}
}
?>
</body>
</html>
Enneh, als het nu wel lukt gooi je gewoon alsnog een exception op regel 15. Handig.... Je begrijpt natuurlijk dat je alleen een exception moet gooien als er ook daadwerkelijk iets mis gaat, niet gewoon altijd.
En natuurlijk, de exception moet alleen als er iets foutgaat, maar hoe doe ik dat in PDO? En waarom komt de melding "Kan geen verbinding maken" niet op het scherm?
Aangezien PDO zelf exceptions gooit, hoef je daar zelf niets meer te doen. Als alles goed gaat gooi je nooit een exception, als het fout gaat doet PDO het al.
En ik heb het aan de praat.
Heel hartelijk dank, ben ik weer wat wijzer geworden.