PDO execute, vraagje over gereturnde boolean
Nu vraag ik me af wat er precies bedoeld wordt met "failure". Gaat het hier om een daadwerkelijke error? Zo ja, wat is dan precies het nut ervan, aangezien je je execute in een try en catch hebt staan?
(Met andere woorden, waarom zou ik via de boolean controleren of er een error is, terwijl mijn errors al worden afgevangen in een try en catch. Of zie ik iets over het hoofd?)
Gewijzigd op 06/12/2010 13:26:05 door Ozzie PHP
(Zal ik zelf ook eens doen.)
Mja, da's lastig... als ik een error veroorzaak gooit ie gelijk een error. En als ik dan net van te voren die boolean var_dump dan geeft ie NULL dus dat werkt niet. (Sowieso beetje lastig testen omdat e.e.a. in een framework hangt)
PDO kan ook geen exceptions gooien bij errors, maar gewoon trigger_error gebruiken, net als de rest van PHP. En dan is die boolean wel handig. Het ligt er dus aan waar je PDO::ATTR_ERRMODE op hebt staan. Bij PDO::ERRMODE_EXCEPTION heb je er niet zoveel aan.
(Als er iets mis gaat is het toch altijd een fout van technische aard (ofwel een programmeerfout)? Of is dat niet altijd zo?)
De DB server kan bijvoorbeeld tijdelijk niet bereikbaar zijn of plat liggen..
Ja, inderdaad... maar dan is het toch logisch dat je een error gooit? Anders gaat je systeem over z'n nek lijkt me.
Dan hoeft het niet allemaal over zijn nek, ...
Nee, maar stel... mijn applicatie heeft gegevens uit de database nodig en zonder die gegevens kan ie niet verder... dan moet ie toch een error gooien? (weliswaar een nette error melding voor de bezoekers). Stel bijvoorbeeld dat deze site gen database connectie kan maken, dan moet er toch ook een error worden gegooid die zegt dat er problemen met de database zijn?
Het zijn exceptions, die kan je opvangen en afhandelen waar en hoe je maar wilt. Volgens mij zit deze feature, PDO::ATTR_ERRMODE, er puur in voor persoonlijke voorkeur. Exceptions gooien wanneer er iets mis gaat is de Java-manier van exceptions. Exceptions gooien wanneer er echt iets mis gaat, heeft de voorkeur van anderen, zoals mijn C++ leraar.
Euh, oke... alles leuk en aardig :) maar geef eens een voorbeeld dan wat je kunt doen in plaats van een exception gooien? Stel je database verbinding werkt niet en je kunt dus geen content inladen...
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
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
<?php
function showGastenboek()
{
$posts = getPosts();
if( !$posts)
return false;
echo '<ol>';
foreach ($posts as $post)
echo '<li>' . $post . '</li>';
echo '</ol>';
return true;
}
function getPosts()
{
global $db;
if (!$stmt->execute())
return false;
..
return $stmt->fetchAll();
}
function main()
{
if (!showGastenboek())
{
echo "Sorry, de site is vandaag offline";
return;
}
}
main();
?>
function showGastenboek()
{
$posts = getPosts();
if( !$posts)
return false;
echo '<ol>';
foreach ($posts as $post)
echo '<li>' . $post . '</li>';
echo '</ol>';
return true;
}
function getPosts()
{
global $db;
if (!$stmt->execute())
return false;
..
return $stmt->fetchAll();
}
function main()
{
if (!showGastenboek())
{
echo "Sorry, de site is vandaag offline";
return;
}
}
main();
?>
Mja... oke... ik snap wat je bedoelt, maar stel dat vrijwel alle info uit je database komt (zoals op deze site) wat is dat het verschil tussen het gooien van een error (waarin je een keurige view aanroep waarin een melding wordt getoond) of de manier waarop jij het doet met een echo? Komt toch op hetzelfde neer? Het principe is hetzelfde.
Ja, dat komt op hetzelfde neer. (ik had ook vanuit dat idee dat stukje code getypt) Maar wat is je vraag nu? Of je wel of geen exceptions gebruikt is gewoon puur persoonlijke voorkeur. Exceptions gebruiken schept het risico van jumpy code. Je springt zo naar je catch-statement en slaat hele stukken code over. In talen waarin je zelf memory management doet, dus niet PHP, kan dat een behoorlijke headache worden, in PHP zelf ook wel (bijv. wat als je al half de output gegenereerd hebt, hoe weet je hoever je was met de output?) Maar daar staat tegenover dat je niet overal hoeft te controleren op false.
Nee, ik bedoelde meer als volgt... op het moment dat je bijv. geen database connectie hebt, dan gooi ik een error en wordt er verder niks meer uitgevoerd. Tevens wordt er een melding op het scherm getoond. Een andere oplossing zou kunnen zijn dat je toch je gehele site laat opbouwen, maar dat de content dan niet gevuld is. Dat zijn keuzes. Mij lijkt het echter dat wanneer mijn database het niet doet ik dan maar beter meteen alles kan stilleggen :)