PDO en Exceptions

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mr D

Mr D

31/01/2008 17:30:00
Quote Anchor link
mijn database geeft keurig het volgende terug:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry....

Het probleem is dat het script hierdoor gelijk doorspringt naar het eerst volgende catch blok.

Een klein stukje code
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$stmt
= $db->prepare('INSERT INTO land (naam) VALUES (:land)');
foreach($this->landen as $land){
    $stmt->bindParam(':land', $land, PDO::PARAM_STR);
    $stmt->execute();
}

?>


Hoe kan je dit soort dingen het beste oplossen? Om om elke query een apart try met bijbehorende catch te zetten lijkt me ook niet de beste oplossing?
 
PHP hulp

PHP hulp

22/12/2024 10:58:24
 
Jan geen

Jan geen

31/01/2008 17:38:00
Quote Anchor link
Lijkt me wel? bij de oude mysql functies controleerde je toch ook of elke query gelukt was?
Gewijzigd op 01/01/1970 01:00:00 door Jan geen
 
Stien ss

stien ss

31/01/2008 17:41:00
Quote Anchor link
Over het algemeen zal je applicatie meerdere lagen hebben. Wat je bijvoorbeeld kan doen, is op een hogere laag een try catch maken en dan aan de gebruiker aan bieden wat er fout is gegaan.

Je wilt je exceptions pas afhandelen wanneer je een alternatief aan kan bieden.

Dus stel ik heb zoiets:

Main
Controller
Model - geeft PDO Exception.

Dan wil je op je Controller laag pas je try en catch hebben zodat je een ander model kan laden ipv die een fout geeft.
Het zou eventueel ook nog op de Main laag kunnen.

Hopelijk snap het een beetje
 
Mr D

Mr D

31/01/2008 19:00:00
Quote Anchor link
ik snap het principe wel aardig. Het probleem hier is dat er eigenlijk niks fout gaat, maar dat ie wel naar de catch toe springt, waardoor de rest niet meer wordt uitgevoerd.
Een andere oplossing zou kunnen zijn om eerst met een SELECT te kijken of een record al bestaat, maar dat lijkt me ook niet een optimale oplossing
 
Stien ss

stien ss

31/01/2008 19:28:00
Quote Anchor link
Oh zo.. dus je wilt dat alleen geinstert wordt wat er kan..
Je zou zoiets kunnen doen:

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
<?php
$exists
= array ();
$stmt = $db->prepare('INSERT INTO land (naam) VALUES (:land)');
foreach($this->landen as $land){
    try {
         $stmt->bindParam(':land', $land, PDO::PARAM_STR);
         $stmt->execute();

    }
catch ( PDOException $e ) {
         $exists[] = $land;

    }
}

?>


Dan wordt alles geinsert, en alles wat niet gelukt is staat in de array $exists.
 



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.