(PHP)Définir la valeur d'ID à une base mySQL

Graig083 -  
tito23 Messages postés 305 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,
Voilà mon problème...
Je voudrais mettre en place un formulaire d'adhésion en ligne pour notre association (htlm/php), relié à une base de données mySQL. A chaque nouvelle entrée une ID auto incrémentée (clé primaire) est générée. Jusque là j'ai déjà fait, le système fonctionne.
Mais je voudrais que cette ID ait une valeur spécifique suivant les information saisies tel que :
- IF la valeur du champs6 est "option1" alors la valeur de l'ID incrémenté doit être comprise entre 1 et 50
- ELSEIF la valeur du champs6 est "option2" alors la valeur de l'ID incrémenté doit être compris entre 51 et 100
- ELSE la valeur de l'ID incrémenté doit être au delà de 101

Voici le code de la page PHP envoyant les données dans la base :

$sql = "INSERT INTO *** VALUES('$id','$nom','$prenom','$sexe'...)";
mysql_query($sql) or die('Erreur lors de la connexion à la base de donnée !'.$sql.' '.mysql_error());
$id = mysql_insert_id();

Merci d'avance de votre aide

8 réponses

vordano Messages postés 1685 Date d'inscription   Statut Membre Dernière intervention   316
 
non on ne peux pas faire ça sur un id auto incrémenté
tu peux mettre un type int pour l'id et décider toi même du numéro de l'id.

mais a quoi est ce que ça te sert ce genre de bidouillage ?
0
Graig083
 
Bonjour Vordano et merci de ta réponse.
En fait nous attribuons depuis toujours un numéro d'adhérent qui nous sert ensuite au classement de documents en interne. C'est un système que nous faisions jusqu'à présent en manuel que je souhaiterais conserver car la logistique est bien rodée. C'est pour ça que je pensais utiliser l'ID auto-incrémentée mais je peux tout a fait utiliser un int, ca m'est égal tant que je peux respecter les conditions dictées.

Peux tu me dire quel serait le code pour "forcer" le int que je vais créer et qu'il soit dans un ordre croissant ?
0
tito23 Messages postés 305 Date d'inscription   Statut Membre Dernière intervention   4
 
dans le cas où la valeur du champs6 est "option2" et le dernier numéro est 100 comment tu prévois gérer ça?
0
Graig083
 
Je ne vois pas votre réponse tito23 :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tito23 Messages postés 305 Date d'inscription   Statut Membre Dernière intervention   4
 
test ceci
if($_POST['champ6''] == 'option1')

{$req =mysql_query("select max(id) from *** where id between 1 and 49);
$res =mysql_fetch_array($req);
$max = $res[0]; 
if(mysql_nums_rows($req) == 0)
$id =1; 
else
$id =$max +1;
mysql_query("INSERT INTO *** VALUES('$id','$nom','$prenom','$sexe'...)"); 
}
else if($_POST['champ6''] == 'option2')
{$req =mysql_query("select max(id) from *** where id between 50 and 99);
$res =mysql_fetch_array($req);
$max = $res[0]; 
if(mysql_nums_rows($req) == 0)
$id =50; 
else
$id =$max +1;
mysql_query("INSERT INTO *** VALUES('$id','$nom','$prenom','$sexe'...)"); 
}
else if($_POST['champ6'] == 'option3')
{$req =mysql_query("select max(id) from *** where id > 99);
$res =mysql_fetch_array($req);
$max = $res[0]; 
if(mysql_nums_rows($req) == 0)
$id =100; 
else
$id =$max +1;
mysql_query("INSERT INTO *** VALUES('$id','$nom','$prenom','$sexe'...)"); 
}
0
Graig083
 
Merci tito pour ton travail !
Malheureusement ça ne marche pas...
Il m'a semblé qu'il manqué des " après chque where id between ... and ...
(le code s'affichait bizarrement) ??
Mais le problème semble venir des conditions
if(mysql_nums_rows($req) == 0)
$id = ...
else
$id = $max +1;

J'ai un msg syntax error, unexpected T_ELSE
0
tito23 Messages postés 305 Date d'inscription   Statut Membre Dernière intervention   4
 
si tu vas corriger la requête, le message va probablement disparaitre puisque le 'if' est en relation avec la requête, il y aura des message d'erreurs, veuille à spécifier la ligne en question
0
Bhurigan
 
Bonjour si vous faites ceci:

- IF la valeur du champs6 est "option1" alors la valeur de l'ID incrémenté doit être comprise entre 1 et 50
- ELSEIF la valeur du champs6 est "option2" alors la valeur de l'ID incrémenté doit être compris entre 51 et 100
- ELSE la valeur de l'ID incrémenté doit être au delà de 101


Votre analyse est mal faite, que se passe il quand il y a plus de 50 valeurs pour le champ6 qui vaut option 1? Vous ne pouvez plus utiliser la base?

numéro d'adhérent
Dans ce cas rajoutez un numéro d'adhérent qui ne sera pas identifiant.

En fait nous attribuons depuis toujours un numéro d'adhérent qui nous sert ensuite au classement de documents en interne. C'est un système que nous faisions jusqu'à présent en manuel que je souhaiterais conserver car la logistique est bien rodée.

Donc il devrait être dans votre analyse et conception du modèle logique. Soit vous le gardez car il est pertinent soit vous ne le gardez pas car il sert à rien. On peut voir que c'est une valeur calculable en fonction su champ 6 donc suivant l'analyse merise il n'as pas lieu d'être. Utilisez directement le champ 6(bizarre comme nom de champ et pas évocateur) pour ce classement(il suffit lors de l'affichage de faire un test pour savoir lequel des 3 cas correspond à la valeur du champ 6) et d'afficher selon ce test : moins de 50, entre 51 et 100, plus de 100.

Ce que vous faites est simplement vous compliquer la vie, risquer des erreurs(donc l'invalidité de toute la base), rallonger le temps de développement et provoquer des lenteurs de traitement par le biais de redondance. D'où l'intérêt d'avoir une conception bien faite.
0
Graig083
 
Je suis tout a fait d'accord avec vous sur le fait que je me complique la vie ! :-)
S'il est plus simple de rajouter un champs "numéro d'adhérent" et de ne pas utiliser le champs id pour appliquer ma requête if je ne demande que ça ! Mais là non plus je ne sais pas comment paramétrer les conditions pour que le numéro d'adhérent soit compris entre 1 et 50 si le champs6 (son vrai nom est "activité") est option1, etc.
Pour ce qui est du fait qu'au delà de 50 on ne peut plus utiliser la base c'était pour ne pas me compliquer encore plus sachant que je controle la base quotidiennement et que si on arrive a la limite des 50 je supprimerai l'option dans mon formulaire html.
0
Graig083
 
J'ai bien essayé de "tripatouiller" ton code (pour le comprendre avant tout) et j'ai enfin réussi à ce qu'il n'y ait plus de message d'erreur (l'entrée est bien saisie dans la base) mais il ne tient absolument pas compte des conditions if... :-(

Voilà le code tel que je l'ai modifié :

mysql_connect('localhost','util','mdp');
mysql_select_db('base');

// verif doublons
$sql = "SELECT id FROM *** WHERE nom='$nom' AND prenom='$prenom'";
$req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
$res = mysql_num_rows($req);

if($res!=0)
{
echo 'Entrée déjà existante';
}
else
{
if ($_POST["champs6"] == 'option1')
{
$req = mysql_query("SELECT max(id) FROM *** WHERE id BETWEEN 1 AND 49");
$res = mysql_fetch_array($req);
$max = $res[0];
if (mysql_num_rows($req) == 0)
$id = 1;
else
$id =$max +1;
$sql = "INSERT INTO *** VALUES('$id','$nom'...)";
mysql_query($sql) or die('Erreur lors de la connexion à la base de donnée !'.$sql.' '.mysql_error());
}
else if ($_POST["champs6"] == 'option2')
{
$req =mysql_query("SELECT max(id) FROM *** WHERE id BETWEEN 51 AND 99");
$res =mysql_fetch_array($req);
$max = $res[0];
if (mysql_num_rows($req) == 0)
$id = 51;
else
$id =$max +1;
$sql = "INSERT INTO *** VALUES('$id','$nom'...)";
mysql_query($sql) or die('Erreur lors de la connexion à la base de donnée !'.$sql.' '.mysql_error());
}
else if ($_POST["champs6"] == 'option3')
{
$req =mysql_query("SELECT max(id) FROM *** WHERE id > 100");
$res =mysql_fetch_array($req);
$max = $res[0];
if(mysql_num_rows($req) == 0)
$id =101;
else
$id =$max +1;
$sql = "INSERT INTO *** VALUES('$id','$nom'...)";
mysql_query($sql) or die('Erreur lors de la connexion à la base de donnée !'.$sql.' '.mysql_error());
}
}
mysql_close();
?>
0
tito23 Messages postés 305 Date d'inscription   Statut Membre Dernière intervention   4
 
as tu changé le nom du tableau '***' dans
SELECT max(id) FROM ***
0