17 ธันวาคม 2553

SQL การจัดรูปแบบวันที่ ก่อนนำมาแสดง

ด้วยคำสั่งต่อไปนี้

SELECT DATE_FORMAT( inv_datecreate, '%Y-%m-%d')  AS date FROM `stock_inventory`

เป็นการจัดรูปแบบของฟิวล์  inv_datecreate ซึ่งมีรูปแบบ  2010-12-17 11:05:43  พอเรา query ข้อมูลออกมาด้วยคำสั่ง SQL ด้านบน จะแสดงข้อมูลเป็น

2010-12-17  เท่านั้น

ดูรายละเอียดอื่น ๆ ได้ที่ http://www.w3schools.com/SQL/func_date_format.asp

16 ธันวาคม 2553

วิธีทำให้ภาพ PNG ไม่แสดงพื้นหลัง ใน IE 6

ไฟล์ iepngfix.htc  ใช้สำหรับทำภาพ PNG ให้โปร่งใสใน IE 6 ครับ

โดยทำการแทรกโค้ด

img { behavior: url('css/iepngfix.htc') }  ///ในกรณีที่ต้องการทำให้ img มีพื้นหลังโปร่งใส่


และทำการก็อบ  blank.gif ไปไว้ในโฟลเดอร์ที่ต้องการ ถ้าหากเป็น  subfolders

ให้เปลี่ยน ลิ้งค์ IEPNGFix.blankImg = thisFolder + '../images/Blank/blank.gif';



ซึ่งจะอยู่ในไฟล์ iepngfix.htc เสียก่อนด้วย

นำมาจากเว็บ http://www.twinhelix.com/css/iepngfix/

7 ธันวาคม 2553

คำสั่ง PHP เพื่อหาวัน ของวันที่

$jd=cal_to_jd(CAL_GREGORIAN,date("m"),date("d"),date("Y"));
echo (jddayofweek($jd,1));   // ถ้าหากวันนี้เป็นวันอังคาร  ก็จะมีค่าเป็น  Tuesday 

29 พฤศจิกายน 2553

วิธี Random คำตอบ โดยใ้ช้ array

มีอยู่ 3 วิธี  ดังต่อไปนี้


วิธีที่ 1

srand((float) microtime() * 10000000);

$answers = array();

$answers[1] = "5 ธันวาคม" ;
$answers[2] = "11 ธันวาคม" ;
$answers[3] = "15 ธันวาคม" ;
$answers[4] = "19 ธันวาคม" ;

$random_key = array_rand($answers  , 4);

foreach( $random_key as $key=>$value )
{
    echo '<input name="answer" type="radio" value="' . $value . '" />' . $answers[$value] .' <br/>' ;

}


แนะนำโดย พี่ปลาทู  แห่ง select2web.com


วิธีที่  2


$input = array();
   
    $input[0][1] = "5 ธันวาคม" ;
    $input[1][2] = "11 ธันวาคม" ;
    $input[2][3] = "15 ธันวาคม" ;
    $input[3][4] = "19 ธันวาคม" ;

    shuffle($input);  //คำสั่งนี้ สลับตำแหน่งใน array เหมือน  ipod shuffle สุ่มเพลง
   
    $rand_keys1 = array_slice($input, 0, 4);  // วันลูปตัด array
       
    foreach($rand_keys1 as $rand_keys2){
           
        foreach($rand_keys2 as $key => $value){
           
           echo '<input name="answer" type="radio" value="' . $key . '" />' . $value .' <br/>' ;
       
        }
       
    }

วิธีที่ 3

$answers = array();

$answers[1] = "5 ธันวาคม" ;
$answers[2] = "11 ธันวาคม" ;
$answers[3] = "15 ธันวาคม" ;
$answers[4] = "19 ธันวาคม" ;

$string = str_shuffle('1234');


for($i= 0; $i < count($answers); $i++){
    echo '<input name="answer" type="radio" value="' .$string{$i}. '" />' . $answers[$string{$i}] .'<br/>' ;
}

แนะนำโดย พี่ปลาทู  แห่ง select2web.com

12 พฤศจิกายน 2553

วิธี แปลง พ.ศ. เป็น ค.ศ.

 $text="08/02/2559"; // นี่คือรูปแบบเดิมที่เรามี

 $text=preg_split("/\//",$text, -1, PREG_SPLIT_NO_EMPTY);
 $text=$text[0]."/".$text[1]."/".($text[2]-543);
 echo $text;

 เมื่อทำการแปลง ค.ศ. เราก็จะได้รูปแบบดังนี้ 08/02/2016

1 พฤศจิกายน 2553

PHP Function uniqid();

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

17 กันยายน 2553

SQL เลือก ฟิววันที่ล่าสุด ของ อุปกรณ์แต่ละไอดี ที่ต้องการ

 จากภาพข้างบน หากจะเอาวันที่่ล่าสุดของ product_bind_id ซึ่งมันจะนำวันที่ล่าสุดมา แต่จะไม่เอา status_id ตามวันที่ล่าสุดมา
  แต่่หากจะเอามาต้องจะต้องมี SQL ดังข้างล่างครับ


SELECT tbl_check.check_date, tbl_check.product_bind_id, tbl_check.status_id
FROM tbl_check INNER JOIN tbl_product_bind  ON (tbl_check .product_bind_id = tbl_product_bind.product_bind_id)
WHERE  (tbl_check.product_bind_id, check_date) IN
 ( SELECT product_bind_id, MAX(check_date) FROM tbl_check GROUP BY product_bind_id)

จาก : http://stackoverflow.com/questions/121387/sql-fetch-the-row-which-has-the-max-value-for-a-column

หรืออีกหนึ่งทางเลือกจากพี่ปลาทู


select * FROM tbl_check WHERE tbl_check.check_date IN ( SELECT MAX(tcheck.check_date) FROM tbl_check tcheck GROUP BY tcheck.product_bind_id  );
 
 

4 สิงหาคม 2553

Jquery เพิ่มแถวใหม่

ส่วน โค้ด ของ Jquery
**************************************************************************
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
        var id = document.getElementById("id").value;       
    $('#add-row').click(function(){
       
        var str = "";
        $("#select option:selected").each(function () {
            str = $(this).text();
            //alert(str);
        });
        var tr = $('<tr width="343" id="row'+id+'">#</tr>');
        var td1 = $('<td width="83"><input type="hidden" name="branch_id[]" id="branch_id[]" value="'+$('#select').val() +'"/></td>');
        var td2 = $('<td width="253">'+str+'</td>');
        var td3 = $('<td><a href="#" onClick="removeFormField(\'#row'+id+'\'); return false;">Remove</a></td>');
       
        tr.append(td1);
        tr.append(td2);
        tr.append(td3);

        $('#tbl-product').append(tr);
        id = (id - 1) + 2;
        document.getElementById("id").value = id;

    });
   
    $("#delete-row").click(function(){
        if($("#tbl-product tr").size()>1){
            $("#tbl-product tr:last").remove();
        }else{
            alert("Have Mor 1 !");
        }
    });   
   
})

function removeFormField(id) {
    $(id).remove();
}
   
</script>

**************************************************************************
ส่วนที่ทดลองใช้งาน

<?php if(empty($_POST)){ ?>
<input type="hidden" id="id" value="1">
<form id="form1" name="form1" method="post" action="">
  <table width="348" id="tbl-product">
    <tr id="firstTr">
      <th width="83">ID</th>
      <th width="253">product</th>
      <th width="253"> </th>
    </tr>
  </table>
  <table width="348" border="0" cellspacing="0" cellpadding="0">
    <tr>
      <td width="68"><input type="button" name="add-row" id="add-row" value="ADD" /></td>
      <td width="69"><input type="button" name="delete-row" id="delete-row" value="DELETE" /></td>
      <td width="211">
          <select name="select" id="select">
            <option value="1">test 1</option>
            <option value="2">test 2 </option>
            <option value="3">test 3 </option>
            <option value="4">test 4</option>
            <option value="5">test 5</option>
           
          </select>
      </td>
    </tr>
  </table>
  <input type="submit" name="button" id="button" value="Submit" />
</form>

<?php } else { ?>

    <?php
        print_r($_POST['branch_id']);
    ?>

<?php } ?>

20 กรกฎาคม 2553

ลบ SESSION แบบเกลี้ยง

session_name('newname');
session_start();

// Unset all of the session variables.
$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// Finally, destroy the session.
session_destroy();
?> 

10 กรกฎาคม 2553

คำสั่งที่ใช้ในการเปลี่ยนรูปแบบวันที่ ใน SQL

เมื่อเราเก็บวันที่ในรูปแบบ 10-05-2010 หากเราทำการค้นหา โปรแกรมจะมองเห็นแค่ 2 ตัวแรก

ซึ่งเราต้องทำให้มันอยู่ในรูปแบบของฟอร์แมต เครื่อง คือ 2010-05-10 เสียก่อน ถึงจะทำการค้นหาได้ถูกต้อง

คำสั่งข้างล่างจะทำการเปลี่ยนรูปแบบวันที่ก่อนนำไปค้นหา

จาก text_date_field = 10-05-2010

CONCAT(SUBSTRING(`text_date_field` ,7 ,4) ,'-' ,SUBSTRING(`text_date_field` ,4 ,2) ,'-' ,SUBSTRING(`text_date_field` ,1 ,2))

เมื่อแปลงแล้วจะได้ 2010-05-10

25 มิถุนายน 2553

การบันทึกเวลาใน Cakephp

    ในเวลาเราจะบันทึกข้อมูลลงในฐานข้อมูล cakephp จะบันทึกเวลให้อัตโนมัติ ในฟิลที่มีชื่อว่า
created และ มีชนิดของฟิลเป็น datetime 
    ซึ่งในขณะเดียวกัน เวลาเราทำการแก้ไข เรคคอร์ด ก็จะบันทึกเวลาที่เราแก้ไขให้อัตโนมัติเช่นเดียวกัน ในฟิลที่มีชื่อว่า  modified  และมีชนิดของฟิลเป็น datetime

23 มิถุนายน 2553

ฟังชั่นคำนวณวัน PHP

 // ฟังชั่นคำนวณวัน
    function dateDiv($t1,$t2){ // ส่งวันที่ที่ต้องการในรูปแบบ  27-03-2006 21:20:00

        $t1Arr=splitTime($t1);
        $t2Arr=splitTime($t2);
  
        $Time1=mktime($t1Arr["h"], $t1Arr["m"], $t1Arr["s"], $t1Arr["M"], $t1Arr["D"], $t1Arr["Y"]);
        $Time2=mktime($t2Arr["h"], $t2Arr["m"], $t2Arr["s"], $t2Arr["M"], $t2Arr["D"], $t2Arr["Y"]);
        $TimeDiv=abs($Time2-$Time1);
  
        $Time["D"]=intval($TimeDiv/86400); //  จำนวนวัน
        $Time["H"]=intval(($TimeDiv%86400)/3600); // จำนวน ชั่วโมง
        $Time["M"]=intval((($TimeDiv%86400)%3600)/60); // จำนวน นาที
        $Time["S"]=intval(((($TimeDiv%86400)%3600)%60)); // จำนวน วินาที
      
         return $Time;
}



    function splitTime($time){ // เวลาในรูปแบบ 27-04-2006 22:30:50
         $timeArr["Y"]= substr($time,8,2);
         $timeArr["M"]= substr($time,3,2);
         $timeArr["D"]= substr($time,0,2);
         $timeArr["h"]= substr($time,11,2);
         $timeArr["m"]= substr($time,14,2);
         $timeArr["s"]= substr($time,17,2);

         return $timeArr;
    }

//------------------------------  ตัวอย่างการใช้งาน
$t1="27-03-2006 21:20:00";
$t2="27-04-2006 22:30:50";

$time=dateDiv($t1,$t2);
print_r($time);

Javascript ปิดหน้าต่างลูกแล้ว refresh หน้าต่างหลัก

javascript:window.parent.opener.document.location.href='index.php'; window.close();

วิธีการเข้าใช้งาน ก่อนอื่นทำการสร้างหน้า ที่ทำการเปิด หน้า Popup

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Open A New Window</title>
</head>

<body>
<a href="" onclick="window.open('test.php','welcome','width=300,height=200')">Open a new window</a>
</body>
</html>



ไฟล์ test.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Close Open A New Window</title>
</head>

<body>
<a href="#" onclick="javascript:window.parent.opener.document.location.href='http://www.google.co.th'; window.close();">Close</a>
</body>
</html>


ซึ่งในไฟล์ test.php นี้จะเป็นหน้าสำหรับหน้า Popup และจะมีปุ่ม Close เพื่อปิดหน้า ซึ่งเมื่อเรากดปุ่ม Close หน้าหลักจะเด้งไปที่ www.google.co.th ให้อัตโนมัติ



21 มิถุนายน 2553

submit form ให้ขึ้นเป็น popup และอยู่กลางจอ

ฟังชั่น

function submitPopup (objForm,W,H,S) {
 // W = width, H = height, S = scrollbar
 var winleft = (screen.width - W) / 2;
 var winup = (screen.height - H) / 2;
 winProp  = 'width='+W+',height='+H+',left='+winleft+',top='+winup+',scrollbars='+S+',resizable' + ',status=yes'
 
 objForm.target = "newPopup";
 window.open('', "newPopup", winProp);
 objForm.submit();
}


วิธีใช้งาน

<a href="javascript:submitPopup(document.frmTest,300,400,'no');">Submit</a>


ข้อมูลจากเวป >>  http://sixhead.com/ 

17 มิถุนายน 2553

ฟังชั่น php ลบแท็ก html

 strip_tags = ใช้สำหรับลบแท็ก html ที่มาพร้อมกับข้อความ
เช่น
<p>ทดลอง</p>
เมื่อเราใช้คำสั่ง strip_tags จะไม่ได้ค่า <p></p> จะได้เฉพาะคำว่า ทดลอง

15 มิถุนายน 2553

Jquery Refresh Div

 ไฟล์ Index.html

<script  type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.0/jquery.min.js"></script>
    <script type="text/javascript">
        var auto_refresh = setInterval(
            function ()
            {
            $('#load_tweets').load('Untitled-2.php').fadeIn("slow");
        }, 1000); // refresh every 10000 milliseconds
    </script>
<div id="load_tweets"> </div>

ไฟล์ Untitled-2.php

<?php

    echo "test page";

?>

เท่านี้ก็จะทำให้เรารีเฟรชหน้าได้เฉพาะบา่งส่วนแล้วครับ  แต่อาจจะใช้งานไม่ได้สำหรับ I.E. เวอร์ชั่นเก่า ๆ ครับ

ดูข้อมูลเพิ่มเติมได้ที่ : http://www.9lessons.info/2009/07/auto-load-refresh-every-10-seconds-with.html

14 มิถุนายน 2553

การเรียงลำดับตัวอักษรในภาษาไทย

หากในฐานข้อมูลคุณเป็นภาษาไทยแล้วอยากเรียงลำดับ  ก ข ค ง
สมมุติมีข้อมูล ก ,เข, เก, ข  ถ้าหากใช้คำสั่ง ORDER BY ธรรมดามันจะเรียง  ก,ข,เก,เข
แต่ถ้าหาำกว่าเราอยากจะเรียงเป็น ก,เก,ข,เข แล้วละก็ ใช้คำสั่งต่อไปนี้ครับ

SELECT * FROM tb_test ORDER BY CONVERT (NAME USING tis620);

เพื่อแปลงเป็น tis620 ก่อนครับ


ข้อมูลจาก บอร์ด thaicreate PHP ครับ

11 มิถุนายน 2553

เปิดใช้งาน cakephp

1. โหลด cakephp มา ก่อนเลยครับ แล้วแตกไฟล์เอาไปไว้ที่ root ของเรา เ่ช่น C:\AppServ\www\cakephp

2. จากนั้นก็เข้าสู่ขั้นตอน config ไฟล์่ต่างๆ โดยเริ่มจากไปเปิดไฟล์ /app/config/database.php.default แล้วเปลี่ยนชื่อเป็น /app/config/database.php ครับ

3. เปิดไฟล์ /app/config/database.php ขึ้นมาแล้วไปแก้ไขให้ถูกต้องครับ

var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost', // ส่วนนี้ไม่ต้องเปลี่ยน
'login' => 'root', //ชื่อผู้ใช้ฐานข้อมูล
'password' => 'root', //รหัสผ่านฐานข้อมูล
'database' => 'ชื่อฐานข้อมูล',
'prefix' => '',
);

4. เปิด /app/config/core.php ขึ้นมา ไปที่บรรทัด 151 จะเห็น

Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');

ให้แก้ไขโดยเปลี่ยน DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi เป็นอักษรอื่นๆ ครับ เป็น key สำหรับเข้ารหัสครับ ตั้งตามใจชอบ

5. ยังอยู่ที่ไฟล์เดิมนะครับ ย้อนขึ้นไปที่ประมาณบรรทัดที่ 57 ให้เอาคอมเม้นต์ในบรรทัดนี้ออก จะได้เป็น

Configure::write('App.baseUrl', env('SCRIPT_NAME'));

ส่วนนี้เอาไว้ในการใช้งาน mod_rewrite ถ้าที่ทำมาทั้ง 5 ข้อ ไม่ผิดพลาดอะไร พอเรา refresh browser ก็จะได้น่าตาแบบนี้ครับ

ุ6. สมมติว่าเราสร้าง Controller ขึ้นมาชื่อว่า MessagesController นะครับ และมี method ชื่อ index แล้วต้องการจะใช้งาน Controller นี้ เราต้องไปทำการกำหนด route ก่อน โดยไปที่ไฟล์ app/config/rountes.php แล้วเพิ่ม

Router::connect ('/', array('controller'=>'messages', 'action'=>'index'));

ลงไปครับ เพื่อบอกว่าให้เริ่มทำงานที่ controller ที่ชื่อว่า messages และ method ที่ชื่อว่า index


ข้อมูลจากเวป > http://www.nattapon.com/th/index.php/programmer/%E0%B9%80%E0%B8%9B%E0%B8%B4%E0%B8%94%E0%B9%83%E0%B8%8A%E0%B9%89-cakephp-1.2.html

ปรับแต่ง cakephp ให้อ่านไฟล์นามสกุล .php

ปกติแล้ว cake ไฟล์จะนามสกุล .ctp ซึ่งเราจะต้องทำการเปลี่ยนนามสกุลจาก .php ทุกครั้ง

หากจะเปลี่ยนให้ cakephp อ่านไฟล์นามสกุล .php ต้องไปที่

E:\AppServ\www\cakephp\cake\libs\controller\controller.php

ไปที่บรรทัด 240 แก้ไขจาก

var $ext = '.ctp';

ไปเป็น

var $ext = '.php';

เท่านี้มันก็จะอ่านไฟล์นามสกุล .php ได้เลย

กฏของ cakephp

กฏข้อที่ 1 : การตั้งชื่อ ตาราง การตั้งชื่อตารางของฐานข้อมูล จะต้องเป็นชื่อภาษาอังกฤษตัวพิมพ์เล็กทั้งหมด ที่สำคัญต้องเป็นพหูพจน์ด้วย ซึ่งพหูพจน์โดยทั่วไปให้เติม s หรือ es เช่น ตาราง users และ ตาราง comments เป็นต้น
กฏข้อที่ 2 : การตั้งชื่อฟิวด์ที่เป็นคีย์หลัก การตั้งชื่อฟิวด์ที่เป็นคียหลัก(PK) ของแต่ละตารางให้ตั้งชื่อฟิวด์นั้นว่า id เสมอ
กฏข้อที่ 3 : การตั้งชื่อฟิวด์ที่เป็นคีย์รอง การตั้งชื่อฟิวด์ที่เป็นคียรอง(FK) ของแต่ละตารางให้ตั้งชื่อฟิวด์โดยใช้ชื่อ ตารางที่เป็นคีย์หลัก_id แต่..ชื่อตารางที่เป็นคีย์หลักให้เปลี่ยน จากพหูพจน์เป็นเอกพจน์ด้วย เช่น user_id และ comment_id
กฏข้อที่ 4: การตั้งชื่อไฟล์ของ controller การตั้งชื่อไฟล์ของ controller นั้นจะใช้กฏเดียวกันกับการตั้งชื่อตาราง แต่ต่างกันตรงที่ชื่อไฟล์ของ controller จะต้องเป็นแบบนี้นั่นคือ ชื่อตาราง_controller.php เช่น users_controller.php เป็นต้น
กฏข้อที่ 5: การตั้งชื่อไฟล์ของ model การตั้งชื่อไฟล์ของ model นั้นจะใช้ชื่อของตาราง(แต่เป็นเอกพจน์) ในการตั้งชื่อไฟล์ เช่น user.php เป็นต้น
กฏข้อที่ 6: การตั้งชื่อโฟลเดอร์ของ views การตั้งชื่อโฟลเดอร์ของ views นั้นจะใช้ชื่อของตาราง(พหูพจน์) ในการตั้งชื่อโฟลเดอร์ เช่น users

จากเวป > http://cakephpthai.webfreedoms.com/?m=201005

9 มิถุนายน 2553

ฟั่งชั่น กำจัดการกรอกตัวอักษร

 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js"></script>
<script>
$(document).ready(function(){
    $('#Wish').keyup(function(){
        var max = parseInt($(this).attr('maxlength'));
        if($(this).val().length > max){
            $(this).val($(this).val().substr(0, $(this).attr('maxlength')));
        }
        $('#WishMax').html('เหลืออีก ' + (max - $(this).val().length) + ' ตัวอักษร');
    });
});
</script>

วิธีใช้งาน ด้านล่างนี้เลย

<textarea name="Wish" id="Wish" maxlength="10"></textarea>
<div id="WishMax"></div>

4 มิถุนายน 2553

บวกค่าชนิด Text ที่มีลูกน้ำคั่น ในคำสั่ง SQL

เมื่อได้ลองทำการบวกค่าที่อยู่ในฐานข้อมูลชนิด Text เช่น 1,000.00 กับค่า 20,000.00

SQL คือ SELECT (num1 + num2) as sumtotal FROM tbl_test

ผลลัพธ์ที่ได้มาคือ 21 ซึ่งมันจะมองเห็นตัวเลขข้างหน้าลูกน้ำ คือ 1 และ 20 มาบวกกันเท่านั้น

วิธีที่ผมใช้แก้ไข คือ

SELECT (REPLACE(num1,',','') + REPLACE(num2,',','')) as sumnew FROM tbl_test

- REPLACE(ค่าที่ต้องการแก้ไข,'ค่าที่ต้องการเปลี่ยน','ค่่าที่นำมาแทนที')

แล้วผลลัพธ์ที่ได้ คือ 21000

แต่ถ้าหาำกค่าที่อยู่ภายในฐานข้อมูลเรามีจุดทศนิยม เช่น 1,000.50 กับค่า 20,000.25

ผลลัพธ์ที่ได้ คือ 21.000.75

ซึ่งคำสั่งนี้จะเหมือนกับ str_replace ใน PHP ครับ