แก้ปัญหา Control Panel ของ Xampp เปิดไม่ขึ้น - Xampp control panel is not showing

โดย SONGCHAI SAETERN

หลังจากดับเบิ้ลคลิกเปิดโปรแกรม Xamp Server หน้าจอแว๊บๆ แต่ไม่ปรากฏอะไรออกมาเลย




หลังจากพยายามคลิกอยู่นาน เจ้า Xampp Control Panel ก็ไม่ขึ้นมาให้เห็น



ก็เลยตัดสินใจไปค้นใน Google ด้วยคีย์เวิร์ดนี้ "Xampp control panel is not showing"

แล้วก็ได้วิธีแก้จาก StackOverFlow.Com เจ้าเก่าเจ้าเดิม
ก็มีคนบอกเอาไว้ว่า ก็ไปสั่งให้มันเต็มจอซะสิ!!


ดังนั้นก็ไม่รีรอ รีบกดคีย์พิฆาตทันที Ctrl + Alt + Delete
เนื่องจากระบบปฏิบัติการที่ใช้เป็น Windows 10 ดังนั้นหน้าตาก็จะต่างจากในกระทู้นิดหน่อย



ให้เลื่อนหา xamp-control-panel.exe จากนั้นก็คลิกขวา แล้วสั่ง Expand


ให้คลิกขวาเลือก XAMPP Control Panel เวอร์ชั่นที่เปิดหน้าต่างไม่ขึ้นนั้น แล้วเลือกคำสั่ง Maximize


หน้าต่าง Xampp Control Panel ก็จะเด้งขึ้นมาเต็มหน้าจอ พร้อมให้เรากดปุ่ม Start เพื่อเริ่มใช้งานเว็บเซิร์ฟเวอร์ได้ตามปกติ


----------
สำหรับ Windows 10 ให้คลิกที่เมนู Options ด้านบนสุด

แล้วคลิกเลือก Always on top
และ คลิกออก อีกครั้ง เมนู
Maximize จะปรากฏออกมา





PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

แก้ปัญหา JavaScript ไม่สามารถแสดงใน TEXTAREA ได้

โดย SONGCHAI SAETERN

ทำไม View Code แล้วเห็น และใน Textarea กลับไม่แสดงค่าอะไรเลย???


สังเกตว่าเปิด Console แล้วตรวจสอบโครงสร้าง HTML ก็มีโค้ด JavaScript อยู่นะ แต่ทำไมใน <textarea></textarea> ถึงว่างเปล่าไม่มีอะไรออกมาเลย???



ก็เลยลองค้นด้วยคีย์เวิร์ดง่ายๆ "how to display javascript in textarea"
(จริงๆก็ไม่ง่ายๆนะ ค้นหาด้วยคีย์เวิร์ดหลายคำมาก กว่าจะลงตัวที่ประโยคนี้)

ก็ได้พบหนทางสว่าง


นั่นก็คง ต้องแปลงวงเล็บเปิด-ปิดของ script ให้เป็นตัวโค้ดพิเศษก่อน

ซึ่งนอกจากใช้ htmlentities() ก็ยังมี htmlspecialchars() ให้เรียกใช้อีกฟังก์ชั่น



 หลังจากนั้น ลอง CTRL + F5 เพื่อรีเฟรชหนักๆ ก็ปรากฏโค้ดออกมาในที่สุด
(ดีใจจนน้ำตาแทบไหล ปิดงานได้สักที TT__TT )

ขอให้ทุกคนมีความสุขในการเขียนโปรแกรม PHP และสนุกไปกับการแก้บั๊กนะครับ ^O^


อ้างอิง
https://stackoverflow.com/questions/6130097/how-come-when-i-display-javascript-in-a-textarea-it-executes




PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

PHP - มาลองเขียนโค้ดแก้โจทย์ปัญหาด้วยการวนลูปหาค่าตัวแปรแต่ละตัว

โดย CyberMAN

มาลองเขียนโค้ดแก้โจทย์ปัญหาด้วยการวนลูปกันดูครับ


ด้านล่างนี้คือโค้ดเริ่มต้นที่ผมมีให้ครับ ลองไปต่อกันดู หรือถ้าใจร้อน จะเลื่อนลงไปล่างสุดเพื่อดูโค้ดที่ผมเขียนเอาไว้เลยก็ย่อมได้ ^O^

<?php
$worm     = 7;
$clock     = 6;
$flower = 2;


$check1 = ($worm + $worm + $worm == 21);
$check2 = ($clock + $clock + $worm == 19);
$check3 = ($flower + $clock + $worm == 15);

$result = "???";

echo "<br/>$worm + $worm + $worm = 21 (", $check1 ? 'true' : 'false',")";
echo "<br/>$clock + $clock + $worm = 19 (", $check2 ? 'true' : 'false', ")";
echo "<br/>$flower + $clock + $worm = 15 (", $check3 ? 'true' : 'false', ")";

if($check1 == true && $check2 == true && $check3 == true){
    $result = "($worm-$flower) + ($flower *2) * $clock = <b>".( ($worm-$flower) + ($flower *2) * $clock) . "</b>";
}

echo "<br/>Result : ", $result, "";
?>




จากโค้ด PHP ด้านบนนี้ ถ้าเรากำหนดตัวแปรให้เป็นดังต่อไปนี้

$worm     = 7;
$clock     = 6;
$flower = 2;

เมื่อลองรันดู จะปรากฏผลลัพธ์ออกมา คือ 29
แต่กรณีที่เราเดายังไงก็ไม่ถูก จะมีวิธีเขียนอย่างไรเพื่อหาค่าของตัวแปรแต่ละตัว

และนี่คือโค้ด PHP สำหรับใช้หาคำตอบโดยใช้การวนลูปด้วย While() ครับ


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

$worm = 0;
$clock = 0;
$flower =0;

$worm_result_title = '';
$clock_result_title = '';
$flower_result_title = '';
$result_title = '';

$check = false;
$loop = 0;
while($check == false){//วนจนกระทั่งได้คำตอบ
    $loop++;
   
    //คำนวณผลลัพธ์จากตัวเลขที่กำหนด
    $result1 = $worm + $worm + $worm;
    $result2 = $clock + $clock + $worm;
    $result3 = $flower + $clock + $worm;
   
    //ตรวจคำตอบแต่ละตัว
    $check_worm = (bool)($result1 == 21);
    $check_clock = (bool)($result2 == 19);
    $check_flower = (bool)($result3 == 15);
   

    //ตรวจสอบตัวแปรหนอน
    if($check_worm == true){
       
        if($worm_result_title == ''){//เก็บค่าครั้งเดียว
            $worm_result_title = "<br/>รอบที่ $loop : Worm = $worm + $worm + $worm = $result1";
        }
       
        //ตรวจสอบตัวแปรนาฬิกา
        if($check_clock == true){
           
            if($clock_result_title == ''){//เก็บค่าครั้งเดียว
                $clock_result_title = "<br/>รอบที่ $loop : Clock = $clock + $clock + $worm => $result2";
            }
           
            //ตรวจสอบตัวแปรสุดท้าย
            if($check_flower == true){
                $flower_result_title = "<br/>รอบที่ $loop : Flower = $flower + $clock + $worm => $result3";
            }else{
                $flower++;
            }
        }else{
            $clock++;
        }
    }else{//ถ้ายังไม่ถูก วนลูปต่อไป
        $worm++;
    }
       
    //ตรวจสอบคำตอบรวม
    if($check_worm == true && $check_clock == true && $check_flower == true){
       
        $check = true;//ห้ามลืมบรรทัดนี้ ไม่งั้นอยู่ในเขาวงกต ออกจาก Loop While ไม่ได้!!
       
        $result_title .= "<br/><b>Result = ($worm-$flower) + ($flower x 2) x $clock = ". ( ($worm-$flower) + ($flower *2) * $clock) . "</b>";   
    }
   
    //ป้องกัน  Overhead
    if($loop > 1000){
        $result_title .= '<br/>เกิน 1000 รอบแว้ววววววว';
        break;
    }
}

echo '<h1>ตัวอย่างการวนลูป หาค่าในตัวแปรแต่ละตัว</h1>';
echo '<img src="images/examp01.jpg" width="300"><br/>';
echo $worm_result_title;
echo $clock_result_title;
echo $flower_result_title;
echo "<br/>", $result_title;
?>

ขอให้ทุกท่านมีความสุข และสนุกกับการเขียนโปรแกรมนะครับ ^^



ปล.  โค้ดนี้ยังไม่ได้ปรับปรุงเพิ่มในส่วนของข้อสังเกตเรื่อง
1. เข้มนาฬิกาที่เปลี่ยนไปที่เลข 5
2. ความยาวของหนอนตัวสุดท้ายที่ต่างกันกับภาพอื่นๆ





PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

บันทึกการผจญภัยครั้งใหม่ : ทดลองรัน GO Lang Mobile บนมือถือ Android

โดย SONGCHAI SAETERN

ลองเขียน Go Lang Mobile ต้องตั้งค่าอะไรบ้าง?

เริ่มจากดาวน์โหลด และติดตั้ง Go
https://golang.org/doc/install


ดาวน์โหลดและติดตั้ง GoLang Mobile
https://github.com/golang/go/wiki/Mobile#tools


พอถึงขั้นตอน Building and deploying to Android รันไม่ผ่าน!!
https://developer.android.com/ndk/guides/

ต้องไปติดตั้ง Android Studio ก่อนเพื่อโหลด NDK
https://developer.android.com/studio/

หลังจากนั้นก็หา PATH ndk-bundle บน Windows 10 ไม่เจอ
https://stackoverflow.com/questions/27522184/android-ndk-default-location



ต้องรัน NDK ก่อนเริ่มคำสั่ง Building อีกครั้ง
https://stackoverflow.com/questions/42430609/gomobile-command-error-no-android-ndk-path-is-set/42914874 


หลังจาก Building เสร็จจะได้ไฟล์ basic.apk ที่โฟลเดอร์ชื่อ Users ของ Windows 7




หลังจากนั้นก็ลองคำสั่งเกี่ยวกับ Android Debug Bridge (adb) ซึ่งจะไม่พบเพราะไม่ได้เซ็ต PATH ของ Android SDK
https://stackoverflow.com/questions/2517493/adb-command-not-found-in-linux-environment







พอลองรันดู ปรากฏว่าหาตัว device/emulators ไม่เจอ




ก็ลองไปค้นดูก็เจอกระทู้ที่บอกว่าให้เปิดที่โทรศัพท์มือถือ หรือเครื่องที่เราใช้ต่อกับคอมพิวเตอร์ของเรา
https://stackoverflow.com/questions/10705089/how-to-fix-error-device-not-found-with-adb-exe

และโทรศัพท์แต่ละเครื่องก็มีเมนูที่ต่างกันอย่างเช่น


ซึ่งในตระกูล SAMSUNG ก็จะคล้ายกันนี้ แต่ยี่ห้ออื่นอาจจะแตกต่างกันบ้าง


หลังจากนั้นลองรันคำสั่งอีกครั้ง รอจนกระทั่งติดตั้งบนเครื่องเราเรียบร้อยจะมีข้อความ Success ปรากฏขึ้นมา

> gomobile install golang.org/x/mobile/example/basic

เมื่อเปิดดูบนเครื่องมือถือจะพบกับแอพฯใหม่ที่ชื่อว่า Basic อยู่บนหน้าจอเรียบร้อย

แอพใหม่บนมือถือ



ซึ่งในขั้นตอน Install เราจะต้องกำหนดการเชื่อมต่อของ USB ให้เป็นโหมด "เชื่อมต่ออุปกรณ์"




หรือหากไม่ต้องการ Install ผ่าน gomobile จะเปลี่ยนไปโหมด "ถ่ายโอนไฟล์" ก็ได้ซึ่งเมื่ออยู่ในโหมดถ่ายโอนไฟล์ ใน My Computer จะปรากฏไอคอนไดร์ฟของโทรศัพท์มือถือ ให้ทำการคัดลอกไฟล์ไปวางบนพื้นที่เก็บข้อมูลในมือถือเลยก็แล้วแต่สะดวกครับ


เอาไฟล์ .apk ในคอมพิวเตอร์เราไปวางไว้ในไดร์ฟมือถือ


เมื่อเปิดเข้าไปในส่วนของการจัดการไฟล์ ในมือถือ ให้เปิดไปที่ประเภทไฟล์ APK หรือถ้าไม่มีเมนูนี้ ก็เข้าไปตามโฟลเดอร์ที่นำไฟล์ basic.apk ไปวางไว้ในขั้นตอนที่ผ่านมาโดยตรง


เพียงเท่านี้ก็สามารถกดติดตั้งแอพฯได้เองแล้วครับ
หลังจากนี้สิ่งที่ต้องทำก็คือ อ่านคู่มือและทดลองตามตัวอย่างต่างๆให้เข้าใจ และประยุกต์ใช้จริงในงานของเรากันครับ อาจจะใช้เวลานานหน่อย แต่ก็ท้าทายดีสำหรับการเริ่มต้นเขียนภาษาใหม่ๆ และขอให้ทุกคนสนุกไปกับการแก้ปัญหาอย่าท้อกันง่ายๆนะครับ :)



ปล. ในตัวอย่างนี้เมื่อเปิดแอพฯ Basic ขึ้นมาจะปรากฏรูปสามเหลี่ยมกระพริบดังภาพด้านล่างนี้




เรื่องราวหลังจากนี้จะเป็นอย่างไรต่อไป โปรดติดตามตอนต่อไป

มาฝึกแฮกเว็บ ก่อนที่เว็บเราจะถูกแฮก!! (PHP Web Application Security)

โดย SONGCHAI SAETERN

รวมบทความแนะนำวิธีการแฮกเว็บไซต์และการป้องกัน


PHP Web Application Security 



SQL Injection



Cross Site Scripting (XSS)


Cross Site Request Forgery (CSRF)






ใครที่มีเรื่องราวน่าสนใจ แบ่งปันกันได้ที่คอมเมนต์ด้านล่างนี้เลยครับ




PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

PHP กับการเข้ารหัสข้อมูลรหัสผ่านด้วย md5() และ password_hash()

โดย SONGCHAI SAETERN

เข้ารหัสข้อมูลรหัสผ่านด้วย password_hash()

สำหรับการเข้ารหัสด้วย md5() เพียงอย่างเดียวสามารถถอดรหัสได้แล้วด้วยฐานข้อมูลที่มีข้อมูลรหัสจำนวนมหาศาลดังนั้น PHP จึงได้สร้างฟังก์ชั่นใหม่ขึ้นมารองรับการเข้ารหัสที่ดีกว่าเดิม แต่นั่นก็ไม่ใช่เหตุผลให้เราทิ้งฟังก์ชั่น md5() ไปเลยเสียทีเดียว เพราะยังมีประโยชน์ในการเข้ารหัสที่ได้รหัสเหมือนเดิมทุกครั้ง และใช้แค่ 32 หลักเท่านั้น


แต่เพื่อความปลอดภัยของรหัส เราก็จำเป็นจะต้องทำการผสมผสานข้อมูลใหม่ เพื่อให้เมื่อแกะออกมาแล้วไม่สามารถเข้าใจมันได้ด้วยนั่นเอง

โค้ดตัวอย่างการเข้ารหัส md5() ก่อนเรียกใช้ password_hash() อีกครั้ง

<?php
header('Content-Type: text/html; charset=utf-8');
function utf8_strrev($str)
{
preg_match_all('/./us', $str, $ar);
return join('', array_reverse($ar[0]));
}
function pass_encrypt($pass, $show = false)
{
//you secret word
$key1    = 'asdfasf';
$key2    = 'asdfasdf';
$loop    = 1;
$reverse = utf8_strrev($pass);
if ($show == true) {
echo '<br> กลับตัวอักษร &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: ', $reverse;
}
for ($i = 0; $i < $loop; $i++) {
$md5 = md5($reverse);
if ($show == true) {
echo '<br> เข้ารหัสเป็น 32 หลัก : ', $md5;
}
$reverse_md5 = utf8_strrev($md5);
if ($show == true) {
echo '<br> กลับตัวอักษร &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : ', $reverse_md5;
}
$salt = substr($reverse_md5, -13) . md5($key1) . substr($reverse_md5, 0, 19) . md5($key2);
if ($show == true) {
echo '<br> สร้างข้อความใหม่ &nbsp;&nbsp;&nbsp; : ', $salt;
}
$new_md5 = md5($salt);
if ($show == true) {
echo '<br> เข้ารหัสเป็น 32 หลัก : ', $new_md5;
}
$reverse = utf8_strrev($new_md5);
if ($show == true) {
echo '<br> กลับตัวอักษรอีกครั้ง &nbsp;: ', $reverse;
}
}
return md5($reverse);
}
$pass = "สวัสดี+2561";
echo '<br> md5() ธรรมดา &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : ', md5($pass);
//เข้ารหัส md5 ก่อน
$encrypt = pass_encrypt($pass, true);
// และเข้ารหัส hash เพื่อนำไปบันทึกลงฐานข้อมูล
$hash    = password_hash($encrypt, PASSWORD_DEFAULT);
echo '<hr/>รหัสผ่าน : ' . $pass;
echo '<br/> ผลลัพธ์ : <b>' . $hash . '</b>';
echo '<br/>ความยาวของตัวอักษร : <b>', strlen($hash), '</b>';
//ข้อมูลทดสอบ
$pass_in_db = '$2y$10$xvm4oq.N96bUQTQIw9u/fuUHAPEg80OZBWztKx8pxry96tJwWdu0.';// is $hash
$post_data  = "สวัสดี+2561";
echo '<hr/><br/>from <b>POST</b> = ' . $post_data;
echo '<br/>data in <b>DB</b> = ' . $pass_in_db;
echo '<br/><b>Md5</b> = ', md5($post_data);
if (password_verify(pass_encrypt($post_data), $pass_in_db)) {
echo '<br/><br/><span style="color:green">Password is valid!</span>';
} else {
echo '<br/><br/><span style="color:red">Invalid password.</span>';
}
?>

<br/><br/>
<h3>Function Reference</h3>
<pre>
http://php.net/manual/en/function.strrev.php
http://php.net/manual/en/function.md5.php
http://php.net/manual/en/function.password-hash.php
http://php.net/manual/en/function.password-verify.php
</pre>


ทดสอบโค้ดได้ที่ https://phpfiddle.org/

อ้างอิง

http://php.net/manual/en/function.strrev.php
http://php.net/manual/en/function.md5.php
http://php.net/manual/en/function.password-hash.php
http://php.net/manual/en/function.password-verify.php


PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

PHP กับการแทนที่ข้อความ มาดูกันว่ามีฟังก์ชั่นอะไรให้ใช้บ้าง

โดย CyberMAN

PHP Replace Function

1. str_replace()Replace all occurrences of the search string with the replacement string

2. substr_replace()
Replace text within a portion of a string

Translate characters or replace substrings

4. preg_replace()
Perform a regular expression search and replace

แต่ละฟังก์ชั่นแตกต่างกันอย่างไร


เริ่มจาก =>

1. str_replace()
 เรามักจะคุ้นเคยกับการใช้เพื่อแทนที่คำบางคำให้เป็นคำอื่น เช่น
echo str_replace("ผศ.ดร.", "", "ผศ.ดร.สมบูรณ์  ใจดี");
ก็จะได้ผลลัพธ์ที่แทนที่ ผศ.ดร. เป็นค่าว่าง = สมบูรณ์  ใจดี


หรือ ใช้ตัดเครื่องหมายคอมม่าในตัวเลขออกไป
echo str_replace(",", "", "1,234,654.00");
ก็จะได้แต่ตัวเลข 1234654.00 เพื่อเอาไปบันทึกในฐานข้อมูล

นอกจากนี้ยังสามารถนำไปใช้แทนที่คำหยาบได้ด้วย ยกตัวอย่าง

$rough = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$content = str_replace($rough, "*", "Hello World of PHP");
echo $content;

ข้อความในตัวแปรอาร์เรย์ $rough จะแทนที่ด้วยเครื่องหมาย *   

H*ll* W*rld *f PHP

---------------------------
ในส่วนของการแทนที่หลายคำด้วย Array นั้นแนะนำให้ใช้ strtr() จะอ่านง่ายกว่า

        $phrase  = "You should eat fruits, vegetables, and fiber every day.";
        $healthy = array("fruits", "vegetables", "fiber");
        $yummy   = array("pizza", "beer", "ice cream");
---------------------------


2. substr_replace()
ฟังก์ชั่นนี้ยังไม่เคยใช้งาน เพราะนึกไม่ออกว่าจะใช้ในกรณีไหน และการนำไปใช้เราต้องรู้ตำแหน่งที่ต้องการแทนที่อยู่แล้วด้วย ซึ่งอาจจะต้องใช้ฟังก์ชั่นค้นหาคำเพิ่มเติม

substr_replace ( ข้อความ, คำที่ใช้แทนที่ ระบุตำแหน่งเริ่มต้น [, ระบุความยาวที่จะแทนที่] )

เท่าที่พอจะคิดออกก็คือ เอามาเติมเต็มฟังก์ชั่น substr() เพราะว่าชื่อก็บ่งบอกอยู่แล้ว แต่จะใช้ตอนไหน ก็คือ substr() จะใช้ตัดข้อความแบบระบบตำแหน่ง เช่น   AABBCC  เราสามารถตัดเฉพาะ AA โดยระบุตำแหน่งได้ หรือ ตัด CC แบบระบุตำแหน่งย้อนหลัง -2 หรือจะตัดแค่ตรงกลาง BB ก็ได้

แต่ที่ทำไม่ได้คือ ถ้าต้องการ 2 สองส่วน คือ   AACC  เราจะตัดด้วย substr() ถึง 2 ครั้งด้วยกัน แต่ถ้าใช้ substr_replace() จะใช้แค่ครั้งเดียว ก็ประหยัดเวลาไปได้

---------------------------
กรณีที่ AABBCC  เรารู้อยู่แล้ว่า ค่าตรงกลางคือ BB ไม่เปลี่ยนแปลง
เราจะใช้ str_replace('BB', '', 'AABBCC') ไปเลยก็ได้ แต่!!! ถ้าตำแหน่งที่ 3-4 เป็นข้อความที่เปลี่ยนแปลงไม่ซ้ำกัน แต่มีตำแหน่งที่แน่นอน การใช้ substr_replace() จึงเป็นวิธีที่สะดวกที่สุด
---------------------------


3. strtr()

เหมือนกับใช้แปลงคำ หรือแปลความหมายก็ได้
strtr ( ข้อความต้นฉบับคำค้นหาคำแทนที่ )

หรือจะใช้แทนที่แบบอาร์เรย์ก็ได้

 strtr ( ข้อความต้นฉบับอาร์เรย์สำหรับแทนที่ )

ตัวอย่างการใช้งาน

<?php
$trans = array("Hello" => "สวัสดี", 'Everybody' => 'ทุกคน');
echo strtr("Hello Everybody", $trans);
?>

ผลลัพธ์ที่ได้
สวัสดี ทุกคน


4. preg_replace()

preg_replace ( รูปแบบการค้นหาคำแทนที่ , ข้อความ )

จะเป็นการแทนที่แบบกำหนดรูปแบบได้ ซึ่งจะต้องศึกษา Regular Expressions เพิ่มเติม


ตัวอย่างการใช้แทนที่ URL ให้กลายเป็นลิงค์คลิกได้

<?php

$pattern = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/";

$inp = "Harry you're a http://google.com wizard!";
$text = preg_replace($pattern, "<a href='$1'>$1</a>", $inp);

echo $text;
?>


อ้างอิง
PHP preg_replace - www or http://
https://stackoverflow.com/questions/6165552/php-preg-replace-www-or-http




PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

PHP Codeigniter กับการใช้งาน Template Parser Class แล้วไม่สามารถเรียกใช้ตัวแปรด้านนอก Variable Pairs ที่กำหนดไว้ได้

โดย SONGCHAI SAETERN

มาดัดแปลงฟังก์ชั่น Template Engine ใน CodeIgniter กัน



โค้ดด้านล่างนี้เป็นส่วนของ View ที่มาจากเว็บไซต์ CodeIgniter
https://www.codeigniter.com/userguide3/libraries/parser.html


โดยจะมี Controller ที่ทำหน้าที่รับส่งค่าดังนี้


เมื่อลองรันทดสอบบนหน้าเว็บบราวเซอร์ จะเห็นว่าข้อมูลในอาร์เรย์จะแทรกลงไปในตำแหน่งวงเล็บที่ตรงกับ Key ของข้อมูลแต่ละตัว และในส่วนของ {blog_entries} .......... {/blog_entries} จะพิเศษตรงที่ มีการวนลูปตามจำนวนอาร์เรย์ให้เราเรียบร้อย โดยที่เราไม่ต้องเขียนคำสั่งวนลูปอีกเลย



แต่ปัญหามีอยู่ว่า ในบล็อก {blog_entries} .......... {/blog_entries}  ไม่สามารถเรียกใช้ {site_url} ซึ่งเราได้สร้างอาร์เรย์รับค่าเอาไว้แล้ว

หน้า controllers/Welcome.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Welcome extends CI_Controller {
public function index()
{
$this->load->helper('url');
$this->load->library('parser');
$data = array(
'site_url' => site_url(),
'blog_title'   => 'My Blog Title',
'blog_heading' => 'My Blog Heading',
'blog_entries' => array(
array('title' => 'Title 1', 'body' => 'Body 1'),
array('title' => 'Title 2', 'body' => 'Body 2'),
array('title' => 'Title 3', 'body' => 'Body 3'),
array('title' => 'Title 4', 'body' => 'Body 4'),
array('title' => 'Title 5', 'body' => 'Body 5')
)
);
$this->parser->parse('welcome_message', $data);
}
}
?>

ไฟล์ views/welcome_message.php

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{blog_title}</title>
<style type="text/css">
body {
background-color: #fff;
margin: 40px;
font: 13px/20px normal Helvetica, Arial, sans-serif;
color: #4F5155;
}
</style>
</head>
<body>
        <h3>H3 : {blog_heading}</h3>
<p>ลิงค์ : {site_url}</p>
        {blog_entries}
            <h5>H5 : {title}</h5>
            <p>P : {body}</p>
<p>Link : {site_url}</p>
        {/blog_entries}
</body>
</html>

เมื่อรันบนหน้าเว็บบราวเซอร์ผลลัพธ์จะแสดงเฉพาะส่วนที่อยู่ด้านนอก {blog_entries} .......... {/blog_entries} เท่านั้น ส่วนที่อยู่ในบล็อก จะเป็นแค่ {site_url} ธรรมดา





ดังนั้นเพื่อเติมเต็มความต้องการที่ขาดหายไป ผมก็เลยจัดการเขียนทับฟังก์ชั่น parse() ไปซะเลย 

โดยแทนที่ข้อความในวงเล็บที่มี 2 ตัวซ้อนกันแทนการใช้วงเล็บตัวเดียว เพื่อไม่ให้ทับซ้อนกับการทำงานเดิมของโค้ดที่อยู่ในบล็อก

สร้างไฟล์ MY_Parser.php  เอาไว้ที่ application/libraries/MY_Parser.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Overrides the CI Template Parser to allow for multiple occurrences of the
 * same variable pair
 *
 */
class MY_Parser extends CI_Parser {
// --------------------------------------------------------------------
/**
* Parse a template
*
* Parses pseudo-variables contained in the specified template view,
* replacing them with the data in the second param
*
* @param string
* @param array
* @param bool
* @return string
*/
public function parse($template, $data, $return = FALSE)
{
$template = $this->CI->load->view($template, $data, TRUE);
$results = $this->_parse_double($template, $data);
$results = $this->_parse($results, $data, TRUE);
if ($return === FALSE)
{
$this->CI->output->append_output($results);
}
return $results;
}
// --------------------------------------------------------------------
/**
* Parse a single key/value
*
* @param string
* @param string
* @param string
* @return string
*/
protected function _parse_double($results, $data)
{
$replace = array();
preg_match_all("/\{\{(.*?)\}\}/si", $results, $matches);
foreach ($matches[1] as $match)
{
$key = '{{'.$match.'}}';
$replace[$key] = isset($data[$match]) ? $data[$match] : $key;
}
$results = strtr($results, $replace);
return $results;
}
}
// END Parser Class
/* End of file MY_Parser.php */
/* Location: ./application/libraries/MY_Parser.php */


และแก้ไขในส่วนของ View ให้ใช้วงเล็บซ้อนกัน 2 ตัว เมื่อต้องการเรียกใช้ข้อมูลจากตัวแปรที่อยู่ด้านนอกของบล็อกที่เป็น Variable Pairs นั้นๆ

จะสังเกตว่า ผมเปลี่ยนมาใช้ {{site_url}} แทนวงเล็บชั้นเดียว

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{blog_title}</title>
<style type="text/css">
body {
background-color: #fff;
margin: 40px;
font: 13px/20px normal Helvetica, Arial, sans-serif;
color: #4F5155;
}
</style>
</head>
<body>
        <h3>H3 : {blog_heading}</h3>
<p>ลิงค์ : {site_url}</p>
        {blog_entries}
            <h5>H5 : {title}</h5>
            <p>P : {body}</p>
<p>Link : {{site_url}}</p>
        {/blog_entries}
</body>
</html>

เมื่อไปรันบนหน้าเว็บเบราเซอร์จะได้ผลลัพธ์ตามที่ต้องการดังนี้




ยังไงก็ลองเอาไปปรับใช้กันดูนะครับ

ขอให้ทุกท่านสนุกกับการฝึกเขียน PHP แบบ MVC ด้วย CodeIgniter Framework นะครับ :)


ข้อมูลอ้างอิง

สร้าง Pattern เพื่อค้นหาคำในวงเล็บ {{something1}} something2 {{something3}} something4https://stackoverflow.com/questions/5897478/how-to-get-the-shortest-rather-than-longest-possible-regex-match-with-preg-match

ฟังก์ชั่นแทนที่ข้อความ strtr()
http://php.net/manual/en/function.strtr.php



PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

PHP การกำหนดรูปแบบทศนิยม ตามค่าที่มี หากทศนิยมเป็น 0 ให้ตัดทิ้ง

โดย CyberMAN

การตัดทศนิยมที่มีค่าเป็นศูนย์ออกจากตัวเลข


จากในรูปก็คือถ้า .00 ก็จะตัดทิ้ง
แต่ถ้ามีทศนิยมมาด้วย ก็ให้คงเอาไว้


วิธีง่ายๆที่ใช้ก็คือ การ +0 เข้าไปเท่านั้นเองก็จะได้ผลลัพธ์ที่ต้องการ
โดยไม่ต้องไปเสียเวลา explode() แล้วมา implode() ใหม่


แต่ถ้ารูปสึกว่า 9166.7 เลขทศนิยมหลักเดียวแบบนี้ไม่สวย จะใส่ number_format() ครอบไว้อีกทีก็ย่อมได้ แต่ทีนี้ถ้าเจอกับเลขที่ไม่มีทศนิยมล่ะ?? ก็กลายเป็น 1255.00 อีก

ดังนั้นก็เพิ่มฟังก์ชั่นสำหรับตรวจสอบเข้าไป

function is_decimal( $val )
{
    return is_numeric( $val ) && floor( $val ) != $val;
}

เวลาใช้ก็เรียกแบบนี้

    if(is_decimal($val)){
        $val = number_format($val, 2);
    }else{
        $val = number_format($val);
    }


ทีนี้เลข  9166.7  ก็จะเป็น  9,166.70 เหมือนเดิม
และเลข 1255.00 ก็กลายเป็น  1,255 เท่านั้น

:: อ้างอิง ::

Remove useless zero digits from decimals in PHP
https://stackoverflow.com/questions/14531679/remove-useless-zero-digits-from-decimals-in-php 
 
Check if number is decimal

https://stackoverflow.com/questions/6772603/check-if-number-is-decimal


PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม

สนใจสั่งซื้อเพียง 4,500 บาท
http://fastcoding.phpcodemania.com/

ขั้นตอนแก้ปัญหา - สั่งพิมพ์ PDF แล้วเกิดข้อความแจ้งเตือนข้อผิดพลาด TCPDF error Line Number: 18650

โดย CyberMAN

สั่งพิมพ์เอกสาร PDF ด้วย TCPDF แล้วปรากฏข้อความแจ้ง Error

Message: Undefined offset: 132
Filename: tcpdf/tcpdf.php
Line Number: 18650


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



เริ่มต้นจากการค้นหาจุดที่เกิดข้อผิดพลาด เนื่องจากไม่มีแจ้งว่าโค้ดบรรทัดไหนที่เราเขียนผิดพลาด แต่ข้อความแจ้งถึงส่วนข้างในไลบรารี่ TCPDF ที่เรานำมาใช้เท่านั้น



1. echo() เท่านั้นที่จะคลี่คลายข้อสงสัย หาจุดที่คิดว่าน่าจะเกิดข้อผิดพลาด แล้ววางโค้ดไปเลย อาจจะเริ่มจาก echo 11111; จนไปถึง echo 99999;  หรือจะ echo 'AAAAAA';  ถึงจุดที่ 'ZZZZZ'; ก็ได้



2. มารันหน้าเว็บเพื่อดูผลลัพธ์กัน ว่าข้อความที่ echo ออกมาจะโผล่ตรงไหนบ้าง ในตัวอย่างข้อความ error ปรากฏขึ้นระหว่าง 5 กับ 6  ให้กลับไปดูโค้ดที่ตำแหน่งช่วงนั้น และปรับสโคปให้เหลือแคบที่สุดจนเจอต้นตอ


3. เมื่อรู้ว่าเกิดจาก writHTMLCell() ก็มาดูว่าอะไรที่ถูกเขียนออกมาแล้วทำให้ PDF ของเราทำงานผิดพลาด แต่ก่อนจะลัดไปถึงขั้นตอนที่ 7 เราลองมาไล่ดูใน Google กันก่อน



4. ลองคัดลอกข้อความแจ้ง error มาทั้งหมดแล้ววางไปใน Google แล้วกดค้นหาดูก่อน และปรากฏว่าไม่เจอสิ่งที่ค้นหา อาจจะเพราะคีย์เวิร์ดยังไม่โดน



5. งั้นเรามาทำให้แคบลงอีกนิด โดยเอาบรรทัดที่ระบุว่าเป็น tcpdf และ บรรทัดที่ error ในไลบรารี่ก็พอ


6. คำตอบที่ได้ก็ทำให้กระจ่างขึ้นมาอีกนิดว่าเป็นเพราะ HTML ของเรามีปัญหา เอาล่ะมาดูกันเลยว่ามันมีอะไรบ้างที่ทำให้เกิดข้อผิดพลาดในข้อมูลของเรา
7. ใช้คำสั่งแสดงผล echo $html ที่เรารับค่าจาก View ของ Controller ที่เขียนสร้าง PDF ส่วนนี้มาดูกันว่าพ่นอะไรออกมาบ้าง



8. เมื่อตรวจสอบดูก็พบว่า มีเครื่องหมายวงเล็บ < ซึ่งเป็น HTML TAG นั่นเองที่เป็นสาเหตุของข้อผิดพลาดครั้งนี้


9. ทำการแทนที่ HTML TAG ให้เป้นรหัสพิเศษที่แสดงผลเป็นวงเล็บในแบบเดียวกัน



10.จะได้รหัสที่ต้องการมาสองตัว คือ  &lt;  และ &gt;  (สังเกตว่าด้านบนมีอักขระพิเศษอีก 3 ตัวที่ต้องแทนที่ด้วย ซึ่งถ้าไม่แทนที่ก็อาจจะจะเกิด error ได้เช่นกัน)


11.สร้างคำสั่งแทนที่ข้อความด้วย str_replace()


 12. มารันหน้าเว็บดูผลลัพธ์กันอีกครั้ง ก็จะพบว่า error หายไปแล้วจ้า



 ขอให้ทุกท่านสนุกกับการเขียนโปรแกรม
และมีสติกับการแก้บั๊กกันต่อไป สวัสดีครับ



:: อ้างอิง ::

TCPDF returning error while generating table structure to print

https://stackoverflow.com/questions/26159707/tcpdf-returning-error-while-generating-table-structure-to-print

htmlspecialchars
http://php.net/manual/en/function.htmlspecialchars.php

TCPDF HTML Tags <>Confusion
https://stackoverflow.com/questions/8585807/tcpdf-html-tags-confusion




PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม

สนใจสั่งซื้อเพียง 4,500 บาท
http://fastcoding.phpcodemania.com/