login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Error afhandeling achteraf (foreign en unique keys)

Offline ikki007 - 15/11/2009 21:54
Avatar van ikki007Gouden medailleGouden medaille

PHP ver gevorderde
Hallo,


Ik heb nu een beter databaseontwerp, en wil op deze manier al die controles vooraf verkleinen tot achteraf (unique en foreign keys).
Nu doe ik dit als volgt:

  1. <?php
  2. $res = mysql_query("INSERT INTO pages (title, seo, category) VALUES ('".$this->title."', '".$this->seo."', ".$this->category.")");
  3. if(!$res) {
  4. if(mysql_errno() == 1062) {
  5. $error = 'Seo tag already exists';
  6. } elseif(mysql_errno() == 1452) {
  7. $error = 'Invalid category selected.';
  8. } else {
  9. $error = 'Unknown error ('.mysql_error().')';
  10. }
  11. $this->error->set($error);
  12. }
  13. ?>


Dit werkt (alleen vind ik het al een beetje rommelig).
Alleen hoe ga ik het doen als meerdere velden UNIQUE zijn, die krijgen dan allebei de errno 1062 terug.

Of is er misschien een compleet/betere manier dergelijke constraint errors af te handelen.


Mvg,
Jarno

19 antwoorden

Gesponsorde links
Offline Richard - 16/11/2009 11:26
Avatar van Richard Crew algemeen Die constraints kun je een naam geven (dat raad ik je ook aan)
Als je dan de mysql_error() bekijkt, zul je zien dat die constraintnaam ook wordt genoemd, als je die er dus uit haalt en bijhoudt welke constraints welke fouten geven, is dat makkelijk te doen :]
Offline ikki007 - 16/11/2009 16:03 (laatste wijziging 16/11/2009 16:05)
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Hmm ja, heb het nu op de volgende manier gedaan:

  1. <?php
  2. define('Q_DUPLICATE', 1062);
  3. define('Q_FOREIGN_KEY', 1452);
  4.  
  5. //////////////////////////////////////////
  6.  
  7. public function constraint($errno, $errkey) {
  8. if($errno == Q_DUPLICATE) {
  9. if(mysql_errno() == Q_DUPLICATE AND strpos(mysql_error(), 'key \''.$errkey.'\'') !== false) {
  10. return true;
  11. }
  12. } elseif($errno == Q_FOREIGN_KEY) {
  13. if(mysql_errno() == Q_FOREIGN_KEY AND strpos(mysql_error(), 'CONSTRAINT `'.$errkey.'` FOREIGN') !== false) {
  14. return true;
  15. }
  16. }
  17. return false;
  18. }
  19.  
  20. //////////////////////////////////////////
  21.  
  22. $res = mysql_query("INSERT INTO pages (title, seo, category) VALUES ('".$this->title."', '".$this->seo."', ".$this->category.")");
  23. if(!$res) {
  24. if($this->error->constraint(Q_DUPLICATE, 'seo')) {
  25. $error = 'Seo tag already exists.';
  26. } elseif($this->error->constraint(Q_FOREIGN_KEY, 'category')) {
  27. $error = 'Invalid category.';
  28. } else {
  29. $error = 'Unknown error ('.mysql_error().')';
  30. }
  31.  
  32. $this->error->set($error);
  33. }
  34. ?>


Dit werkt opzich goed, alleen vind het niet superrnetjes, maar volgens mij kan dit niet veel beter toch?  
Offline Richard - 17/11/2009 15:15
Avatar van Richard Crew algemeen Het is op zich een best nette oplossing hoor! :-)
Offline ArieMedia - 17/11/2009 15:41
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Richard schreef:
Het is op zich een best nette oplossing hoor! :-)
indeed, ziet er goed uit 

Misschien dat je in je klasse nog met exceptions kan werken voor de finishing touch, maar misschien dat jij een andere error afhandeling hanteert (zoals ik in je code zie)
Offline ikki007 - 17/11/2009 15:43
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Ja, ik doe niet exceptions omdat ik hier nog niet de voordelen uit kan halen.
Ik vind met een if/else constructie net zo fijn werken, en exceptions kosten alleen maar veel meer intensiviteit.
Offline Abbas - 17/11/2009 16:36
Avatar van Abbas Gouden medaille

Crew .NET
Niet dat ik tegen je in wil gaan maar waarom zou het werken met exceptions meer intensief zijn?
Offline ikki007 - 17/11/2009 16:36 (laatste wijziging 17/11/2009 16:37)
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Ik heb gelezen dat exceptions veel zwaarder voor de server zijn.

En zullen daarom alleen gebruikt moeten worden voor errors die je niet verwacht.
Bij een validatieafhandeling ga je uit van een gebruikersinput waar je dus errors verwacht.
Offline Abbas - 17/11/2009 16:47
Avatar van Abbas Gouden medaille

Crew .NET
Hoeft niet per se waar te zijn, volgende C# voorbeeld:

  1. int x = 13;
  2. int y = 0;
  3. double quotient = x / y;
  4. //Dit levert [b]wel[/b] een Exception op, namelijk:
  5. //DivideByZeroException

Gemakkelijker is dan toch:

  1. int x = 13;
  2. int y = 0;
  3. double quotient = 0;
  4.  
  5. try
  6. {
  7. quotient = x / y;
  8. }
  9. catch (DivideByZeroException divideEx)
  10. {
  11. MessageBox.Show(divideEx.Message);
  12. }
  13. catch (Exception ex)
  14. {
  15. MessageBox.Show("Andere exception: " + ex.Message);
  16. }
  17. finally
  18. {
  19. //Hier eventueel nog iets doen
  20. }

Dit is in mijn ogen simpeler dan eerst te gaan liggen kijken of de invoer wel correct is met een if/else. Laat maar invoeren en alles wordt netjes opgevangen! 
Offline ikki007 - 17/11/2009 16:50
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Nu vraag ik mij af of je in PHP ook die exceptions zo makkelijk kan herkennen zoals "DivideByZeroException".

Ik denk dat het gedeeltelijk ook een persoonlijke keuze is.
Offline Richard - 17/11/2009 16:52
Avatar van Richard Crew algemeen Ja, dat kan, er zijn alleen niet zoveel standaard exceptions omdat het pas later erbij kwam :]

  1. <?php
  2. function blaat() {
  3. throw new BadFunctionCallException;
  4. }
  5.  
  6. try {
  7. blaat();
  8. } catch(BadFunctionCallException $e) {
  9. echo $e->getMessage();
  10. } catch(Exception $e) {
  11. echo 'Andere exceptie: ' . $e->getMessage();
  12. }
Offline Abbas - 17/11/2009 17:07 (laatste wijziging 17/11/2009 17:07)
Avatar van Abbas Gouden medaille

Crew .NET
I see! Erhm, moet het dan niet zijn:

  1. throw new BadFunctionCallException();

Mind the brackets.. 
Offline Richard - 17/11/2009 17:12
Avatar van Richard Crew algemeen Nope, in PHP zijn die niet nodig tenzij je argument wilt meegeven  
Offline Abbas - 17/11/2009 17:13
Avatar van Abbas Gouden medaille

Crew .NET
Oooowh ok, PHP is weird! 
Offline Ontani - 17/11/2009 17:30
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Is het niet gemakkelijker om effe te controleren of uw qotiënt groter dan nul is?
Offline Abbas - 17/11/2009 17:54
Avatar van Abbas Gouden medaille

Crew .NET
Een quotient kan wel kleiner zijn dan 0, als ik 36 deel door -4 dan is het quotient -9! 
Offline ikki007 - 17/11/2009 18:07
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Dus controleren of het quotient niet gelijk aan 0 is ;)
Dat is ook wat ik in zo'n case zou doen.
Offline Abbas - 17/11/2009 18:12 (laatste wijziging 17/11/2009 18:14)
Avatar van Abbas Gouden medaille

Crew .NET
Een quotient kan nooit gelijk zijn aan 0, tenzij je 0 deelt door eender welk getal buiten 0!

Edit:
En als je probeert te delen door 0 dan krijg je een Exception alvorens je kan gaan kijken of je quotient 0 zou zijn.
Offline ArieMedia - 17/11/2009 19:31
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
titjes schreef:
Een quotient kan nooit gelijk zijn aan 0, tenzij je 0 deelt door eender welk getal buiten 0!

Edit:
En als je probeert te delen door 0 dan krijg je een Exception alvorens je kan gaan kijken of je quotient 0 zou zijn.
kreeg je maar een exception.. je krijgt een lelijke php division by zero melding  .
Offline Abbas - 17/11/2009 21:21
Avatar van Abbas Gouden medaille

Crew .NET
Normaal bij .NET ook, daarom dat er dan ook Exception Handling is. Als je in PHP volgende doet:

  1. $x = 12;
  2. $y = 0;
  3.  
  4. try
  5. {
  6. $result = $x / $y;
  7. }
  8. catch (Exception $ex)
  9. {
  10. echo $ex->getMessage();
  11. }

Dan ga je mij niet vertellen dat je een lelijke melding krijgt.. 
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.222s