PDA

View Full Version : تولید عدد انحصاری برای شماره سفارش



pswin.pooya
یک شنبه 17 آذر 1392, 16:31 عصر
با سلام به دوستان

دوستان من به دنبال یه راه خوب برای تولید عدد انحصاری برای شماره سفارش جهت استفاده در درگاه بانک هستم.

مطابق با مستندات زیر با استفاده از تابع uniqid میشه یه شماره منحصر به فرد که از روی تیک ساعت سیستم به دست میاد تولید کرد. تا اینجا همه جی عالیه. فقط مشکل اینه سیستم ساعت هرچند مدت بکبار ریست میشه. و دوباره از صفر شروع میکنه. پس عددهای تولیدی این متد ممکن هست انحصاری نباشن. راه خوبی برای اینکار می دونید؟

http://php.net/manual/en/function.uniqid.php

nadi_1368
یک شنبه 17 آذر 1392, 16:51 عصر
من همچین چیزی تو نت پیدا کردم و برای شماره سفارش ازش استفاده میکنم

نظر شما؟؟؟؟



protected function MakeUnique($length=20)
{
$salt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789";
$len = strlen($salt);
$makepass = '';
mt_srand(10000000*(double)microtime());
for ($i = 0; $i < $length; $i++)
{
$makepass .= $salt[mt_rand(0,$len - 1)];
}
return $makepass;
}

pswin.pooya
یک شنبه 17 آذر 1392, 21:46 عصر
این روش هم از همون تیک (میکرو تایم استفاده می کنه‌) فکر نکنم این تابع هم تظمینی برای اینکار بده.

چیری که به ذهن من میرسه اینه که تاریخ رو به اول رشته تولید شده به uniqid استفاده کنیم. فکر نکنم توی طی یک روز این تایمر ریست بشه. اما باز هم تظمین خاصی نمی ده. و یا اینکه شماره رکورد دیتابیس رو به اول این رشته اضافه کنیم.

rezaonline.net
یک شنبه 17 آذر 1392, 23:05 عصر
مگه یک جدول توی دیتابیس برای ذخیره تراکنش ها ندارید ؟
خب هر بار id اون رکورد رو بفرستید دیگه مشکل تکراری بودن پیش نمیاد .
اصولیش هم همینه

pswin.pooya
دوشنبه 18 آذر 1392, 00:53 صبح
خب هر بار id اون رکورد رو بفرستید دیگه مشکل تکراری بودن پیش نمیاد .

خب فرض کنید بنا بر هر دلیلی ( هک و حذف و ... ) یک رکورد حذف بشه. اون رکورد جدید شماره رکورد قبلی رو می گیره.

rezaonline.net
دوشنبه 18 آذر 1392, 01:56 صبح
خب فرض کنید بنا بر هر دلیلی ( هک و حذف و ... ) یک رکورد حذف بشه. اون رکورد جدید شماره رکورد قبلی رو می گیره.
از خاصیت auto increment دیتابیس استفاده کنید ، همه رکورد ها آی دی یکتایی خواهند داشت .

pswin.pooya
دوشنبه 18 آذر 1392, 09:44 صبح
از خاصیت auto increment دیتابیس استفاده کنید ، همه رکورد ها آی دی یکتایی خواهند داشت .

دقیقا تو AI همچین اتفاقی می افته

Veteran
دوشنبه 18 آذر 1392, 11:47 صبح
دقیقا تو AI همچین اتفاقی می افته
زمانی این اتفاق میوفته که فیلد AI نباشه و شما به وسیله کوئری

SELECT MAX(`id`) AS `max_id` FROM `table`
ایدی اخرین رکورد رو به دست بیارین و یک واحد اونرو افزایش بدین،در این صورت اگر رکوردی با شماره 5 حذف بشه،خب نتیجه کوئری برای درج رکورد جدید 4 هست که یک واحد افزایش پیدا میکنه و رکورد جدید با ایدی 5 وارد جدول میشه
اما این اتفاق در AI نمیوفته و همیشه یک واحد از شماره اخرین رکورد(حتی رکورد حذف شده) بیشتر هست

pswin.pooya
دوشنبه 18 آذر 1392, 13:37 عصر
ایدی اخرین رکورد رو به دست بیارین و یک واحد اونرو افزایش بدین،در این صورت اگر رکوردی با شماره 5 حذف بشه،خب نتیجه کوئری برای درج رکورد جدید 4 هست که یک واحد افزایش پیدا میکنه و رکورد جدید با ایدی 5 وارد جدول میشه

1. فرض کنید سایت هک شده و بک آپ رو بر گردوندید
۲. توی DB من وقتی رکورد آخر رو حذف می کنم AI دوباره بر می گرده به شماره قبل

rezaonline.net
دوشنبه 18 آذر 1392, 15:09 عصر
1. خب بک آپ برگردوندید ، چه مشکلی پیش میاد ؟
اصلا بیایید راه حل دیگه رو پیشنهاد بدیم که دیگه خیال شما هم راحت بشه .
2.اصلا چنین چیزی ممکن نیست


$lastID = Yii::app()->db->createCommand("select id from tbl order by id desc limit 1")->queryScalar();
$now = time() - 1350000000;

$orderID = $lastID . $now ;