7/29/2556

แก้ไขปัญหาขึ้น Error Notice: Undefined index: ใน PHP

หลายๆคนคงเคยเจอปัญหาขึ้น Error Notice: Undefined index: นี้ นะครับว่าบอกนะว่าเขียนโปรแกรมไม่เคยเจอ Error แบบนี้กัน 555 อย่างน้อยต้องเจอบ้างละหนาก็ไม่มีอะไรมากครับพอดีมีน้องคนหนึ่งเจอปัญหานี้ ผมเลยให้แก้ไขที่ปลายเหตุไปก่อนละกันเพราะถ้าจะแก้ไขจริงๆคงต้องมานั่งไล่ โค้ดกันยาวไม่งั้นงานจะไม่เดินต่อ อิอิอิ

สิ่งที่เจอคือ

Notice: Undefined index:
Notice: Use of undefined constant



1
2
$checkError = ini_get('error_reporting');
error_reporting($checkError  ^ E_NOTICE);

เอาคำสั่งนี้ไปไว้บนสุดที่เจอ Error นะครับ

ปล. ว่างๆก็ไปนั่งไล่โค้ดให้มันถูกต้องด้วยนะครับ 555

วิธีแก้ไข PHP Notice: Undefined index, Notice: Undefined variable

วิธีแก้ไข PHP Notice: Undefined index, Notice: Undefined variable


ก็เขียน php มาตั้งนานและ แต่ใน version เก่าๆ ที่ต่ำกว่า PHP 5.3 มันจะไม่แสดง Error Warning ให้เราเห็น นอกจากเราจะไปกำหนดมันขึ้นมาเอง เพื่อเพิ่มงานให้ตัวเอง 555+ สิ่งแรกที่โปรแกรมเมอร์จะพบเวลาเขียนโปรแกรมเสร็จสิ้น มันจะมี Error หมายถึง Error จริงๆ ที่มีการทำงานผิดพลาด หรือเราเรียกว่า Bug นั่นแหละ อันนี้ก็แก้ไขไปตามเนื้อผ้า Error บรรทัดไหนก็ไปส่องบรรทัดนั้น หรือ scope ของงานนั้น จนแก้เสร็จสมบูรณ์

แต่มีใครจะรู้บ้างว่า ความจริงแล้วมันยังมี Error ที่ sensitive มากกว่านั้น ก็คือ Notice หรือการแจ้งเตือน มัน Sensitive ขนาดที่ว่า ตัวแปรใด ที่เราประกาศขึ้นมา แต่ไม่ได้กำหนดค่า หรือเอามาใช้แบบโท่งๆ มันจะแจ้งเตือนทันที แต่ต้องทำความเข้าใจก่อนว่า มันไม่ใช่ "ข้อผิดพลาด" แต่มันเป็นการ "แจ้งให้ทราบ" ซึ่ง มันก็มักจะแสดงผลให้เรารำคาญใจใน browser อยู่ไม่น้อย ตัวอย่างที่พบง่ายที่สุด อาทิเช่น

ตัวอย่างที่ 1


1
echo $_GET['id'];
แบบนี้ Notice: undefined index

Undefined index  หมายถึง ตัวแปรที่เราเอามาใช้ ยังไม่ได้ประกาศตัวแปร วิธีแก้ไขง่ายที่สุดก็คือใช้ isset() คือถ้ามันมีค่าก็จะ return true ถ้าไม่มีก็จะ return false แค่นั้น ตัวอย่างการแก้ไขปัญหาดังนี้

1
2
3
if (isset($_GET['id'])) {
    echo $_GET['id']
}
* แต่โดยมากแล้วผมจะใช้แบบนี้แทน คือกำหนดตัวแปรให้มันชัดเจนไปเลย ไม่ต้องไปใช้ $_GET, $_POST ดังนี้ครับ


1
$get_id = (isset($_GET['id'])) ? $_GET['id'] : '';

อธิบาย หมายถึง ถ้ามีค่า $_GET['id'] ก็ให้ $get_id = ค่าที่ $_GET มา ถ้าไม่มีก็เป็นค่าว่างไป โดนแบบที่ผมใช้มันจะเป็นแบบย่อ ถ้าเขียนให้ยาวขึ้นก็แบบนี้ครับ


1
2
3
4
5
if (isset($_GET['id'])) {
    $get_id = $_GET['id'];
} else {
    $get_id = '';
}
** ถ้าเราไม่กำหนด $get_id = ''; เดี๋ยวมันจะ Notice: Undefined variable ตอนนำไปใช้อีก!!

ตัวอย่างที่ 2


1
2
3
4
if ($i & lt; 10) {
    echo $i;
    $i++
}
แบบนี้ Notice: Undefined variable
Undefined variable หมายถึง ตัวแปรที่เราประกาศ มันไม่ใช่ตัวแปร (เอ๊ะยังไงวุ้ย) คือเราไม่ได้ระบุค่าให้มันครับ ว่ามันเป็น string,boolean,integer บลาๆ หรือเป็นค่าว่าง ดังนั้นเวลา PHP มันค้น index file มันจะไม่พบชื่อตัวแปรที่เราเอามาใช้ เลยแจ้่งว่า เฮ้ย แกยังไม่ได้กำหนดค่าให้ตัวแปรนะ อยู่จะเอามาใช้อย่างงี้ได้ยังไง มันอันตรายรู็้้มั้ย ว่าถ้า host ที่ใช้ไม่ได้ัตั้ง register_global = off จะโดยคนอื่นเขาสุ่มชื่อตัวแปร เข้ามาแก้ไขการทำงานของระบบเองง่ายๆ นะจ๊ะ เพราะว่ามันไป index ตัวแปรจากที่อื่น ทีไ่หนก็ได้ เพราะเราไม่ได้กำหนดไว้ (งงมะ)

วิธีแก้ไขที่ง่ายที่สุด ก็แค่เติม $i = 0; หรือกำหนดค่า NULL ให้มันก็ได้ครับ

1
2
3
4
5
$i = 0;
if ($i & lt; 10) {
    echo $i;
    $i++
}

แต่ทั้งนี้ทั้งนั้น บางทีเราแก้แล้วจนเหนื่อย มันก็ยังมี Notice ขึ้นมาอีก จนน่าำรำคาญ เพราะบางครั้งเราำจำเป็นต้องใช้ $_SESSION หรืออะไรก็ตามที่เป็นตัวแปรที่ไม่ได้ประกาศไว้แต่ต้น ลองนึกดูซิครับว่า ถ้าเราต้องมาประกาศตัวแปรทั้งหมด ว่าใช้อะไรบ้าง แบบเดียวกับ C,C++ มันจะมากมายขนาดไหน!!!

วิธีแก้ที่กากที่สุดเท่าที่โปรแกรมเมอร์คนนึงจะทำได้ ก็คือ "ปิดมันซะ" ไม่ต้องแจ้งเจิ้งให้รำคาญตา เอาแค่ Error พอแล้ว โดยการใส่


1
error_reporting (E_ALL ^ E_NOTICE);

ไว้บรรทัดบนสุดของไฟล์, ถ้ามี index.php ก็ใส่ไว้ที่นั่นก็ได้ ไม่ต้องไปใส่ซ้ำพร่ำเพรื่อ เพียงเท่านี้มันก็จะไม่สนใจแล้วว่า คุณจะประกาศตัวแปรหรือไม่ประกาศ มันจะซ่อน Notice ทั้งหมดไม่ให้มารบกวนเราอีกต่อไป

หรือ

ไม่ต้องปิด แต่ใส่ @ เข้าไปหน้าตัวแปรนั้น เพื่อบังคับมันทำงานโดยไม่ต้องสนใจว่าจะ error หรือไม่ก็ตาม


1
echo @$id;
-------------

ส่งท้ายหน้าเกี่ยวกับการเขียน $_GET[id] กับ $_GET['id'] มันก็มี Notice นะ แต่จำไม่ได้ว่ามันแจ้งว่าอะไร คือมันจะบอกเราว่า ค่า GET ที่แกส่งมา มันไม่มีชื่อตัวแปรที่ว่านี้นะ


หมายถึง ถ้าเราใส่ว่า id เฉยๆ โดยไม่มี "ฟันหนู" หรือ quote, double qoute มันจะวิ่งไปหา index ตัวแปรที่เป็น defined หรือ ตัวแปรที่เป็นค่า constant ของระบบ อาทิ __FILE__ อะไรทำนองนี้


ทางที่ดี หากเราต้องใช้ ก้ามปู [] ให้เราใส่ '' เข้าไปด้วยครับ


*** ยกเว้น array ที่ใช้ตัวเลข ไม่ต้องใส่ก็ได้ครับ

7/12/2556

การมีฐานข้อมูลใหญ่ ๆ กับการนำเข้าไปที่เซิฟเวอร์นับว่าเป็นเรื่องยุ่งยากมาก

มาดูโปรแกรมเล็กแต่แจ๋วกัน
ลองมาหลายตัว ก็มาตายตัวนี้แหละ

โปรแกรมนี้หาได้ฟรี คลิกไปชมหน้าเว็บ


DOWNLOAD

www.ozerov.de BigDump ver. 0.29b (beta) ขนาด (10 KB ZIP archive)


การใช้งานจริง และก่อนการติดตั้ง
1.สำรองข้อมูลทุก ๆ อย่างจะได้ไม่เสียใจภายหลัง พึงระลึกอยู่เสมอว่า ทุกอย่างมีความเสี่ยง
2.อ่านคู่มือการติดตั้งของโปรแกรมก่อน
3.บทความนี้ใช้BigDump ver. 0.29b (beta) รูปเป็นของเก่า
4.คุณ powermacc แห่งเว็บ www.powermacc.com Thanks มา ณ. ที่นี้




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



นำภาพมาประกอบความเข้าใจก่อน เพื่อเรียกน้ำย่อย


หน้าดาวน์โหลดโปรแกรม


แตกไฟล์ออกมา

รายละเอียดที่ต้องเปลี่ยน




ประกอบความเข้าใจอีกรอบ ต้องนำมาอยู่ที่เดียวกัน ไม่งั้นหากันไม่เจอ




วิธีการอัพโหลดไปบนเซิฟเวอร์ นำไปทั้งหมด จะได้ไม่งง


สั่งให้โปรแกรมทำงานก็เรียกแบบนี้
www.domain.com/โฟลเดอร์เก็บไฟล์/bigdump.php
เรียกผ่านไฟล์ bigdump.php ให้เจอ ที่เหลือโปรแกรมจะจัดการให้เอง
ไฟล์บิกดั๊มจะต้องอยู่ที่เดียวกันกับไฟล์ของฐานข้อมูล
จะพบรูปคล้าย ๆ ด้านบน
แล้วก็กดที่ลิ้งค์เพื่อเริ่มทำงาน
เราใส่ฐานข้อมูลได้หลายไฟล์

ตัวใหม่ ๆนี้ จะฉลาดและรู้จักหมด สามารถลบได้ด้วย



กำลังทำงาน ดูแล้ว ดูดี
รอสักพักแล้วแต่ข้อมูล มากก็นานหน่อย ถ้าตามรูปก็เรียบร้อย
ถ้าเจอเออเร่อ ไม่เกี่ยวกับโปรแกรม อยู่ที่ฐานข้อมูลเราเอง

บางครา...



ปรับค่าจำนวนแถวในการทำงานแต่ละรอบให้น้อยลง เช่น
$linespersession = 3000;
แทนด้วย
$linespersession = 1000; // แล้วแต่ว่าต้องการให้ทำงานกี่บรรทัดในหนึ่งรอบการทำงาน



หรือปรับค่าการหน่วงเวลาในแต่ละรอบการทำงาน
$delaypersession = 0;
แทนด้วย
$delaypersession = 500; // 500 = 0.5 วินาที




- ถ้ามีข้อผิดพลาด "MySQL: Bad syntax near DEFAULT CHARACTER SET..."

แสดง ว่าไฟล์ฐานข้อมูลมาจาก MySQL เวอร์ชั่นเก่ากว่าที่ใช้งานอยู่ แก้ปัญหาได้โดยตามไปลบ DEFAULT CHARACTER SET... ออกจากทุกตาราง โดยอาจใช้โปรแกรมแก้ไขข้อความอย่าง Editplus ทำการลบออก

- ถ้ามีข้อผิดพลาด "MySQL: Table 'some_tbl_name' already exists"
แสดง ว่ามีตารางข้อมูลเก่าอยู่ ซึ่งปกติ BigDump จะไม่มีคำสั่งลบตารางข้อมูลเก่าออกก่อน ดังนั้นให้ทำการลบตารางเก่าออกเอง ก่อนที่จะสั่ง BigDump นำเข้าฐานข้อมูล




- ถ้ามีข้อผิดพลาด "Fatal error: Allowed memory size of xxx bytes exhausted" or "MySQL server has gone away"
แสดงว่ามีการใช้ Extended Inserts คือการใช้ Insert หลาย ๆ คำสั่งต่อกัน ดังนั้นในการส่งออกฐานข้อมูลอย่าใช้ตัวเลือก Extended Insert หรือ แทรกหลายระเบียนในคราวเดียว





เรียบร้อยแล้วหละ อุ้ยดีใจจังเราก็ทำได้ ไหงเราเก่งจัง
ว่าง ๆก็ไปเยี่ยมเว็บที่ผมสร้างด้วยบอร์ดนี้ดู ที่นี่ www.1080iP.com

7/09/2556

วิธีสร้าง Application Facebook เพื่อ Integration SMF

วิธีสร้าง Application Facebook เพื่อ Integration SMF

ขั้นตอนการสร้าง Facebook Application ID กับ Facebook Application Secret
เพื่อนำมาใส่ใน SA Facebook Integration ของบอร์ด SMF


อันดับแรกให้ Login facebook ของเราก่อน แล้วเลื่อนลงมาล่างสุด คลิกเข้าไปที่เมนู "ผู้พัฒนา"
หรือตามลิงค์นี้ https://developers.facebook.com/apps


คลิก Register as a Developer
ภาพนี้ได้ถูกเปลี่ยนขนาด คลิกที่นี่...เพื่อดูภาพขนาดเต็ม ภาพขนาดต้นฉบับคือ 1003x570


เข้าสู่ขั้นตอนที่ 1 คือยอมรับเงื่อนไขและข้อตกลงของ Facebook
ภาพนี้ได้ถูกเปลี่ยนขนาด คลิกที่นี่...เพื่อดูภาพขนาดเต็ม ภาพขนาดต้นฉบับคือ 900x570


เข้าสู่ขั้นตอนที่ 2 คือแบบสอบถามว่าจะเอาไปใช้งานเกี่ยวกับอะไร
ภาพนี้ได้ถูกเปลี่ยนขนาด คลิกที่นี่...เพื่อดูภาพขนาดเต็ม ภาพขนาดต้นฉบับคือ 849x585



เข้าสู่ขั้นตอนที่ 3 สร้าง Intergration
ภาพนี้ได้ถูกเปลี่ยนขนาด คลิกที่นี่...เพื่อดูภาพขนาดเต็ม ภาพขนาดต้นฉบับคือ 960x475


คลิกเพื่อสร้างแอพใหม่
ภาพนี้ได้ถูกเปลี่ยนขนาด คลิกที่นี่...เพื่อดูภาพขนาดเต็ม ภาพขนาดต้นฉบับคือ 992x581


Create New App  ในช่อง  App Name: ใส่ชื่อเว็บไซต์ของเรา
ส่วน App Namespace : เป็นการตั้งชื่อให้กับเว็บแอพ (เว้นว่างไว้)
Web Hosting (เว้นว่างไว้)


ใส่โค้ดป้องกัน


สร้างแอพสำเร็จจะได้ App ID กับ App Secret นำกลับไปใส่ที่ SMF