8791 sujets

Développement web côté serveur, CMS

Bien le bonsoir, je suis en train de me....prendre la tete pour faire un numero de facture.
Chaque numéro devant être unique.

J'ai vu pas mal de choses mais rien ne me convenait réellement donc j'ai retroussé les manches et roulez jeunesse...

Voila le code :


$requete_user="SELECT id, login,pass,nom,prenom,adresse,tel,mail FROM users Where login='".$login."'";
$affiche_user= $mysqli ->query($requete_user) or die (mysql_error());
$result_user= mysqli_fetch_array($affiche_user);
echo $result_user['id'];
$id_user=$result_user['id'];

$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
$date_actuelle=date("Ymd", $tomorrow);
echo $date_actuelle;

$insert_facture="insert into facture (id_user,user,total,date,numero) values('".$id_user."','".$login."', '".$tot."',  '".$date_actuelle."','5'";
$facture= $mysqli ->query($insert_facture) or die (mysql_error());

echo $facture['date_actuelle'];

$q = $mysqli->query("select * from facture where id_user='".$id_user."' ORDER BY numero DESC");
$r = mysqli_fetch_array($q) or die (mysql_error());
if (isset ($r['numero'])) {
	$num=$r['numero']+1;
	$ajou="update facture set numero='".$num."' where id_user='".$id_user."'";
	$numero_init=$mysqli->query() or die (mysql_error());

}else{
	$ajou="update facture set numero=1 where id_user='".$id_user."'";
	$numero_init=$mysqli->query() or die (mysql_error());

}


Je n'ai aucune erreur sql mais après mes 2 echo (id_user et date) rien ne s'affiche (rien même après le code ci-dessus).
La valeur donnée en "dur" a numero est juste pour voir si ca passait.

D'ou vient la couille à votre avis ? En sachant que mon insert n'insert rien ^^
Modérateur
Bonjour,

Il y a peut-être une raison qui m'échappe, mais pourquoi ne pas mettre le champ de la table (FactureID) en auto-incrémente? C'est le système de base de données qui se chargerait de générer le numéro de facture.

À moins que MySQL ne supporte pas ça, ce qui serait assez étonnant quand même...

Edit : Est-ce que c'est parce que tu veux une séquence de numéro de facture par utilisateur? Si c'est le cas, je trouve ça étrange, légalement parlant.
Modifié par Tony Monast (26 Aug 2010 - 20:07)
@Tony > +1 (c'est d'ailleurs ce que j'étais en train d'écrire quand j'ai vu que tu avais déjà posté Smiley cligne )

Sinon pour trouver la date du lendemain c'est quand même plus simple de faire
$date_actuelle = date("Ymd", strtotime("now + 1 day"));
Et si une requête ne fonctionne pas il suffit de l'afficher en clair (par exemple echo $requete_user) avant de l'exécuter et de la lancer telle quelle dans phpMyAdmin.
Je me suis pris la tête pour rien en effet...j'ai juste à récupérer l'id....
Faut que je débauche la vraiment...

Merci pour votre aide
Modérateur
J'ajouterais aussi que même si les probabilités sont minces, il y a un risque de Race Conditions avec le code que tu utilises pour générer tes numéros de facture. Faire une petite recherche sur Google à ce sujet. À noter que les articles sont souvent en anglais.
Modérateur
morhead a écrit :
Je me suis pris la tête pour rien en effet...j'ai juste à récupérer l'id....


Tu as finalement décidé d'utiliser le id en auto-incrémente? Techniquement c'est beaucoup mieux et d'un point de vue légal, les numéros des factures doivent être séquentiels et uniques dans l'ensemble du système, et non une séquence pour chaque utilisateur/client.
Modifié par Tony Monast (26 Aug 2010 - 21:03)
Hum...avec un lock table sur ma requête cela résoudrait le problème non ? ou alors j'ai rien compris ^^
Modérateur
En fait, pour le Race Conditions, imagine que ton script de génération de numéro de facture s'exécute deux fois à la même nanoseconde près (A et B).

A. Récupére le dernier numéro qui est le 105
B. Récupére le dernier numéro qui est le 105
A. Attribuer le numéro 106 à la nouvelle facture
B. Attribuer le numéro 106 à la nouvelle facture

Il y aura donc au final deux factures avec le numéro 106.

Pour le Lock Table, il faudrait l'essayer, mais j'ai un doute étant donné que l'opération s'effectue en plusieurs étapes. Pour un système en production, je ne crois pas non plus qu'il serait sage de verrouiller complètement la table juste pour générer le prochain id. Ça risque de ralentir l'application. Ou alors c'est moi qui n'a pas compris. Smiley ravi
Oui le lock était pour éviter le doublon, mais ce n'est pas en effet forcément la meilleur solution.

Je vais essayer de voir comment réoudre le problème autrement.
Si au finale je n'y arrive pas, et bien j'utiliserais le lock pour quand même verrouiller un peu...
Ben en partant sur l'idée que le n° de facture est l'id unique en auto-increment il n'y a plus à se poser de question. Ou c'est moi qui ne comprend pas. Smiley murf

Pour préciser : le n° sera forcément unique et si tu as besoin de connaître ce n° directement après l'INSERT tu utilises mysql_insert_id.
Modifié par Heyoan (26 Aug 2010 - 22:19)
Oui en effet ^^

Je suis content j'ai enfin finit mon appli....enfin...niveau sécurité par contre j'suis nullissime et ca....enfin bon.

Grand merci pour votre aide.