PDA

View Full Version : عدم ثبت مقدار در صورت تکراری بودن



Yashar1989
شنبه 05 بهمن 1392, 11:45 صبح
سلام
برای یه کاری باید حروف رندوم رو داخل یه دیتابیسی بریزم
توسط یه فانکشن حروف رندوم رو ایجاد میکنم و داخل دیتابیس میریزم
اما حروف تکراری هم وارد میشه
با چه دستوری میتونم چک کنم که اگر قبلاً داخل دیتابیس بود دیگه وارد نکنه و بره سراغ بعدی؟

masiha68
شنبه 05 بهمن 1392, 12:41 عصر
خب یه سلکت به دیتابیس بزن با اون عدد رندمی که تولید کردی اگه مقدار برگشتی بیشتر از 0 بود یکی دیگه تولید کن ... به همین راحتی

ferry_2020
شنبه 05 بهمن 1392, 13:17 عصر
سلام
این کار نیاز به گذاشتن شرط داره
فکر کنم بهتر باشه کدهای خودتون رو هم قرار بدین تا بهتر بشه راهنمایی کنیم

keyhan.taktaz
شنبه 05 بهمن 1392, 13:34 عصر
شما میتونی ایز کد های رندوم یونیک استفاده کنی به این صورت که :


$token = round(microtime(true) * 1000);

و یا میتونی قبل از ذخیره یه کوئری انجام بدی در صورت موجود بودن یه نام دیگه انتخاب کنه

marys_farahani
شنبه 05 بهمن 1392, 14:02 عصر
من اگه باشم کلا اون ستونم از نوع

http://up.p30parsi.com/out.php/i192196_untitled-1.jpg (http://up.p30parsi.com)

میزارم که اصلا نشه مقدار تکراری ذخیره کرد. که دیگه با کوئری نیام مقدار رو انتخاب کنم اگه وجود نداشت insert کنم.

sh.n.n786
شنبه 05 بهمن 1392, 18:28 عصر
من اگه باشم کلا اون ستونم از نوع

http://up.p30parsi.com/out.php/i192196_untitled-1.jpg (http://up.p30parsi.com)

میزارم که اصلا نشه مقدار تکراری ذخیره کرد. که دیگه با کوئری نیام مقدار رو انتخاب کنم اگه وجود نداشت insert کنم.

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


$flag = true;
do{
$Code = 564546;
$Select = "SELECT COUNT(*) AS `count` FROM `TbaleName` WHERE(`code`='{$code}') LIMIT 1";
if($Select['count'] > 0) {
// Generat new code
$flag = true;
}
else {
$flag = false;
}
} while($flag == true);


این فقط مثاله ها ...

MMSHFE
یک شنبه 06 بهمن 1392, 01:10 صبح
do {
$code = rand(10000, 99999);
} while(mysql_result(mysql_query("SELECT COUNT(*) AS `total` FROM `table` WHERE (`code`='{$code}')"), 0, 0) > 0);

rezaonline.net
یک شنبه 06 بهمن 1392, 03:22 صبح
این بهتره :)

do
{
$code = rand(10000, 99999);

} while(mysql_result(mysql_query("SELECT code FROM `table` WHERE (`code`='{$code}') limit 1"), 0, 0) > 0);

kb0y667
یک شنبه 06 بهمن 1392, 08:35 صبح
نوابغ ، اگه میخواهید جداول رو رندوم پر کنید خود MySQL تابع rand داره

mysql_query("update `table` set `code`=FLOOR(RAND()*1000000);",$conn);
پیشنهاد بانو برای primar_key بودن `code` هم خوب بود

میتونی کوئوری بالا رو کمی پیچیده تر کنی درصورت لزوم برای جلوگیری از ثبت تکراری :

mysql_query("UPDATE table dest SET dest.code=(select FLOOR(RAND()*1000) as R) where dest.code=''&&dest.code!=(select FLOOR(RAND()*1000) as R);",$conn);
زحمت تست با خودت

MMSHFE
یک شنبه 06 بهمن 1392, 12:17 عصر
آقای نابغه تر از سایرین، مشکل ایشون پرکردن تصادفی نیست، تکراری نبودنه. ضمناً بقیه فیلدها هم باید پر بشه و درنتیجه نمیشه با حلقه رندوم پر کرد.

sadegh1362
یک شنبه 06 بهمن 1392, 12:58 عصر
در این نوع script ها بهتر کار رو کاملا به دیتابیس بسپوریم . اگر مقدار فیلد در دیتابیس منحصر به فرد باشه منطقی تره چرا که شما سرور رو از اتصال دوباره به دیتابیس آزاد می کنید . وقتی دیتابیس برای ورودی منحصر به فرد خطا ارسال کنه .
شما با چک کردن خطا مقدارت رو عوض می کنی و نیاز به select زدن نیست .
یعنی از try - catch استفاده کنیم.

این نظر منه البته .

MMSHFE
یک شنبه 06 بهمن 1392, 13:18 عصر
قطعاً اگه راه حل دیتابیس مناسب باشه من هم بدم نمیاد بار اسکریپت کمتر بشه ولی بهرحال باید دقت کنید که این روش بصورت try...catch جواب نمیده چون ممکنه توی بلاک catch بازهم ثبت نشه و نمیشه try...catch نامحدود هم گذاشت. شاید تابع بازگشتی بهتر باشه ولی بهرحال تا وقتی که ثبت نشه، دوباره باید درخواست insert جدید بفرستیم و هربار هم باید کلی دیتای دیگه که مربوط به سایر فیلدهاست بین PHP و MySQL بی دلیل مبادله بشه. بعلاوه وقتی قید unique رو یک فیلد میگذارین، موقع ثبت همه این چک کردنها بهرحال انجام میشه و تا جایی که تست کردم سرعت select بیشتره. بخصوص کدی که آقا رضا گذاشتن.

sh.n.n786
یک شنبه 06 بهمن 1392, 19:41 عصر
درود و ...
بنده هم با کد رضا موافقم استفاده از خود فیلد بهتر از Count هست.
یه کدی هم یه دانشمند گذاشته بود فک کنم با IBM 2 3 سالی طول بکشه :قهقهه: