Vous n'êtes pas identifié(e).

#1 Re : PHP » Contraintes SQL sur attribut et traitement des erreurs en PHP » 11/07/2012 11:32:44

Merci à gleu et rjuju pour vos  réponses .

J'y vois plus clair.
Postgres me dit simplement que je suis en erreur, via le code d'erreur je trouve le type d'erreur derrière lequel j'ai plusieurs erreurs possibles du même type. A moi de les tester.

Cependant :
Il me semble que si j'ai 2 erreurs  de 2 types, le sgbd m'informe seulement de la première erreur (gleu:"La première. Chercher toutes les erreurs serait une perte en performance." ). Donc, je cherche uniquement l'erreur ou les erreurs de type1, j'affiche en (php/javascript) un message à l'utilisateur, je ré-affiche le formulaire de saisie, l'utilisateur corrige l'erreur ou les erreurs de type1, poste le formulaire, le sgbd détecte l'erreur de type2 et je recommence comme ci-dessus. Si j'ai des erreurs sur un gros formulaire de 6 types et que l'utilisateur itéré 6 fois sur la correction du formulaire, il va pas être content !

Il me semble donc préférable de tester systématiquement TOUTES les erreurs avant le "pg_query($query)" et même avant le postage du formulaire et donc  sans alerte du sgbd via les contraintes et proposer à l'itilisateur la correction en 1 seule passe de  toutes les erreurs.
Si j'ai bien compris  l'alerte du sgbd m'est que moyennement utile (à moins qu'il y ai mieux à faire)...

Peut on mieux faire ?

#2 Re : PHP » Contraintes SQL sur attribut et traitement des erreurs en PHP » 10/07/2012 08:43:02

Merci de vos réponses mais je cherche toujours la solution.

Réponse à rjuju :
->  "die() est justement là pour quitter le script en affichant un message"
oui mais mon programme est planté avec le message :
  'Warning: pg_query() [function.pg-query]: Query failed: ERREUR: la nouvelle ligne viole la contrainte de   vérification «c1» de la relation «produit2» in C:\Docum....   ajoutersql2.php on line 16  : pg_query($query)or die( "erreur requete" );
erreur requete'
Cela ne me convient pas.

  ->  "Vous devriez plutôt faire une transaction si besoin, tester le retour de pg_query et rendre la main en gérant les erreurs possibles"
J'avais pensé plutôt à un Trigger sur Ajout et sur Modification mais comment récupérer le code de l'erreur (j'ai trouvé) mais le lieu de l'erreur car j'ai bien sur plusieurs contraintes sur la table, elles sont nommées (ici 'c1' dans l'exemple donné).
Comment récupérer le nom (ou les noms) de la contrainte qui plante . Est ce que seulement la première contrainte qui est en erreur est détectée ou toutes ?
Comment depuis Postgres afficher un message sur mon écran, j'ai bien trouvé dans des CREATE FUNCTION la commande : RAISE EXCEPTION $$ texte  % texte $$OLD.champ ;
Comment depuis mon fichier ajoutersql2.ph dans lequel je fais mon INSERT qui plante (ou pose problème si je capte le problème avant le plantage) revenir à mon fichier ajouterform.ph pour reproposer le formumaire.

Faire la vérification en PHP/Javascript AVANT l'INSERT, je sais faire mais je perds totalement l’intérêt du CONSTRAINT SQL du CREATE centralisé dans la BD.


Réponse à gleu :
  -> "pour éviter que n'importe qui connecté à la base ne puisse pas y placer des données qui n'ont aucun sens"
D'accord mais ma table Produit n'est accessible que par mon application PHP et c'est donc là (et uniquement là) que je veux éviter d'y placer des données qui n'ont aucun sens.

#3 PHP » Contraintes SQL sur attribut et traitement des erreurs en PHP » 09/07/2012 18:14:59

Marco
Réponses : 7

salut a tous,
Sur une table, je définis en SQL une contrainte genre : CONSTRAINT c1 CHECK(pd_prix >3)

Dans mon application PHP, si je saisis un prix de 1, lors de l'exécution du code php :
   $query= "INSERT INTO produit( pdt_designation, pdt_prix, pdt_categorie,pdt_datecrea)
  VALUES ( '$_POST[fdesignation]',$_POST[fprix],'$_POST[fcategorie]','$datecre')";   
  pg_query($query)or die( "erreur requete" );

l'erreur est détectée (très bien) :
Warning: pg_query() [function.pg-query]: Query failed: ERREUR: la nouvelle ligne viole la contrainte de vérification «c1» de la relation «produit2» in C:\Docum....   ajoutersql2.php on line 16  : pg_query($query)or die( "erreur requete" );
erreur requete

L'erreur est détectée mais PLANTE le programme. Il faut donc détecter l'erreur avant l'exécution de la rqt par pg_query($query), est ce possible ? Et comment l'indiquer proprement à l'utilisateur, reprendre la main et revenir à la saisie ?
Je ne vois pas de meilleure solution (et c'est là que je fais appel à vous) que de faire la verif en JavaScript dans le formulaire HTML de saisie.

Si la meilleure solution est Javascript alors quand est il utile de gérer les contraintes en SQL !

Merci pour vos commentaires.

Pied de page des forums

Propulsé par FluxBB