2010-06-21 8 views

Répondre

1

Si vous voulez garantir l'unicité, vous devez vérifier quelque chose. Vous pouvez utiliser un fichier plat et stocker uniquement le dernier numéro utilisé (que vous pouvez ensuite incrémenter), mais il serait stupide de ne pas utiliser une base de données. Vous devez stocker un tas d'autres informations liées au numéro (coordonnées, ce que la commande consiste, etc) et une base de données est idéale pour cela.

+0

si je produis de chaîne comme cette date (YmbHis) serait-il unique si le site est fortement utilisé – Smith

+0

^Surtout si votre serveur observe l'heure d'été. Je pense qu'il est préférable de simplement vérifier la base de données (ou l'avoir générer le numéro de commande pour vous comme suggéré par Thomas). Ce n'est pas lourd sur la base de données, et même si c'était le cas, vous ne générez probablement pas plus de quelques dizaines de numéros de commande par minute. –

0

Si vous utilisez une base de données MySQL, vous pouvez générer un numéro de série sans pré-vérifier la base de données à l'aide d'une colonne auto_increment. L'insertion d'une nouvelle ligne entraînera l'attribution d'un nouvel ID unique à cette colonne sans avoir à lire/écrire cette colonne dans votre PHP. Alternativement, si vous voulez un ID global unique sans même une base de données, alors vous pouvez utiliser la fonction uniqid() de PHP. Notez que cela renvoie une chaîne. Si vous utilisez plusieurs machines physiques ou que vous vous déplacez d'un serveur à l'autre, vous devez ajouter un préfixe (premier argument) différent sur chaque machine. Lorsqu'elle est utilisée sur la même machine, cette fonction ne doit jamais renvoyer deux fois la même valeur de chaîne.

+0

peut mysql_return le dernier identifiant unique sans requerying la base de données? – Smith

+0

@Smith: http://php.net/manual/fr/function.mysql-insert-id.php (Mais je ne sais pas si elle est réactualisée ou non.) – Svish

+0

Je doute que mysql_insert_id crée une nouvelle requête DB, étant donné la description (par exemple, le fait qu'il soit retenu moins longtemps que LAST_INSERT_ID() de MySQL). Mais c'est une bonne question. – thomasrutter

1

Il y a plusieurs problèmes en utilisant des colonnes autoincrement dans mysql (pas moins le fait qu'il n'échelle à des nœuds équivalents). Alors que vous pouvez maintenir un générateur de séquence à peu près n'importe où (memcache, fichiers, base de données) PHP n'implémente pas la sémantique de verrouillage de fichier sophistiquée - en plus d'affecter les performances, vous pouvez rapidement obtenir des contrats. Il ne s'adapte pas aux grands volumes.

Si vous avez PL/SQL disponible, alors je vous recommande d'implémenter un générateur de séquence là-bas - alternativement vous pourriez envisager d'implémenter un générateur en PHP et sqlite.

Je recommande fortement que vous mettre en œuvre votre générateur pour créer un nombre de formats:

$ use_number = ++ $ sequence_number. str_pad ($ node_id, '0', $ max_nodes, STR_PAD_LEFT);

Où node_id est un nombre référençant de manière unique le substrat de stockage où le numéro de séquence actuel est stocké. Et $ max_nodes est un peu plus que le nombre maximum de chiffres trouvés dans $ node_id (par exemple, 3 permet d'avoir jusqu'à 999 nœuds).

Sinon, traitez-la comme une chaîne avec ponctuation entre les 2 parties (et/ou stockez les 2 parties dans différentes colonnes de base de données).

C.

Questions connexes