php mysql จะเอาค่าจากตัวแปรไปเปรียบเทียบกับค่าใน db ครับ
WHERE ไงครับ
Code (SQL)
SELECT COUNT(*) FROM `user` WHERE `rand` = '$rand_number'
Date :
2013-05-28 20:47:36
By :
cookiephp
กำ - -
ใช้กับ mysql_query() อ่ะครับ
Code (PHP)
$count_result = mysql_query("SELECT COUNT(*) FROM `user` WHERE `rand` = '$rand_number'");
$count_row = mysql_fetch_row($count_result);
mysql_free_result($count_result);
if ($count_row[0]) {
// มีอยู่แล้ว
} else {
// ยังไม่มี
}
Date :
2013-05-28 21:06:05
By :
cookiephp
ครับ
ว่าแต่ ใช้ loop while เพื่ออะไรครับ
Date :
2013-05-28 21:24:59
By :
cookiephp
จะมีแค่ 1000 - 9999 เท่านั้นเหรอครับ
แสดงว่าสมาชิกมีได้สูงสุด 8999 คนนะครับ
ถ้าต้องการแค่นั้นจริงๆ ผมมีวิธีที่ดีกว่าเยอะเลยครับ
ให้สร้างตาราง user_ids ไว้อันนึงครับ
โดยมีข้อมูลแค่ฟิลด์เดียวคือ id ที่เป็นตัวเลขตั้งแต่ 1000 - 9999
แล้วเวลาที่สมัครสมาชิกใหม่ ก็ให้ดึง id จากตารางนั้นมาแบบสุ่ม
Code (SQL)
SELECT `id` FROM `user_ids` ORDER BY RAND()
หลังจากนั้นก็ลบ id ที่เลือกมาทิ้งไป
DELETE FROM `user_ids` WHERE `id` = '$id'
Date :
2013-05-28 21:48:26
By :
cookiephp
หรืออีกแบบครับ ใช้ id เป็นรูปแบบ UUID
คือ CHAR (36) ครับ
id จะมีรูปแบบประมาณนี้
f47ac10b-58cc-4372-a567-0e02b2c3d479
นี่คือฟังก์ชั่นที่ผมเขีัยนขึ้นมาเพื่อสร้าง UUID V4
<?php
function uuid()
{
return sprintf(
'%02x%02x%02x%02x-%02x%02x-4%x%02x-%x%x%02x-%02x%02x%02x%02x%02x%02x',
mt_rand(0, 255),
mt_rand(0, 255),
mt_rand(0, 255),
mt_rand(0, 255),
mt_rand(0, 255),
mt_rand(0, 255),
mt_rand(0, 15),
mt_rand(0, 255),
mt_rand(8, 11),
mt_rand(0, 15),
mt_rand(0, 255),
mt_rand(0, 255),
mt_rand(0, 255),
mt_rand(0, 255),
mt_rand(0, 255),
mt_rand(0, 255),
mt_rand(0, 255)
);
}
จะเป็นการสุ่มแบบสุ่มจริงๆ ชาตินี้ก็จะไม่มีัวันซ้ำ (% ซ้ำมี แต่น้อยมากๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ)
Universally unique identifier
http://en.wikipedia.org/wiki/Uuid
ประวัติการแก้ไข 2013-05-28 22:32:01
Date :
2013-05-28 22:14:24
By :
cookiephp
แบบง่ายที่สุดคือ INSERT ไปเลย
โดยอยู่ในลูปที่ไม่รู้จบ แล้วทดสอบว่า INSERT ได้มั้ย ถ้ามันได้ แสดงว่าไม่ซ้ำ เพราะ id คือ PK มันจะซ้ำไม่ได้
ถ้าซ้ำก็จะ error และ mysql_query() ให้ผลเป็น false
แต่ถ้า INSERT ได้ ก็ให้ break ออกจากลูปซะ
สมมติว่าตาราง user มีแค่คอลัมน์เดียวคือ id
while (true) {
if (mysql_query("INSERT INTO `user` (`id`) VALUES (1000 + ROUND(RAND() * 8999))")) {
break;
}
}
แต่ปัญหาคือช่วงห่าง id ของคุณมันน้อยเกินไปครับ
การทำแบบนี้ มีโอกาสทำให้ติดอยู่ในลูปไม่รู้จบได้ เมื่อสมาชิกเริ่มเยอะขึ้น
เพราะอาจจะเกิดกรณีที่ว่า สุ่มเท่าไหร่ ก็ไม่เจอเลขที่ว่างสักที หรือนานมาก กว่าจะเจอเลขว่าง
ผมถึงแนะนำให้สุ่มตัวเลขเก็บไว้ในตารางก่อน แล้วค่อยดึงออกมาใช้
หรือไม่ก็ทำช่วงให้กว้างกว่านี้
เช่น 1000000 - 9999999 (MEDIUMINT)
หรือ 100000000 - 999999999 (INT)
จะสุ่มได้เร็วกว่า และได้จำนวนที่เยอะกว่า
Date :
2013-05-28 22:41:59
By :
cookiephp
ขอถามหน่อยครับ ที่บอกว่า ไม่ให้เกิดการเดาสุ่มเข้ามาถึง user id ของ user อื่นๆ[/quote]
ช่วยขยายความอีกนิดนึงได้มั้ยครับ ว่าเคสนี้จะเกิดขึ้นอย่างไร และจะส่งผลอย่างไรกับระบบ ^^
เพราะไม่เคยมีระบบของตัวเอง เลยมองภาพไม่ออก ^^"
Date :
2013-05-28 23:32:16
By :
{Cyberman}
วิธีแบบสร้างตารางของ id ไว้ก่อนล่วงหน้าสำหรับดึงออกมาใช้
โดยให้ช่วงห่าง 1000 - 99999
แต่ตอนดึงมาใช้ จะดึง 1000 - 9999 จนหมดก่อน แล้วค่อยดึง 10000 - 99999
สร้างตาราง user_ids
mysql_connect('localhost', 'your_username', 'your_password');
mysql_select_db('yourdb');
mysql_query("
CREATE TABLE IF NOT EXISTS `user_ids` (
`id` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
");
mysql_query("TRUNCATE TABLE `user_ids`");
mysql_query(
sprintf("
INSERT INTO `user_ids`
VALUES %s
",
'(' . implode('),(', range(1000, 99999)) . ')'
)
);
การดึงออกมาใช้
// เลือก id ที่ต่ำกว่า 1000 - 9999 ก่อน
// สังเกต ORDER BY RAND() คือการเลือกแบบสุ่ม
$id_result = mysql_query(
"SELECT `id` FROM `user_ids` WHERE `id` < 10000 ORDER BY RAND() LIMIT 1"
);
// ถ้าไม่มี id 1000 - 9999 เหลือแล้ว
if (!($id_row = mysql_fetch_row($id_result))) {
mysql_free_result($id_result);
// เลือกอีกครั้ง
$id_result = mysql_query(
"SELECT `id` FROM `user_ids` WHERE `id` ORDER BY RAND() LIMIT 1"
);
$id_row = mysql_fetch_row($id_result);
}
mysql_free_result($id_result);
// ลบ id ที่เลือกมาทิ้ง
mysql_query("DELETE FROM `user_ids` WHERE `id` = $id_row[0]");
// ใช้ $id_row[0] เป็นค่าของ id ในการ INSERT ต่อไป
mysql_query("INSERT INTO `users` (`id`) VALUES ($id_row[0])");
ประวัติการแก้ไข 2013-05-28 23:44:15
Date :
2013-05-28 23:43:02
By :
cookiephp
Load balance : Server 03