A-AA+then

การใช้ while

1,454
<?
include("config.php") ;
mysql_select_db($db) ;
mysql_query("SET NAMES 'tis620'");   
 $sql = "SELECT * FROM comcheck, useronline  WHERE comcheck.number != useronline.com"; 
 $result = mysql_query($sql) or die ("ผิดพลาด [".$sql."]");
 echo"<table border=\"0\"  cellspacing=\"1\" cellpadding=\"1\"><tr>"; 
 $intRows = 0;
 while($row = mysql_fetch_array($result)){
 $intRows++;
 echo "<td>";         
 ?>

        </p>
        <table width="90" height="36" border="1" cellpadding="0" cellspacing="0" bordercolor="#FFFFFF" bgcolor="#33FF00">
          <tr>
            <td height="34"><div align="center"> <font size="2" face="MS Sans Serif, Tahoma, sans-serif">
                <?=$row["number"];?>
                </font></div></td>
          </tr>
        </table>
       <font size="2" face="MS Sans Serif, Tahoma, sans-serif">
        <?
  echo"</td>";
  if(($intRows)%3==0)
  {
  echo"</tr>";
  }
  else
  {
  echo "<td>";
  } 
 }
 echo"</tr></table>";
 ?>

    </font></div></td>
  </tr>
</table>

ใช้ while วนแล้วมีปัญหา คือว่า
เช็คเครื่องคอมพิวเตอร์ โดยเช็คจากฐานข้อมูล comcheck มีทั้งหมด 40 เครื่อง
เช็ค useronline ว่าใช้เครื่องไหนอยู่บ้าง
เช็คว่าหมายเลขเครื่องจาก comcheck ไม่ตรงกับ useronline ก็จะแสดงหมายเลขเครื่องที่ว่างนั้น
แต่กรณี login ใช้งานเครื่องเดียว ก็แสดงถูกต้อง 39 เครื่อง ยกเว้นเครื่องที่มีการใช้งาน แต่ถ้า login สองเครื่องมันก็จะแสดง 78 เครื่องทำไมมันถึงเป็นงั้นอ่ะครับ ดูโค๊ดให้ที่ ขอบคุณครับ

1 ความคิดเห็น

เข้าใจว่า แนวคิดคงผิด ซึ่งโดยทั่วๆไปมันก็แนวประมาณ useronline

โค้ดที่ให้มาคงไม่มีปัญหาครับ มันก็น่าจะทำงานได้ถูกต้องตามข้อมูลที่มี เพราะโค้ดไม่ได้ซับซ้อนอะไร

ข้อผิดพลาดน่าจะอยู่ที่การบันทึกการ online-offline ซึ่งไม่ได้แสดงโค้ดไว้

ให้ลองไปตรวจดูบนฐานข้อมูล ว่ามันมีข้อมูลตามที่คาดไว้หรือเปล่า

ผมคงไม่ลงไปแก้ไขโค้ดให้ แต่จะอธิบายหลักการให้ไปลองทำดู (เป็นหลักการเดียวกับ useronline)

อันดับแรก ต้องมีตารางบอก online-offline ข้อมูลในนั้น จะเป็น รหัสเครื่อง และ สถานะ online-offline และ เวลาที่อัปเดทล่าสุด (mktime)

กฏมีอยู่ว่า ข้อมูลในตารางนี้ จะมีจำนวน record ตามจำนวนเครื่อง และ รหัสเครื่องต้องไม่ซ้ำกัน และข้อมูลในตารางนี้ อาจเป็นตารางเดียวกับ ตารางที่ใช้เก็บข้อมูลของเครื่องแต่ละเครื่องก็ได้ (โดยการเพิ่มฟิลด์ข้อมูลที่ขาดเข้าไป)

การทำงาน

เมื่อมีการเรียกใช้เครื่อง ให้ไปอัปเดท ฟิลด์ online ให้เป็น 1 (offline = 0) และทำการบันทึก เวลาที่อัปเดท เก็บไว้อีก ฟิลด์หนึ่ง และ ทำอย่างนี้ทุกครั้งที่มีการเรียกใช้เครื่อง

การอ่านว่าเครื่องใด online บ้าง ก็ตรวจจาก ฟิลด์ online นี่แหละ ผลลัพท์รวมไม่สามารถมีได้มากกว่า จำนวนเครื่องที่บันทึกไว้แน่

การ offfline อันนี้จะยากหน่อย เพราะโดยปกติ เมื่อ offline เราจะไม่มีทางรับรู้ได้เลยว่ามีการ offline นองเสียจากว่ามีวิธี

ถ้าสามารถกำหนดการ offline ได้เอง อันนี้จะดีมาก เราก็แค่ไปปรับปรุงข้อมูลเครื่องตัวเอง ที่ filed online ให้เป็น 0 แค่นี้เราก็ offline แล้ว

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

เหตุผลสำหรับกรณีนี้ก็คือ หากมีการกลับมาปรับปรุงเวลา เสมอ (จากเครื่องเจ้าของ id) เวลาย่อมจะมีการเปลี่ยนแปลง และจะมีระยะห่างไม่ถึงที่กำหนด และหากเครื่องนั้นๆ ไม่มีการอัปเดทเลย เวลาก็จะห่างขึ้นเรื่อยๆ จนครบที่กำหนดได้ ซึ่งทำให้เราคาดเดาได้ว่าเครื่องนั้น น่าจะ offline ไปแล้ว เนื่องจากไม่มีการอัปเดทข้อมูลเลย

หลักการข้างต้นจะเป็นหลักการทั่วไปของ useronline แต่การกำหนดสถานะ ของเครื่องคอมพิวเตอร์ อาจมีเงื่อนไขต่างกัน ให้ลองนำหลักกการไปประยุกต์ดูครับ

1
^