มานั่งดู 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 กับเซิฟเวอร์
