A-AA+then

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

/* ตัวแปรสำหรับป้องกันการส่งข้อความซ้ำ */
var shout_text="";

/* ส่งข้อความเข้าระบบ */
function shoutsubmit(frm) {
  if (shout_text!=frm.text.value && check_shout(frm)) {
    shout_text=frm.text.value;
    /* AJAX */
    var req = Inint_AJAX();
    req.onreadystatechange = function () {
      if (req.readyState==4) {
        if (req.status==200) {
          frm.user.value="";
          frm.text.value="";
          /* กำหนดข้อมูลล่าสุดให้แสดง */
          shout_id = parseInt(req.responseText);
        };
      };
    };
    /* สร้าง connection */
    req.open("POST", shout_path+"save.php");
    /* Header ภาษาไทย */
    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=TIS-620');
    /* ส่งค่า */
    req.send("user="+frm.user.value+"&value="+shout_text);
  }
  /* คืนค่า เพื่อไม่ให้ Form ส่งต่อ */
  return false;

/* ตรวจสอบการกรอกข้อความ */
function check_shout(frm) {
  var v2=frm.user;
  var v3=frm.text;
  var save=false;
  
  if (v3.value.length==0) {
    alert("กรุณาป้อนข้อความที่ต้องการ");
    v3.focus();
  } else if (v3.value.length<3 || v3.value.length>50) {
    alert("ข้อความควรมีความยาวตั้งแต่ 3 ตัวอักษรขึ้นไป และไม่เกิน 50 ตัวอักษร");
    v3.focus();
  } else if (v2.value.length==0) {
    alert("กรุณาป้อนชื่อผู้ส่ง");
    v2.focus();
  } else if (v2.value.length<3) {
    alert("ชื่อผู้ส่งควรมีความยาวตั้งแต่ 3 ตัวอักษรขึ้นไป");
    v2.focus();
  } else save=true;
  return save;
};

AJAX จะทำการเรียกไฟล์ save.php ขึ้นมาจัดการและบันทึกลงฐานข้อมูล data.php

<?
  header("content-type: application/x-javascript; charset=UTF-8");
  
  //ค่ากำหนด
  include("config.php");

  //วันที่
  $mtoday=date("d",mktime( date("H")+$hour, date("i")+$min ));
  //12:36
  $mtime=date("H:i",mktime( date("H")+$hour, date("i")+$min ));
  //03 ส.ค. 2544
  $mdate=$mtoday."-".date("m")."-".$Year;
  
  $file=$shout_path."data.php";
  
  $user=$_POST[user];
  $value=$_POST[value];
  
  //ป้องกัน Tag
  $value = str_replace ("<" , "<" , $value);//เครื่องหมาย <
  $value = str_replace (">" , ">" , $value);//เครื่องหมาย >
  $value = str_replace ('\"' , '"' , $value);//เครื่องหมาย \"
  $value = str_replace ("\'" , "'", $value);//เครื่องหมาย \'
  //link, email
  $patterns = array ( "/((https\:\/\/|http\:\/\/|ftp\:\/\/|www\.|ftp\.)[^\s]+)/is",
    "/([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)/i");
  $replace = array ( "<a href=\"\" target=\"_blank\"></a>",
    "<a href=\"mailto:@\">@</a>");
  $value = preg_replace($patterns, $replace, $value);
  //BBCode
  $value = str_replace ("" , "<b>", $value);
  $value = str_replace ("
" , "</b>", $value);
  $value = str_replace ("" , "<i>", $value);
  $value = str_replace ("
" , "</i>", $value);
  $value = str_replace ("" , "<u>", $value);
  $value = str_replace ("
" , "</u>", $value);
  $value = eregi_replace("\[color=(.+)\](.+)\[/color\]", "<font color=></font>", $value);
  //ป้องกันคำสั่งควบคุมสคริปต์
  $value = eregi_replace ( "<script", "<script" , $value ) ;
  $value = eregi_replace ( "</script>
", "</script>" , $value ) ;
  $value = eregi_replace ( "<meta", "<meta" , $value ) ;
  $value = eregi_replace ( "<link", "<link" , $value ) ;
  $value = str_replace ( "<!--", "<!--" , $value ) ;
  $value = str_replace ( "-->
", "-->" , $value ) ;
  $value = str_replace ( "<%", "<%" , $value ) ;
  $value = str_replace ( "%>
", "%>" , $value ) ;
  $value = str_replace ( "?>
", "?>" , $value ) ;
  $value = str_replace ( "<?", "<?" , $value ) ;
  
  //ข้อมูลใหม่
  $data= "<div id=shout_in><cite>".$user."</cite> <b>:</b> <d>$mdate $mtime</d>";
  $data.="<dl>".$value."</dl></div> ";
  
  //ข้อมูลเก่า
  $newdata="";
  if (file_exists($file)) {
    //อ่านไฟล์ออกมาปรับปรุง
    $fr=file($file);
    $count=count($fr);
    //ตัดข้อมูลที่เกินออก
    $n=$count-$shout_linecount+1;
    if ($n<0) {
      $n=0;
      $lastupdate=$count;
    } else
      $lastupdate=$shout_linecount-1;
    for ($i=$n; $i<$count; $i++) {
      $newdata.=$fr[$i];
    }
  } else
    $lastupdate=0;
    
  //เขียนข้อมูลทั้งหมด
  $f=fopen($file, "w");
  fputs($f, $newdata.$data);
  fclose($f);
  
  //คืนค่ารายการล่าสุด
  echo $lastupdate;
?>

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

ถัดลงมาก็จะเป็นการตัดข้อมูลที่เกินกำหนดออก (จำนวนข้อมูลที่มีกำหนดอยู่ในไฟล์ config คือ $shout_linecount) เพื่อไม่ให้ฐานข้อมูลมีขนาดใหญ่เกินไป แล้วจึงบันทึกกลับไปยังฐานข้อมูล data.php อีกที เมื่อทำงานสำเร็จแล้วจะคืนค่า บรรทัดล่าสุดที่เพิ่มเข้าไปใหม่เพื่อไปจัดการแสดงผลข้อความล่าสุดต่อไป

ข้อสังเกตุ ไฟล์ save.php ผมใช้ Header เป็น UTF-8 ในกรณีนี้เราจะได้ไฟล์ data.php เป็นไฟล์ฟอร์แมต UTF-8 ซึ่งสามารถรองรับหลายภาษาได้ครับ และนอกจากนี้ผมยังยอมให้มีการใช้ Cache ได้ตามปกติด้วยครับ

AJAX

Relate

^