Bonjour,
j'ai crée deux contraintes dans ma table "client".
Je voudrais afficher une erreur via fichier XML selon le champ qui est en double. J'avais opté pour la solution "détection erreur mysql" pour afficher mon erreur.

Voici ma table:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE CLIENT (
   client_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
   client_login VARCHAR(30) NOT NULL,
   client_nom VARCHAR(30) NOT NULL,
   client_mail VARCHAR(40),
   client_passwd CHAR(40), -- mot de passe en SHA1
   client_date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   PRIMARY KEY(client_id),
   UNIQUE(client_login),
   UNIQUE(client_mail)
) TYPE=INNODB CHARACTER SET latin1 COLLATE latin1_swedish_ci;
Voici ce que j'avais fait pour une seule contrainte dans mon code php:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$sql = "INSERT INTO CLIENT (client_nom , client_login, client_passwd, client_mail )
            VALUES ('" . echapSQL($valeurForm['client_nom']) . "', 
                    '" . echapSQL($valeurForm['client_login']) . "',
                    '" . echapSQL(sha1($valeurForm['client_passwd'])) . "',
                    '" . echapSQL($valeurForm['client_mail']) . "')";
    $result = mysql_query($sql);
    // Si pas de résultat on affiche une erreur, sinon on redirige vers page d'amin
    if (!$result)
    {
      if(mysql_errno() == 1062) // si doublon
      {
        $valeurForm['client_login'] = '';// on efface le champ inciminé
        $erreur = texteXml('//erreur/sql/message[@nom="doublon_client"]', 'xml/erreur.xml');
      }
      else // sinon autre erreur
        $erreur  = texteXml('//erreur/sql/message[@nom="requete"]', 'xml/erreur.xml');
    }
    else
      header('location:admin.php?gestion=clients');
Bien entendu, vous l'avez deviné, l'erreur est la même si deux mêmes login ou deux mêmes email.

Connaissez vous une solution, en utilisant toujours le code d'erreur, pour voir quel champ est la cause de l'erreur ?

Merci d'avance.

EDIT:
J'ai trouvé cette solution mais pourriez vous me dire si c'est correct SVP ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
    $sql = "INSERT INTO CLIENT (client_nom , client_login, client_passwd, client_mail )
            VALUES ('" . echapSQL($valeurForm['client_nom']) . "', 
                    '" . echapSQL($valeurForm['client_login']) . "',
                    '" . echapSQL(sha1($valeurForm['client_passwd'])) . "',
                    '" . echapSQL($valeurForm['client_mail']) . "')";
    $result = mysql_query($sql);
    // Si pas de résultat on affiche une erreur, sinon on redirige vers page d'amin
    if (!$result)
    {
      if(mysql_errno() == 1062) // si doublon
      {
        if ( preg_match('/client_login/', mysql_error() ) == 1 )
        {
          $valeurForm['client_login'] = '';
          $erreur = texteXml('//erreur/sql/message[@nom="doublon_login_client"]', 'xml/erreur.xml');
        }
        elseif ( preg_match('/client_mail/', mysql_error() ) == 1 )
        {
          $valeurForm['client_mail'] = '';
          $erreur = texteXml('//erreur/sql/message[@nom="doublon_mail_client"]', 'xml/erreur.xml');
        }
      }
      else // sinon autre erreur
        $erreur  = texteXml('//erreur/sql/message[@nom="requete"]', 'xml/erreur.xml');
    }
    else
      header('location:admin.php?gestion=clients');