หน้าเว็บ

แสดงบทความที่มีป้ายกำกับ PHP แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ PHP แสดงบทความทั้งหมด

วันอาทิตย์ที่ 8 มิถุนายน พ.ศ. 2557

แก้ปัญหา Notice : Undefined ใน php

Notice : Undefined ส่วนใหญ่จะเกิดขึ้นกรณีที่ไม่ได้มีการประกาศตัวแปร แล้วดันนำไปตัวแปรนั้นไปใช้หรือมีการรับค่าตัวแปรนั้นมา

เช่น

$mode = $_POST['mode'];

กรณีนี้หากเราไม่ได้ทำการเซ็ตค่าอะไรไว้ใน php.ini ตัว php เวอร์ชั่นใหม่มักจะแสดง Error
Notice: Undefined ออกมา

จริง ๆ วิธีแก้ที่ถูกต้องคือไปแก้ไขโค้ดซะ โดยการเช็คว่ามีการประกาศตัวแปรหรือไม่
จากโค้ดด้านบนจะเขียนได้เป็น

$mode = isset($_POST['mode']) ? $_POST['mode'] : '';

คือหมายความว่าถ้าไม่ได้มีการส่งหา $_POST['mode'] มาจากฟอร์ม ให้กำหนดค่าว่างให้ตัวแปร $mode ซะ เท่านี้มันก็จะไม่แสดง Error ออกมาแล้ว

แต่ถ้าเราดันไปเขียนโค้ดเอาไว้ซะเรียบร้อย จะตามแก้ทุกหน้าก็คงไม่ไหว ซึ่งจริง ๆ แล้วมีวิธีแก้อีก 2  คือ
1. ไปแก้ที่ไฟล์ php.ini โดยปิดไม่ให้มันแสดง Error ซะ ซึ่งวิธีนี้ไม่แนะนำ
2. ไปเขียนคำสั่งเพิ่มในไฟล์​ .htaccess ซึ่งวิธีนี้จะมีผลเฉพาะไซต์นั้น ๆ (แนะนำ)

ซึ่งวิธีเขียนคำสั่งเพิ่มในไฟล์ .htaccess นั้นให้เปิดไฟล์ขึ้นมาแล้วเพิ่มคำสั่งนี้เข้าไป

php_value error_reporting E_WARNING

วันเสาร์ที่ 3 สิงหาคม พ.ศ. 2556

ตรวจสอบอีเมลให้ถูกต้องด้วย php แบบกระชับ

เมื่อมีฟอร์มสำหรับให้ยูซเซอร์กรอกอีเมล เราจำเป็นต้องตรวจสอบว่าอีเมลที่กรอกถูกต้องตามรูปแบบอีเมลหรือเปล่า วันนี้จะมาแนะนำการ validate อีเมลด้วย php แบบกระชับ

if(filter_var($email,FILTER_VALIDATE_EMAIL))
    return TRUE;
else
    return FALSE;

ถ้าอีเมลที่กรอกถูกต้องจะ return ค่าเป็น TRUE
ถ้ามีเมลที่กรอกไม่ถูกต้องตามรูปแบบอีเมลจะ return ค่าเป็น FALSE

จบแค่นี้พอเดี๋ยวกลัวไม่กระชับ อิอิ

วันพุธที่ 10 กรกฎาคม พ.ศ. 2556

หาวันหรือเวลาย้อนหลังด้วย strtotime

ฟังก์ชั่น strtotime จะทำหน้าที่แปลงวันและเวลาตามฟอร์แมทให้ไปอยู่ในรูปของ timestamp
เช่น

strtotime(date("Y-m-d H:i:s",time())); 

ซึ่งจะได้ค่า timestamp เป็นเวลาปัจจุบัน ซึ่งมีค่าเท่ากับเราใช้ฟังก์ชั่น time() นั่นล่ะ

ที่นี้มีคำถามว่า ถ้าเราอยากทราบว่า 30 นาทีก่อนหน้านี้เป็นเวลาเท่าไหร่สามารถใส่พารามิเตอร์ให้มันได้ เช่น

strtotime('-30 minutes');    //  1373430621

เราก็จะได้ค่า timestamp ย้อนกลับไป 30 นาที หากเราต้องการแปลงเป็นวันที่ตามฟอร์แมทที่เราต้องการก็สามารถใช้ฟังก์ชั่น date(); เข้ามาช่วยได้เช่น

date("Y-m-d H:i:s",strtotime('-30 minutes'));    //  2013-07-10 11:30:21
ซึ่งเวลาปัจจุบันคือตอนเที่ยง

หากจะหาวันที่ 1 สัปดาห์ต่อจากนี้ก็ทำได้ มีตัวอย่างให้ดูค่ะ

strtotime("now"); // ปัจจุบัน
strtotime("10 September 2000");   // ตามวันที่ระบุ
strtotime("+1 day");  // วันพรุ่งนี้
strtotime("+1 week");   // อีก 7 วันข้างหน้า
strtotime("+1 week 2 days 4 hours 2 seconds");   //  อีก 9 วัน 4 ชั่วโมง 2 วินาที


วันพุธที่ 28 พฤศจิกายน พ.ศ. 2555

หา Datetime ด้วย PHP

ปกติถ้าเรากำหนดชนิดฟิลด์ในฐานข้อมูลเป็น Datetime เราจำเป็นต้องหาค่า Datetime ล่าสุด

$datetime = date("Y-m-d H:i:s",time());

วันพุธที่ 4 กรกฎาคม พ.ศ. 2555

ตั้งค่า timezone server

ปกติแล้วเวลาเราใช้ฟังก์ชั่น time() หรือ date() เวลานำเวลาปัจจุบันออกมาแสดงเวลามันเร็วไปประมาณ 1 ชั่วโมง วันนี้จะมาบอกวิธีแก้ค่ะ

บอกวิธีแก้สำหรับคนที่รันบน localhost นะคะ

ให้เปิดไฟล์ php.ini ที่อยู่ใน C:\Windows
จากนั้นค้นหาคำว่า date.timezone จากนั้นให้ใส่ค่าเป็น date.timezone = Asia/Bangkok
จากนั้นให้เอาเครื่องหมาย ; (simi-colon) ออก
จากนั้น restart apache (restart เครื่องไปเลยยิ่งดี บางที restart apache แล้วยังไม่ได้)

แค่นี้ล่ะ เวลาในเครื่องกับเวลาใน Server ก็จะเท่ากันแล้วจ้า

วันจันทร์ที่ 26 มีนาคม พ.ศ. 2555

หลีกเลี่ยง Single Quote และ Double Quote ใน Attribute Value กันเถอะ

ปกติแล้วเวลาเราบันทึกคอนเทนต์อะไรซักอย่างลงฐานข้อมูลเรียวจะใช้ฟังก์ชั่น addslashes(); เพื่อป้องกัน Error กรณีที่มีการใช้สัญลักษณ์ Single Quote (') หรือ Double Quote (")

เช่น เครื่องเกมขายดีในญี่ปุึ่น "Pokemon Nobunaga's Ambition แชมป์"
เมื่อโยนเข้าฟังก์ชั่น addslashes(); มันจะถูกแปลงเป็น
เครื่องเกมขายดีในญี่ปุึ่น \"Pokemon Nobunaga\'s Ambition แชมป์\"  ให้อัตโนมัติ

ที่นี้ถ้าจะนำออกมาใช้ php จะมีฟังก์ชั่นอยู่ตัวหนึ่งคือ strip_slashes(); ซึ่งจะทำหน้าที่ถ้าเครื่องหมาย \ ออกเพื่อแสดงผลได้อย่างถูกต้องนั่นเอง

ทีนี้ปัญหามันมีอยู่ว่าเมื่อเราเอาประโยคที่ได้จากฟังก์ชั่น strip_slashes(); ไปแสดงใน Attribute Value ของ html นั้นจะเกิดอะไรขึ้นมาดูกัน

ยกตัวอย่าง Tag Input ละกัน

<input type="text" name="textbox1" value="" />  

ทีนี้้ถ้าเกิดนำประโยคที่ได้จากฟังก์ชั่น  strip_slashes(); ไปใส่ใน Value มันจะเป็นดังนี้

<input type="text" name="textbox1" value="เครื่องเกมขายดีในญี่ปุึ่น "Pokemon Nobunaga's Ambition แชมป์"" />  

เห็นมั้ยคะว่าเกิดอะไรขึ้น มันจะผิด Well-Form ของ HTML ไปทันที แถมค่ามันจะขึ้นไม่ครบด้วยเนื่องจากมันถูกปิดด้วย Double Quote หน้าตัว P ใหญ่นั่นเอง

ทีนี้มาดูวิธีแก้กันดีกว่า

$myValue = htmlspecialchars($myValue, ENT_QUOTES, 'utf-8');

เนื่องจากฟังก์ชั่น htmlspecialchars มันจะแทนค่า Character พิเศษที่เราว่าด้วยค่าดังนี้

'&' (ampersand) becomes '&amp;'
'"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.
'<' (less than) becomes '&lt;'
'>' (greater than) becomes '&gt;'

จากนั้นก็นำตัวแปร $myValue ไปใช้ แค่นี้เอง

<input type="text" name="textbox1" value="<?php echo $myVAlue; ?>" />  

ลองดูค่ะ วันนี้ขอตัวแค่นี้ก่อน....ชะแว็บ !!!

วันพุธที่ 1 กุมภาพันธ์ พ.ศ. 2555

เซ็ต header content type เป็น UTF 8

การกำหนด content type ของ page ให้เป็น utf-8 นั้นสามารถทำได้ทั้งส่วนของไฟล์ที่เป็น php และ html

php
header('Content-type: text/html; charset=utf-8');

html
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

แค่นี้หละจ้า

วันศุกร์ที่ 2 กันยายน พ.ศ. 2554

หาไฟล์ทั้งหมดในโฟลเดอร์ด้วยฟังก์ชั่น scandir()

มาแนะนำฟังก์ชั่นอีกตัวหนึ่งเอาไว้สำหรับหาไฟล์ที่อยู่ Directory ที่เรากำหนด

ก่อนอื่นกำหนด Document Root ก่อน

$DOC_ROOT = $_SERVER['DOCUMENT_ROOT'].'/project1/images/';
$fileInDir = scandir($DOC_ROOT);  // หาไฟล์ทั้งหมดใน Directory images

ลองรันดูจะเห็นว่าบางทีมี . และ .. ออกมาด้วยเนื่องจากฟังก์ชั่น scandir() จะดึงทุกอย่างที่เห็นในโฟลเดอร์ออกมา

ตัดจุดด้วยฟังก์ชั่น array_diff()

array_diff($fileInDir,array('.','..'));   // ตัด . และ .. ออก

หา Argument ของ function ด้วย func_get_args()

ปกติแล้วถ้าเราเีขียน function ใน php ซํกตัวแล้วต้องการส่ง Argument ให้กับฟังก์ชั่นก็ใช้คอมม่าคั่นไปเรื่อย ๆ เช่น

function calculate($para1,$para2,$para3)
{
    echo "summary = ".$para1+$para2+$para3;
}

เวลาเรียกใช้ฟังก์ชั่น

calculate(22,34,78);

จะสังเกตุว่าถ้ามีการเพิ่ม Argument สักตัว เช่น calculate(22,34,78,15); เราก็ต้องเขียนเพิ่ม
งั้นลองใช้ฟังก์ชั่น func_get_args() ดูค่ะ ความสามารถของมันธรรมดาแต่มีประโยชน์สุด ๆ คือ มันจะ get ค่า Argument ที่ถูกส่งมาทั้งหมดให้โดยอัตโนมัติ มาลองดู ปรับแก้ฟังก์ชั่นใหม่

function calculate()
{
    $summary = 0;
    $args = func_get_args();  // รับค่า Arguments ทั้งหมดแล้วเก็บค่าเป็น Array
    foreach ($args as $key=>$value)
    { 
        $summary += $value;
    }
    echo "summary = ".$summary;
}

จากฟังก์ชั่นที่ปรับแก้ ค่า $args ที่ได้มาจากเรียกใช้ func_get_args(); จะได้ค่าเป็น

$args = array(0 => 22,
                       1  => 34,
                       2  => 78);

ง่ายม่ะ ฟังก์ชั่นนี้เรียวลองกับ Method ใน Class แล้วสามารถใช้ได้เหมือนกันไม่มีปัญหาแต่อย่างใด ลองเอาไปใช้ดูนะคะเรียวว่ามีประโยชน์มาก ๆ

วันพฤหัสบดีที่ 2 มิถุนายน พ.ศ. 2554

เชื่อมต่อฐานข้อมูล MySQL มากกว่า 1 ฐานข้อมูลด้วย PHP

วันนี้เรียวจะมาบอกวิธีการเขียน PHP เชื่อมต่อ database ซึ่งปกติก็ทำกันเป็นอยู่แล้วหละ แค่ใช้ mysql_connect มันก็ได้แล้ว แต่ถ้าจะเชื่อมต่อ database 2 database ขึ้นไปแล้วต้องการสลับการ Query ไป database 1 กับ 2 ไปมาจะทำอย่างไร เรียวเชื่อว่าหลายคนอาจจะวิธี connect ฐานข้อมูลแรกแล้วปิด จากนั้น connect ฐานข้อมูลที่สองแล้วปิด เปิด สลับกันไปซึ่งทำให้ช้า แถมต้องมา connect ใหม่ตลอดเวลา

ก่อนอื่นเขียน code เพื่อ connect ฐานข้อมูลเหมือนเดิม

$connect1 = mysql_connect("localhost","root","1234","TRUE");
mysql_select_db('database1',$connect1);
mysql_query("SET NAMES 'utf8'",$connect1);

$connect2 = mysql_connect("localhost","root","1234","TRUE");
mysql_select_db('database2',$connect2);
mysql_query("SET NAMES 'utf8'",$connect2);


หลังจาก connect database ทั้ง 2 ตัวเรียบร้อยแล้ว มาลอง Query กัน ซึ่งถ้าใครจะ connect database ซัก 3 ตัวก็เขียนเพิ่มเข้าไปจะสังเกตว่าจะมีตัวแปร $connect1,$connect2,$connect3,....... เก็บค่าสำหรับการ connect ไว้ ซึ่งเราจะเอาตัวแปรนี้ไปใช้ในการ Query มาดูตัวอย่าง

เขียน Query ข้อมูลจากฐานข้อมูลตัวแรก
$sql = "SELECT * FROM member";
$query1 = mysql_query($sql,$connect1) or die(mysql_error());
while($rs1 = mysql_fetch_array($query1))
{
    ................................
}


เขียน Query ข้อมูลจากฐานข้อมูลตัวที่สอง
$sql = "SELECT * FROM member_forum";
$query2 = mysql_query($sql,$connect2) or die(mysql_error());
while($rs2 = mysql_fetch_array($query2))
{
    ................................
}

จะ Query database ตัวไหนก็ใส่ parameter เข้าไปใน mysql_query แึ้ึค่นี้เอง