Page 1 sur 1

Contrôler que les valeurs n'existent pas dans la tables

Posté : 06 janv. 2006, 00:44
par Sebe
Salut,

J'ai fait un petit script pour insérer des enregistrements dans une table mais au cas où (je perd mon latin) comment être certain que les valeurs ne sont pas existantes?

Un peu plus d'explication: je dois insérer plusieurs paramétres pour identifier une personne mais elle pourrait malgré tout avoir le même nom et prénom ... c'est pour cela que j'ai inclus en plus la date de naissance, y'aura moins de risque que les 3 concordes!

Voici mon code:

<?php require_once('../../Connections/kainb_database.php'); ?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO acrho_participant (nom, prenom, date_naissance, sexe) VALUES (%s, %s, %s, %s)",
                       GetSQLValueString($_POST['nom'], "text"),
                       GetSQLValueString($_POST['prenom'], "text"),
                       GetSQLValueString($_POST['naissance'], "date"),
                       GetSQLValueString($_POST['sexe_part'], "text"));

  mysql_select_db($database_kainb_database, $kainb_database);
  $Result1 = mysql_query($insertSQL, $kainb_database) or die(mysql_error());

  $insertGoTo = "table_participants.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}

mysql_select_db($database_kainb_database, $kainb_database);
$query_news_part = "SELECT * FROM acrho_participant";
$news_part = mysql_query($query_news_part, $kainb_database) or die(mysql_error());
$row_news_part = mysql_fetch_assoc($news_part);
$totalRows_news_part = mysql_num_rows($news_part);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Enregistrement des participants</title>
</head>

<body>

<table width="702" border="0" cellpadding="0" cellspacing="0">
  <!--DWLayoutTable-->
  <tr>
    <td width="46" height="27">&nbsp;</td>
    <td width="624">&nbsp;</td>
    <td width="32">&nbsp;</td>
  </tr>
  <tr>
    <td height="195">&nbsp;</td>
    <td valign="top">      <form name="form1" method="POST" action="<?php echo $editFormAction; ?>">
        <table width="100%"  border="1" cellspacing="0" cellpadding="0">
          <tr>
            <td>Nom du coureur </td>
            <td><input name="nom" type="text" id="nom" maxlength="45"></td>
          </tr>
          <tr>
            <td>Pr&eacute;nom du coureur </td>
            <td><input name="prenom" type="text" id="prenom" maxlength="45"></td>
          </tr>
          <tr>
            <td height="54">Sexe</td>
            <td><p>
              <label>
              <input name="sexe_part" type="radio" value="H" checked>
    Homme</label>
              <br>
              <label>
              <input name="sexe_part" type="radio" value="D">
    Femme</label>
              <br>
            </p></td>
          </tr>
          <tr>
            <td>Date de naissance </td>
            <td><input name="naissance" type="text" id="naissance" value="AAAA-MM-JJ" maxlength="10"></td>
          </tr>
          <tr>
            <td>&nbsp;</td>
            <td><input type="submit" name="Submit" value="Envoyer">
            <input type="reset" name="Submit" value="Réinitialiser"></td>
          </tr>
        </table>
        <input type="hidden" name="MM_insert" value="form1">
    </form></td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td height="20"></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td height="125"></td>
    <td valign="top"><!--DWLayoutEmptyCell-->&nbsp;</td>
    <td></td>
  </tr>
  <tr>
    <td height="49"></td>
    <td>&nbsp;</td>
    <td></td>
  </tr>
</table>
</body>
</html>
<?php
mysql_free_result($news_part);
?>
Si quelqu'un peut m'aider?

Merci

Posté : 06 janv. 2006, 01:04
par Cyrano
Techniquement, rien n'interdit que deux Jean Dupond soient nés le 1er février de la même année, un à Nancy, l'autre à Bordeaux. Le seul point qui permettrait de les différencier, ce serait leur numéro INSEE... auquel tu n'as pas accès et dont tu n'aurais de toutes façon pas le droit de te servir.

Ceci dit, c'est aussi à ca que sert une clé primaire dans une table : les autre champs peuvent comporter des doublons, mais pas la clé primaire ni les index UNIQUE..

En fin de compte, quel est donc le problème que tu voudrais résoudre ?

Posté : 06 janv. 2006, 01:20
par Sebe
Re,

Toi qui connais si bien mes tables pour m'avoir filer un gros coup de main, celle que j'ai appelé 'acrho_participant' comporte comme champs: ID_coureur, nom, prenom, date_naissance et sexe.
Lors de l'encodage, je voudrais qu'il soit impossible d'insérer une même personne! C'est pourquoi, je pensais faire un test sur le nom, le prénom et la date de naissance ... un des 3 doit être différent! Est-ce possible?

Merci

Posté : 06 janv. 2006, 01:24
par Cyrano
Une idée comme ça : ton participant est membre d'un club, mais peut-être aussi d'une fédération avec un numéro de licence ... numéro unique sauf erreur de ma part. Tu pourrais l'utiliser en clé même si tu ne l'affiches pas sur le site.

Posté : 06 janv. 2006, 11:18
par Sebe
Salut,

En Belgique, il n'est pas obligatoire de faire partie d'une fédération donc pas de numéro! De plus, je vais refaire les classement depuis 24 ans (début de l'ACHRO - http://www.acrho.be) et certains coureurs ne sont malheureusement plus de ce monde.

Je pense que pour cette table, je vais refaire un listing du type http://www.kain-bruyere.be/administrato ... ipants.php avec en fin de ligne un bouton 'Editer' et 'Supprimer' cela risque d'être plus simple même si ce sont des milliers d'entrées aux quellles il faudra jeter un oeil!

Néanmoins, cela m'intéresse de savoir comment on pourrait contrôler les entées dans une double afin qu'il n'y pas de doublon ! ? !

Merci

Posté : 06 janv. 2006, 11:22
par Cyrano
Avec une requête tout simplement :

Code : Tout sélectionner

SELECT COUNT(*) FROM table WHERE nom = 'Nom à vérifier' AND prenom = 'prenom a verifier' AND date_naiss = 'date naissance à vérifier';
Et tu récupères le nombre trouvé, si c'est différent de zéro, tu sauras qu'il y a déjà une ligne avec le même nom/prénom/date de naissance enregistré, il te restera à contrôler si c'est effectivement la même personne ou si c'est un hasard qui fait que deux personnes différentes ont ces mêmes éléments en commun.