numero aleatoire

Eléphant du PHP | 406 Messages

29 juin 2005, 10:16

salut,

J'ai une table qui me sert à stocker les objet commander.
Dans cette table, la clé primaire est le numero de serie de l objet.
Et parfois pour certaine commande,on rempli la table objet mais on n a pas tout de suite le numero de serie, ce qui fait qu on met un numero aleatoire.
Ce que je voulais faire c etait prendre le dernier numero de serie de ma table et l incrementer de 1, mais c est pas possible car ma dans ma table on ne peux pas recuperer le derniere enregistrement.
Et je vois pas trop comment creer un numero aleatoire à ce moment la.
Suis je obligé de passer par une table numeroprovisoire dans laquel je stocke des numero ??


Merci

Mammouth du PHP | 19672 Messages

29 juin 2005, 10:22

Qu'est-ce qui t'empèche au juste de récupérer le dernier enregistrement ???
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 406 Messages

29 juin 2005, 10:24

dans ma table le clé primaire, c est le numero de serie.
Si sa aurai été des nombre autoincrementer j aurai pu recuperer le dernier à l aide d un max(numserie) mais ce n est pas le cas

Mammouth du PHP | 19672 Messages

29 juin 2005, 10:42

effectivement, tu as un problème: alors la solution, ce serait de générer un numéro aléatoire avec un préfixe bien identifiable du genre tmp_num-xxxxxxx où la partie aléatoire serait bien évidemment le xxxxxxx
Tu pourrais , pour être sûr qu'il n'est pas déjà utilisé le baser sur un timestamp du moment de l'enregistrement.

Enfin c'est une idée
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 406 Messages

29 juin 2005, 10:50

un timestamp ..???
je vois pas trop.

Pour recuperer le derniere enregistrement je peux utiliser les OID comme ceci

Code : Tout sélectionner

select id from matable where oid=(select max(oid) from matable)

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

29 juin 2005, 12:02

ce qui est important de faire : marquer les numéros aléatoires
(faut pas essayer d'utiliser un numéro qui correspond à rien)
=> solution faire une table "num_serie_temp" avec un seul attribut : le numéro de série. Quand tu génère un numéro de série tu le met dans ta table principale ET dans ta table num_serie_temp comme ca tu peux facilement retrouver les numéro générés avec un inner join

Ton champ numéro de série est de quel type ? numérique pur ou chaine de caractères

Eléphant du PHP | 406 Messages

29 juin 2005, 13:23

il est de type chaine de caractere
mais si je fais une table numero temporaire, je met un numero de depart dedans et chque fois que j insere un enregistrement je prend le dernier de cette table aleatoire et je l incremente de 1.
Et donc à chaque fois j ajouterai le numero de serie provisoire dans ma vrai table , celle qui stocke mes objet et aussi dans la table numero temporaire ?

Mammouth du PHP | 19672 Messages

29 juin 2005, 13:31

Bien sur: la nouvelle table te sert en fait à stocker le dernier article enregistré puisque ta clé primaire n'est pas auto-incrémentée. il te faut donc un point de repère... que tu trouveras dans cette autre table. Et en fait dans cette autre table, tu n'ajoutes pas une nouvelle ligne à chaque nouvel article, tu fais un update de la seule ligne qu'elle contient.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

29 juin 2005, 13:41

il est de type chaine de caractere
mais si je fais une table numero temporaire, je met un numero de depart dedans et chque fois que j insere un enregistrement je prend le dernier de cette table aleatoire et je l incremente de 1.
Et donc à chaque fois j ajouterai le numero de serie provisoire dans ma vrai table , celle qui stocke mes objet et aussi dans la table numero temporaire ?
c'est une solution, mais le pricipal intéret de cette seconde table est de localiser rapidement les numéros temporaires, pas besoin de passer par là si tu peux créer un code temporaire comme te l'ai proposé Cyrano (je pensais que ton numéro était un nombre pur => pas possible de lui mettre un préfixe)

Si tu fait pas de table intermédiaire et que tu préfixe par "TMP" tu peux facilement obtenir le plus grand indice avec :

Code : Tout sélectionner

SELECT SUBSTRING(MAX(code),4) FROM table WHERE code LIKE "TMP%"

Eléphant du PHP | 406 Messages

29 juin 2005, 13:52

ok,on fait un update à chaque fois ce qui fait qu on a toujours une ligne.
J ai crée la table et j ai mis un seule enregistrement dedans.
alea0.
Ce que je vais faire, est que je vais recuperer cette enregistrement
et à l aide de fonction je vais mettre les 4 premiers caractere dans une variable, et le reste des autres caractere dans une autre.
$c1 et $c2.

Et comme cela je n aurai qu à incrementer $c2 de 1 à chaque et avant d inserer les enregistrement dans mes 2 tables je les concatene
$c=$c1.$c2, comem sa dans ma table d article j aurai des numero de serie de ce genre :
alea0
alea1
alea2
..
alean

Eléphant du PHP | 406 Messages

29 juin 2005, 14:18

j ai fait cela et c est bon sa a l air de marcher
if(isset($_POST['Ajouter'])){
if(empty($_POST['nums']))
{
$sql6="select numprov from numeroprov
where idprov=1 ";
$result6=pg_query($sql6);
while($list6=pg_fetch_array($result6))
{
$series6=$list6['numprov'];
$taille=strlen($series6);
$base=substr($series6, 0, 4);  
$chiffre=substr($series6, -1, $taille-4); 
}
}

for($i=1;$i<=$_POST['qte'];$i++)
{
$sql1="select numcommande from commandes where bon_commande='".$_POST['numc']."'";
$res=pg_query($sql1);
while($list=pg_fetch_array($res))
{
$bcom=$list['numcommande'];
}
if(empty($_POST['nums']))
{
$chiffre=$chiffre+1;
$prov=$base.$chiffre;
}
else
{
$series=$_POST['nums'];
}

$sql="insert into objet(numserie, numcommande,numposte,numinventaire,type_objet, marque,  modele,  propriete1 ,  propriete2,  propriete3,  propriete4,  propriete5,propriete6,  propriete7, propriete8,  propriete9,  propriete10,  commentaire1,  commentaire2, prix,  date_livraison,  duree_garantie_site, duree_garantie_atelier, contrat_de_maintenance, date_fin_contrat) values ('".$prov."',".$bcom.",7, '".$_POST['numi']."', '".$_POST['fam']."','".$_POST['marq']."','".$_POST['mod']."', '".$_POST['p1']."','".$_POST['p2']."','".$_POST['p3']."','".$_POST['p4']."','".$_POST['p5']."','".$_POST['p6']."','".$_POST['p7']."','".@$_POST['p8']."','".$_POST['p9']."','".$_POST['p10']."','".$_POST['comm1']."','".$_POST['comm2']."'";
$null="NULL";
if(!empty($_POST['prix'])){
$sql=$sql." , ".$_POST['prix'];
}else{
$sql=$sql." , ".$null;
}
if(!empty($_POST['liv'])){
$sql=$sql." , '".$_POST['liv']."'";
}else{
$sql=$sql." , ".$null;
}

if(!empty($_POST['sit'])){
$sql=$sql." , ".$_POST['sit'];
}else{
$sql=$sql." , ".$null;
}
if(!empty($_POST['ret'])){
$sql=$sql." , ".$_POST['ret'];
}else{
$sql=$sql." , ".$null;
}
if(!empty($_POST['fin'])){
$sql=$sql.",'".$_POST['numcontr']."' , '".$_POST['fin']."'";
}else{
$sql=$sql.",'".$_POST['numcontr']."' , ".$null;
}

$sql=$sql.")";
  echo $sql;
  echo "<b>".$prov."</b>";
$result=pg_query($sql); 

$dat=date("d/m/Y");   
$sql2="insert into etat_objet (date,numserie,numetat) values ('".$dat."','".$prov."', 1)";
$resu=pg_query($sql2);

$sql7="update numeroprov set numprov='".$prov."' where idprov= 1 ";
$resu7=pg_query($sql7);
}
}

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

29 juin 2005, 15:49

juste deux remarques en passant :
- oublie pas de faire des mises a jours dans tes autres tables quand tu changera un numéro aléatoire pour un *bon* numéro.
- utilise plutot des numéro avec des zéros comme alea0004 si possible car on utilise un tri alphabétique (et pas numérique) ce qui fait que alea101 est inférieur à alea3 => :x

pour finir le probleme est-il [RESOLU] ?

Eléphant du PHP | 406 Messages

30 juin 2005, 13:05

ouai
merci