กำหนดตัวหนังสือให้กับ captcha

มานั่งดู blog เก่าเห็นมีอีกเรื่องที่พอจะนำพามาได้  นี่คงเป็นบทความที่ 2 และเป็นบทความสุดท้ายของ blog เก่าผมแหละ

ทำงานด้านนี้แท้ ๆ ไม่ได้เขียนบทความเกี่ยวกับ PHP  นี่ก็จะกระไรอยู่  สองสามวันก่อนมีรุ่นน้องมาถามว่า โค๊ด capcha  เวลาอัพขึ้นโฮสแล้วมันไม่ได้  ทั้งที่รันในเครื่อง  กลับรันได้  มาดูสาเหตุกันครับ

ถ้าหากเราใช้ font ที่เป็น default แล้วไม่น่ามีปัญหาครับ  แต่เซิฟเวอร์ต้องลองรับการทำงานของ GD-LIBARY ก่อนนะครับ  แต่ถ้าอยากใช้ font ที่เราเลือกที่เป็นนามสกุล .ttf ซึ่งบางเซิฟเวอร์สามารถทำได้เลยเหมือนในเครื่องแต่บางเซิฟเวอร์เหมือนที่ผมกำลังใช้อยู่  AppservHosting ก็ต้องมีการปรับเปลี่ยนอะไรเล็กน้อยน่ะครับ ผมก็ไม่รู้เป็นเพราะสาเหตุอะไรเพราะการเซ็ตเซิฟเวอร์นี่ไม่เป็นเลย 555

หากติดปัญหาต้องลองทำวิธีนี้ดูครับ  เซ็ตพาทเต็มให้กับมันดู โดยใช้คำสั่ง

echo $_SERVER["SCRIPT_FILENAME"];

เมื่อได้พาธเต็มมาก็นำมาใส่ตัวแปร $font ใน class ตัวอย่าง capcha อันนี้ดูครับ ในที่นี้ผมใช้ font 1942.ttf ใส่ไว้ในโฟลเดอร์ capcha ครับ อ้อแล้วอย่างลืมไฟล์นี้ต้องประกาศ session_start(); ด้วยนะครับ

    
class CaptchaSecurityImages {
    
        var $font = "/home/www/virtual/3mistscript.com/htdocs/capcha/1942.ttf";
        function generateCode($characters) {
            $possible = "123456789abdefghjkmnABCDEFGHJKLMNPQRSpqrstvwxyzTUVWXYZ";
            $code = "";
            $i = 0;
            while ($i < $characters) { 
                $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
                $i++;
            }
            return $code;
        }
        function CaptchaSecurityImages($width="",$height="",$characters="") {
            $code = $this->generateCode($characters);
            $font_size = $height * 0.60;
            $image = @imagecreate($width, $height) or die("Cannot initialize new GD image stream");
            $background_color = imagecolorallocate($image, 250, 250, 250);
            $text_color = imagecolorallocate($image, 30, 30, 30);
            for( $i=0; $i<($width*$height)/2; $i++ ) {
                imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
            }
            $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die("Error in imagettfbbox function");
            $x = ($width - $textbox[4])/2;
            $y = ($height - $textbox[5])/2;
            imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die("Error in imagettftext function");
            header("Content-Type: image/gif");
            imagejpeg($image);
            imagedestroy($image);
            $_SESSION["security_code"] = $code;
        }
    }

เมื่อทำได้แล้วก็มาเรียกใช้กัน

 
    $width = "126";  //กำหนดความกว้าง
    $height = "40";  //กำหนดความสูง
    $characters = "6";  //กำหนดจำนวนตัวอักษร
    $captcha = new CaptchaSecurityImages($width,$height,$characters);
    echo "\"\"\n";

เมื่อเซ็ตได้แล้วก็มาเช็คกันว่า กรอกถูกรึป่าว ซึ่งผมสมมติว่าเอามาจากตัวแปร $_POST["code"]; นะครับ

     
    if($_POST["code"] == $_SESSION["security_code"]) {
        echo "โค๊ดถูกต้อง";
    }else{
        echo "โค๊ดผิด"; 
    }

เห็นไหมครับไม่ยากเลยลองทำกันดูครับอยากได้ font ไหนก็หาโลดดดดด

credit : ขอบคุณพี่แม็ค มอไซน์ด้วยนะครับที่แนะนำวิธีการใช้ font กับเซิฟเวอร์

Average: 5 (2 votes)