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
แสดงบทความที่มีป้ายกำกับ PHP แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ PHP แสดงบทความทั้งหมด
วันอาทิตย์ที่ 8 มิถุนายน พ.ศ. 2557
วันเสาร์ที่ 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 วินาที
เช่น
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());
$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 ก็จะเท่ากันแล้วจ้า
บอกวิธีแก้สำหรับคนที่รันบน 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 ละกัน
ทีนี้้ถ้าเกิดนำประโยคที่ได้จากฟังก์ชั่น strip_slashes(); ไปใส่ใน Value มันจะเป็นดังนี้
เห็นมั้ยคะว่าเกิดอะไรขึ้น มันจะผิด Well-Form ของ HTML ไปทันที แถมค่ามันจะขึ้นไม่ครบด้วยเนื่องจากมันถูกปิดด้วย Double Quote หน้าตัว P ใหญ่นั่นเอง
ทีนี้มาดูวิธีแก้กันดีกว่า
เนื่องจากฟังก์ชั่น htmlspecialchars มันจะแทนค่า Character พิเศษที่เราว่าด้วยค่าดังนี้
จากนั้นก็นำตัวแปร $myValue ไปใช้ แค่นี้เอง
ลองดูค่ะ วันนี้ขอตัวแค่นี้ก่อน....ชะแว็บ !!!
เช่น เครื่องเกมขายดีในญี่ปุึ่น "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 '&'
'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
''' (single quote) becomes ''' only when ENT_QUOTES is set.
'<' (less than) becomes '<'
'>' (greater than) becomes '>'
'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
''' (single quote) becomes ''' only when ENT_QUOTES is set.
'<' (less than) becomes '<'
'>' (greater than) becomes '>'
จากนั้นก็นำตัวแปร $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" />
แค่นี้หละจ้า
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 ก่อน
ลองรันดูจะเห็นว่าบางทีมี . และ .. ออกมาด้วยเนื่องจากฟังก์ชั่น scandir() จะดึงทุกอย่างที่เห็นในโฟลเดอร์ออกมา
ตัดจุดด้วยฟังก์ชั่น array_diff()
ก่อนอื่นกำหนด 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 ให้กับฟังก์ชั่นก็ใช้คอมม่าคั่นไปเรื่อย ๆ เช่น
เวลาเรียกใช้ฟังก์ชั่น
จะสังเกตุว่าถ้ามีการเพิ่ม Argument สักตัว เช่น calculate(22,34,78,15); เราก็ต้องเขียนเพิ่ม
งั้นลองใช้ฟังก์ชั่น func_get_args() ดูค่ะ ความสามารถของมันธรรมดาแต่มีประโยชน์สุด ๆ คือ มันจะ get ค่า Argument ที่ถูกส่งมาทั้งหมดให้โดยอัตโนมัติ มาลองดู ปรับแก้ฟังก์ชั่นใหม่
จากฟังก์ชั่นที่ปรับแก้ ค่า $args ที่ได้มาจากเรียกใช้ func_get_args(); จะได้ค่าเป็น
ง่ายม่ะ ฟังก์ชั่นนี้เรียวลองกับ Method ใน Class แล้วสามารถใช้ได้เหมือนกันไม่มีปัญหาแต่อย่างใด ลองเอาไปใช้ดูนะคะเรียวว่ามีประโยชน์มาก ๆ
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;
$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);
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 แึ้ึค่นี้เอง
ก่อนอื่นเขียน 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 แึ้ึค่นี้เอง
สมัครสมาชิก:
บทความ (Atom)