พบกับบทความเกี่ยวกับคอมพิวเตอร์และ programming ได้ที่ http://articles.modoeye.com
PHP development / อยากทำ random ดาต้าเบสอ่ะครับ
โอ๋
โอ๋
Tue 18 Jul 2006 12:07:42

คือผมอยากให้นำข้อมูลใสดาต้าเบสขึ้นมาโชว์แล้ว random อ่ะครับ แบบนี้นะครับ
Table ชื่อ member  ไว้เก็บข้อมูลสมาชิกที่เข้ามาเล่นกิจกรรมแล้ว
member :
no     mem_name      recive
0       tom_naka      ขอแสดงความยินดี
1       tongdee         เสียใจด้วยค่ะ
2       vorapon        ID : DAXES453
3       phiphat          เสียใจด้วยค่ะ
4       tangmo          เสียใจด้วยค่ะ
|          |

|          |

50     chaianal         ขอแสดงความยินดี

ส่วนอีกอัน เป็นดาต้าเบสที่จะเก็บ ID เกมส์ ซึ่งจะมีทั้งหมด 1000  รายการ แต่จะมี ID อยู่แค่ 50 ID เท่านั้นนอกนั้นจะมี คำว่า "เสียใจด้วยค่ะ"  
id_game
no     id_game   
0       ขอแสดงความยินดี
1       เสียใจด้วยค่ะ
2       AXES453
3       เสียใจด้วยค่ะ
4       เสียใจด้วยค่ะ
5       เสียใจด้วยค่ะ
6       AXES453
7       เสียใจด้วยค่ะ
8       เสียใจด้วยค่ะ
|       |
|       |
1000    เสียใจด้วยค่ะ

ผมจะใช้วิธีคือว่า Table ชื่อ member  จะเป็นตัวกำหนดว่าคนที่จะเข้ามารับ id นี้ได้จะต้อง เป็นสมาชิกเท่านนั้น และ ใครที่เข้ามาเล่นแล้วจะไม่สามารถเข้ามาเล่นอีกได้  อันนี้ผมทำแล้ว   จะเหลือก็แต่อันที่  ระบบให้ดึงข้อมูล id มาจาก Table : id_game  มาให้สามาชิก  เห็นว่าเขาได้หรือไม่ได้ และเช็คว่า สมาชิกคนไหน ที่ได้ id เกมส์หรือไม่ได้ และให้มันเช็คว่า ถ้าสามาชิกที่เข้ามาเล่น ได้ id ครบ 50 คนแล้ว  ให้ระบบหยุดทำงาน หรือให้ refresh ไปอีกหน้าเพื่อแจ้งว่า id ครบแล้ว


Administrator
Tue 18 Jul 2006 13:28:04
ผมแนะนำ น่าจะแบบนี้
no     mem_name      recive                     id
0       tom_naka      ขอแสดงความยินดี      0
1       tongdee         เสียใจด้วยค่ะ              1
2       vorapon        DAXES453               2
3       phiphat          เสียใจด้วยค่ะ              3

ตรวจสอบว่ามีจำนวนครบหรือยัง
SELECT COUNT(m.mem_name) AS num FROM member m INNER JOIN id_game g ON g.no=m.id WHERE recive='AXES453'

ถ้า num = 50 ก็ให้ไปหน้าที่ต้องการ

ถ้า num < 50 ก็ให้สุ่มค่าให้แก่ member
SELECT no, id_game FROM id_game WHERE NOT EXIST (SELECT * FROM member WHERE member.id=id_game.no) ORDER BY RAND() LIMIT 1

จากนั้นก็บันทึกค่าเปล่านั้นลงใน table member เพื่อให้ไม่เอาค่าที่ใช้แล้วมาคำนวณใหม่ครับ
โอ๋
โอ๋
Tue 18 Jul 2006 16:19:02

อืม ตรงที่ให้เช็คว่า ครบ 50 คนแล้วเนี่ย คือว่าคนที่จะได้ id เท่านั้นอ่ะครับ คือมี table ที่เก็บ  ข้อมูลคือ "เสียใจด้วยค่ะ" , "ID GAME"  มีแค่สองอย่างอ่ะครับ แต่จำนวน "เสียใจด้วยค่ะ"  จะมี 950 อัน และ "ID GAME"  จะมี 50 อัน ที่ผสมกันอยู่ใน table  id_game แล้วคนที่มาสุ่มจะได้รับผลจากกาสุ่มอ่ะครับ และ table member จะมีคนที่ได้ "ID GAME"  ก็ไม่รู้จะได้ตอนไหน แต่จะสุ่มจนกว่าจะมีสมาชิก สุ่ม "ID GAME"  ได้ครบ 50 คน ส่วนคนที่ได้  "เสียใจด้วยค่ะ" ก็ไม่รู้จะได้เท่าไหร่ในจำนวน 950 

ไม่แน่ใจว่า โค้ดที่ให้มาด้านบนเป็นเช็คว่า มีสมาชิกเข้ามาเล่นคน 50 คนหรือเปล่าอ่ะครับ

แล้ว
recive='AXES453' จะใส่ยังไงว่าคนที่ได้ id ได้ครบ  50 คนแล้ว เพราะ id มันไม่ซ้ำกันเลยอ่ะครับ

Administrator
Tue 18 Jul 2006 16:47:48
SELECT COUNT(m.mem_name) AS num FROM member m INNER JOIN id_game g ON g.no=m.id WHERE m.recive='ID GAME'

Query นี้จะนับเฉพาะ member ที่มีค่า recive เป็น "ID GAME" เท่านั้นครับ จากนั้นคุณก็ทำการ mysql_fetch_array() ออกมาแล้วตรวจสอบว่าค่านั้นเกิน 50 หรือยังครับ
โอ๋
โอ๋
Wed 19 Jul 2006 09:47:46

พอจะเขียนสคริปแบบเต็ม  ๆ ให้หน่อยได้ไหมครับ ผมจับต้นชนปลายแล้วมึนครับ  ระบบแบบนี้ไม่เคยทำเหมือนกัน แบบประมาณว่า

ขึ้นมาหน้าแรกแล้ว มีปุ่มให้กด refresh เมื่อกดปุ่ม refresh แล้วก็จะโชว์ id ขึ้นมาให้
id_game
no     id_game   
0       ขอแสดงความยินดี
1       เสียใจด้วยค่ะ
2       AXES453
3       เสียใจด้วยค่ะ
4       เสียใจด้วยค่ะ
5       เสียใจด้วยค่ะ

เมื่อได้รับ id เกมส์เสร็จแล้วก็คือจบ  แล้วสคริปที่จะเขียนถึงข้อมูลมาโชว์จะเขียนยังไง ผมได้ทำ tabel wไว้แบบนี้แล้ว

member :
no     mem_name      recive  id

id_game :
id     serial

รบกวนด้วยนะครับ

Administrator
Wed 19 Jul 2006 10:04:38
หมายถึงว่าต้องการให้มีปุ่ม แล้วเมื่อคลิ๊กแล้วให้มีหน้าต่างเด้งมาบอกหรือว่าอย่างไรครับ
และ คุณใช้ส่วนใดในการแยกว่าคนไหนเป็นสมาชิกหรือไม่ครับ
โอ๋
โอ๋
Wed 19 Jul 2006 10:27:58

หน้าที่ผมทำไว้คือเมื่อคลิ๊กปุ่มแล้วก็จะมีป๊อบอัพขึ้นมาจะมีหน้าเปล่า ๆ ขึ้นมาและมีข้อความเพื่อบอกเขาว่า กดปุ่ม refresh (bottom ที่ผมทำไว้ ) จากนั้นเมื่อเขากดปุ่ม refresh หน้านั้นก็จะ refresh เพื่อบอก id game ขึ้นมา ถ้ามันได้นะ หรือถ้าไม่ได้มันก็จะขึ้นว่า "เสียใจด้วยค่ะ " ดังตารางข้างล่าง
id_game

no serial id
แก้ไข ลบ 1 เสียใจด้วยนะค่ะ 1
แก้ไข ลบ 2 เสียใจด้วยนะค่ะ 2
แก้ไข ลบ 3 DSDI45D 3
แก้ไข ลบ 4 เสียใจด้วยนะค่ะ 4
แก้ไข ลบ 5 SFAKSRS 5
แก้ไข ลบ 1 เสียใจด้วยนะค่ะ 1
แก้ไข ลบ 2 เสียใจด้วยนะค่ะ 2
แก้ไข ลบ 3 DSDI45D 3
แก้ไข ลบ 4 เสียใจด้วยนะค่ะ 4
แก้ไข ลบ 5 SFAKSRS 5


โดยให้ดึงแบบสุ่มขึ้นมาจา table นี้ไปแสดง เพราะผมจะทำใว้ 1000 อันแล้วมี id game อยู่ประมาณ 50 id

นะครับ

Administrator
Wed 19 Jul 2006 11:57:32
หน้า popup (getresult.php)
<?
$link = mysql_connect($host, $user, $pass);
mysql_select_db($dbname, $link);
$res = mysql_query(" SELECT COUNT(m.mem_name) AS num FROM member m INNER JOIN id_game g ON g.no=m.id WHERE m.recive<>'เสียใจด้วยนะคะ'", $link);
if(mysql_num_rows($res)){
    $row = mysql_fetch_array($res, MYSQL_ASSOC);
    if($row["num"] < 50){
       $res = mysql_query(" SELECT no, id_game FROM id_game WHERE NOT EXIST (SELECT * FROM member WHERE member.id=id_game.no) ORDER BY RAND() LIMIT 1", $link);
       if(mysql_num_rows($res)){
          $row = mysql_fetch_array($res, MYSQL_ASSOC);
          mysql_query("UPDATE member SET recive='".$row["id_game"]."', id=".$row["no"]." WHERE no=".$GET["uid"], $link);
          echo $row["id_game"];
       }else{
          echo "ขออภัยระบบขัดข้อง";
       }
    }else{
       echo "ขออภัยด้วยค่ะ"; //มีผู้เล่นครบ 50 แล้ว
    }
}
mysql_free_result($res);
mysql_close($link);
?>


ในปุ่มที่ให้คลิ๊กก็ <input type="button" value="คลิ๊ก" onclick="window.open('getresult.php?uid=1234', 'res', 'width=150, height=100, toolbars=no, statusbar=no');">

เปลี่ยนเลข 1234 เป็นหมายเลขของสมาชิกครับ
โอ๋
โอ๋
Wed 19 Jul 2006 17:12:49

พอดีผมได้เปลี่ยนระบบใหม่ครับ ระบบเดิมที่คุณ admin ให้มาใช้งานได้ดีทีเดียวครับ แต่มันมีปัญหาอยู่อย่างคือเวลาคนเข้ามาเล่นกิจกรรมแล้วกดสุ่ม แล้วมีคนเข้ามาพร้อมกัน เลยทำให้ ได้ id เหมือนกันหลายคนอ่ะครับ

ก็เลยจะแก้ใหม่คือ

หน้า main.html

คำถาม : คุณเคยเล่นเกมส์นี้นานหรือยัง
ไม่เคย เคย
เคย นานแล้ว  
   


อันด้านบนเป็นหน้าต้อนรับเวลาคนเข้ามาเล่นกิจกรรม คือต้องเลือกคำตอบเสียก่อนจึงจะเข้าไปรับ id ได้ ผมก็เลยเปลี่ยนจาก id มาเป็นข้อความว่า  "คุณได้รับ ID ค่ะ"  และถ้าคนไม่ได้รับ id ก็จะโชว์คำว่า  "เสียใจด้วยนะค่ะ"

จากนั้นผมก็จะเอาคนที่ได้ ID  "คุณได้รับ ID ค่ะ"   มาเรียงในดาต้าเบสแล้วดึงเฉพาะคนที่ ได้  ID มาเรียงกัน แล้วทำสคริ๊ปแจก serial ไป โดยจะแก้ปัญหา serial ตรงกัน

จึงจะถามว่า ดังสคริปด้านล่างจะเพิ่มสคิปเข้าไปยังไง

index.php

<?
$DEFINE_SITE = true;
include "../../../includes/common.php";
include "../../../includes/template.php";
$template = new template();

$v = initial($ck);
if ($mem[rank] > 0){

$step = ($_POST[vote] != "" ? 1 : 0);

if ($_POST[poll] != "" && $step > 0){
 $poll = $_POST[poll];
query("INSERT INTO `activity_game` SET `mem_no` = '$mem[no]' , `mem_name` = '$mem[name]', `poll` = '$poll', `time` = '$time'");
  $startpage = "finish.html";
 if (mysql_insert_id() > 0){
  $template->assign_block_vars('fin',null);
 } else {
  $template->assign_block_vars('al',null);
 }
} else {
 $startpage = "main.html";
}

} else {
   $startpage = "member.html";
}

$template->set_filenames(array(
 'body' => $startpage,
));

$template->pparse('body');
?>

ขออธิบายนิดนึงนะ
activity_game` SET `mem_no` = '$mem[no]' , `mem_name` = '$mem[name]', `  << เป็นสคริปดึงค่าของสมาชิก

if ($mem[rank] > 0){  << สำหรับสมาชิกเท่านั้น ถ้าไม่ใช่สมาชิกให้ไปที่หน้า member.html แต่ถ้าเป็นสมาชิกให้ไปที่หน้า  main.html

  $startpage = "finish.html"; << เมื่อตอบคำถามแล้วจะมาที่หน้านี้   และถ้าเคยเล่นกิจกรรมนี้แล้วให้ขึ้นข้อความว่า "คุณเคยเล่นกิจกรรมนี้แล้ว"

member.html << เป็นหน้า html เพื่อแจ้งว่า คุณยังไม่ได้ login เข้าระบบ มันถึงจะมาหน้านี้



มี table ชื่อ  id_game

id    serial
1     คุณได้รับ ID ค่ะ
2     เสียใจด้วยนะค่ะ
3     เสียใจด้วยนะค่ะ
4     คุณได้รับ ID ค่ะ
ซึ่งจะมีประมาณ 1000 แต่แจก id แค่ 50 อัน สำหรับคนที่ได้ 

จะเขียนสคริปเพิ่มเติมเข้าไปในไฟล์  index.php  ยังไงเพื่อให้มันดึง serial มาโชว์คำว่า "คุณได้รับ ID ค่ะ" หรือ "เสียใจด้วยนะค่ะ" หลังจากกดปุ่ม "เล่นกิจกรรม"  ไปแล้ว และทำการ insert ลงดาต้าเบส จากนั้น ให้เอาคำ  "คุณได้รับ ID ค่ะ" หรือ "เสียใจด้วยนะค่ะ"   มาโชว์ที่หน้า finish.html

สรุปคือ เมื่อกดปุ่ม "เล่นกิจกรรม"  แล้วให้มันสุ่ม id ว่าได้หรือไม่ลงดาต้าเบส หลังจาก insert ข้อมูลลงดาต้าเบสแล้วให้ เอาข้อมูลมาโชว์ด้วยว่าเขาได้หรือไม่ได้

ทั้งข้อความ no mem_no mem_name poll time
แก้ไข ลบ 16 0 Guest 3 1153301111
แก้ไข ลบ 16 0 Guest 3 1153301111


ผมลองเอาสคริบที่คูณ admin ทำให้มาลองใส่ดูก็ไม่ได้ซักทีอ่ะครับ เหอะ  ๆ  รบกวนด้วยนะคับ หมดปัญหา

Administrator
Wed 19 Jul 2006 17:42:13
ถ้าอย่างนั้นก็เอา

<?
$link = mysql_connect($host, $user, $pass);
mysql_select_db($dbname, $link);
$res = mysql_query(" SELECT COUNT(m.mem_name) AS num FROM member m INNER JOIN id_game g ON g.no=m.id WHERE m.recive<>'เสียใจด้วยนะคะ'", $link);
if(mysql_num_rows($res)){
    $row = mysql_fetch_array($res, MYSQL_ASSOC);
    if($row["num"] < 50){
       $res = mysql_query(" SELECT no, id_game FROM id_game WHERE NOT EXIST (SELECT * FROM member WHERE member.id=id_game.no) ORDER BY RAND() LIMIT 1", $link);
       if(mysql_num_rows($res)){
          $row = mysql_fetch_array($res, MYSQL_ASSOC);
          mysql_query("UPDATE member SET recive='".$row["id_game"]."', id=".$row["no"]." WHERE no=".$GET["uid"], $link);
          echo $row["id_game"];
       }else{
          echo "ขออภัยระบบขัดข้อง";
       }
    }else{
       echo "ขออภัยด้วยค่ะ"; //มีผู้เล่นครบ 50 แล้ว
    }
}
mysql_free_result($res);
mysql_close($link);
?>

ไปใส่ไว้ในไฟล์ finish.html แทนครับ

**แต่ว่าคงต้องเปลี่ยนให้เป็น finish.php แทนครับ
Reply
Name:
E-mail:
Home | Services | Forum | Classified | Directories | Support | Contact
ATOM feed RSS 0.9 feed RSS 1.0 feed RSS 2.0 feed
Copyright © 2005 - 2007 Modoeye.com, All Rights Reserved.
Disclaimer | Privacy policy | Term of Use | Term of Services
Valid XHTML Valid CSS! PHP: Hypertext Preprocessor MySQL database Apache Powered! FreeBSD Power to serve
Modoeye Sitemap Client login