Captcha ไม่รีเฟรชบนเซิฟเวอร์ แต่ในเครื่องใช้งานได้ปกติ
ปัญหาคือ captcha สามารถใช้งานได้ปกติเมื่ออยู่ localhost ในเครื่องของเรา แต่พอเรานำขึ้นไปบนเซิฟเวอร์เพื่อใช้งานจริงกับมีปัญหา
ดังนี้
เมื่อเราคลิกไปหน้าที่มี captcha อยู่ แล้วกรอกข้อมูลเลย จะไม่มีปัญหา สามารถทำงานได้ปกติ
แต่เมื่อเราคลิกไปหน้าที่มี captcha อยู่ แล้วไม่ได้กรอกข้อมูล คลิกไปลิงค์อื่นๆ แล้วกลับมาลิงค์ที่มี captcha อยู่นั้น รูป captcha นั้นจะไม่เปลี่ยนเป็นรูปอื่น แต่เมื่อเรากรอกข้อมูลไป ปรากฎว่าา โค๊ดไม่ถูกต้อง
แต่เมื่อเราทำการกดปุ่ม Refresh บน browser รูป captcha ถึงจะเปลี่ยน ไม่เข้าใจ งง จิงๆๆ รบกวนช่วยทีนะค่ะ
(คิดว่า รูปไม่เปลี่ยน แต่โค๊ด random มีการทำงาน ทำให้เช็คไม่ตรงกันอ่ะค่ะ)
โค๊ด captcha ค่ะ
Code (PHP)
function createRandomPassword() { // ฟังก์ชั่นสำหรับสุ่มรหัสลับ<br>
srand ( date("s") );
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // ตัวแปรที่จะทำการสุ่ม จะเป็นตัวเลข ตัวเล็ก ตัวใหญ่ หรือผสมกันไปก็ใส่เพิ่มเอาเอง<br>
$ret_str = "";
$num = strlen($chars);
for($i=0; $i < 6; $i++) {
$ret_str.= $chars[rand()%$num]." ";// สุ่มเอามาสัก 6 ตัว 0 ถึง 5 ก็ 6 นั่นหล่ะน่าาา<br>
}
return $ret_str;
}
$text = createRandomPassword(); // เรียกใช้หังก์ชั้นสุ่มรหัสลับ แล้วมาเก็บค่าไว้ในตัวแปร $text
echo '<input name="code_chk" id="code_chk" value="'.ereg_replace(" ","",$text).'"="" type="hidden">'; // ตรงนี้สำหรับเก็บค่าตัวแปรที่ได้เพื่อส่งไปทำการตรวจเช็คกับ รหัสลับ ที่ผู้ใช้กรอก ว่าถูกต้องตรงกันหรือไม่<br>
$font_size = 13;
$height = 20;
$width = 100;
// ข้างล่างนี้เป็นการสร้างภาพและเอารหัสลับที่ได้ยัดใส่เข้าไปอยู่ในภาพที่สร้าง สามารถปรับเปลี่ยนได้นะครับ<br>
$im = ImageCreate($width, $height);
$grey = ImageColorAllocate($im, 230, 230, 230);
$black = ImageColorAllocate($im, 0, 0, 0);
$text_bbox = ImageTTFBBox($font_size, 0, "ALGER.TTF", $text); // อย่าลืมก๊อปไฟล์ฟอร์นมาไว้ในโฟลเดอร์ด้วยนะ ไม่งั้นจะไม่แสดงผล<br>
$image_centerx = $width / 2;
$image_centery = $height / 2;
$text_x = $image_centerx - round(($text_bbox[4]/2));
$text_y = $image_centery + 5;
//$text_y = $image_centery;<br>
ImageTTFText($im, $font_size, 0, $text_x, $text_y, $black, "ALGER.TTF", $text);
ImagePng($im,"image-code.png");
ImageDestroy ($im);
echo "<img src='image-code.png'>"; // และสุดท้ายก็แสดงผลรูปภาพออกมา<br>
?>
<input name="code" type="text" id="code" size="10">
------------------------------------------------------------------------------
อันนี้ เอาไว้เช็คเมื่อกดปุ่ม submit
Code (PHP)
<script language="javascript">
function chkblank(){
var Email=document.forma.mail;
var format_mail =/^([a-zA-Z0-9\_\-\.]{3,})+@([a-zA-Z0-9\-]{3,})+.+([a-zA-Z\-]{3,}|com|net|gov|mil|org|edu|int)$/;
// รูปแบบอีเมลกำหนดที่บรรทัดนี้ลองดูเองนะว่ารูปแบบที่ให้มาเป็นยังไง ถ้าไม่ชอบการเช็ครูปแบบอีเมลให้แก้ บรรทัดนี้ ^
if(document.forma.subject.value=="") {
alert("กรุณากรอกหัวเรื่อง")
return false
}
if(document.forma.txt.value=="") {
alert("กรุณากรอกข้อความที่คุณต้องการส่งถึงเรา")
return false
}
if(document.forma.by.value=="") {
alert("กรุณากรอกชื่อของคุณ")
return false
}
if(document.forma.mail.value==""){
alert("กรุณากรอกอีเมล์ของคุณ")
return false;
}
else if (!format_mail.test(Email.value)) {
alert("รูปแแบบ Email ไม่ถูกต้อง");
Email.focus()
return false;
}
if(document.getElementById('code').value==""){ // ตรงนี้เช็คว่าได้กรอกรหัสหรือยัง
alert("กรุณาระบุ code ด้วยครับ");
document.getElementById('code').focus();
return false;
}
if(document.getElementById('code').value!=document.getElementById('code_chk').value){ // ถ้ากรอกแล้ว รหัสถูกต้องไหม>
alert("Code ไม่ถูกต้อง กรุณาลองใหม่อีกครั้ง"); // ถ้าไม่ถูกต้องก็แจ้งให้เขาทราบ
document.getElementById('code').value=""; // ล้างค่าในเท็กซ์ออกเพื่อพร้อมสำหรับการกรอกรหัสลับใหม่
document.getElementById('code').focus();
return false;
}
document.forma.submit()
}
</script>
Tag : PHP, JavaScript, Ajax, jQuery
ประวัติการแก้ไข 2012-03-06 16:30:02 2012-03-06 16:30:32 2012-03-06 16:31:12
Date :
2012-03-06 15:51:54
By :
wilaiwan_a
View :
2063
Reply :
5
ลองใส่ตัวนี้ดูครับ
Code (PHP)
<?php header("Cache-Control: no-cache, must-revalidate");
Date :
2012-03-07 07:18:27
By :
webmaster
นำไปใส่แล้วมันขึัน Warrning แบบนี้อ่ะค่ะ ส่วนการทำงานก็ัยังมีปัญหาเหมือนเดิมค่ะ
Warning: Cannot modify header information - headers already sent by (output started at /home/itlandthai/domains/thammatan.com/public_html/gestbook_addNew.php:10) in /home/itlandthai/domains/thammatan.com/public_html/gestbook_new.php on line 115
Date :
2012-03-08 08:52:11
By :
wilaiwan_a
ลองใส่ <? ob_start() ?> ไว้บรรทัดแรกสุดของหน้าดูครับ
Date :
2012-03-08 09:37:41
By :
13eachz
ลองเอาแยกไฟล์ดูครับ
ไฟล์ captcha.php
Code (PHP)
function createRandomPassword() { // ฟังก์ชั่นสำหรับสุ่มรหัสลับ<br>
srand ( date("s") );
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // ตัวแปรที่จะทำการสุ่ม จะเป็นตัวเลข ตัวเล็ก ตัวใหญ่ หรือผสมกันไปก็ใส่เพิ่มเอาเอง<br>
$ret_str = "";
$num = strlen($chars);
for($i=0; $i < 6; $i++) {
$ret_str.= $chars[rand()%$num]." ";// สุ่มเอามาสัก 6 ตัว 0 ถึง 5 ก็ 6 นั่นหล่ะน่าาา<br>
}
return $ret_str;
}
$text = createRandomPassword(); // เรียกใช้หังก์ชั้นสุ่มรหัสลับ แล้วมาเก็บค่าไว้ในตัวแปร $text
$font_size = 13;
$height = 20;
$width = 100;
// ข้างล่างนี้เป็นการสร้างภาพและเอารหัสลับที่ได้ยัดใส่เข้าไปอยู่ในภาพที่สร้าง สามารถปรับเปลี่ยนได้นะครับ<br>
$im = ImageCreate($width, $height);
$grey = ImageColorAllocate($im, 230, 230, 230);
$black = ImageColorAllocate($im, 0, 0, 0);
$text_bbox = ImageTTFBBox($font_size, 0, "ALGER.TTF", $text); // อย่าลืมก๊อปไฟล์ฟอร์นมาไว้ในโฟลเดอร์ด้วยนะ ไม่งั้นจะไม่แสดงผล<br>
$image_centerx = $width / 2;
$image_centery = $height / 2;
$text_x = $image_centerx - round(($text_bbox[4]/2));
$text_y = $image_centery + 5;
//$text_y = $image_centery;<br>
ImageTTFText($im, $font_size, 0, $text_x, $text_y, $black, "ALGER.TTF", $text);
ImagePng($im,"image-code.png");
ImageDestroy ($im);
?>
เวลาใช้ก็เรียกแบบนี้
หน้าที่จะใช้
Code (PHP)
echo '<img src="captcha.php?'.rand(0,999999999).'">';
เช็ค captcha วิธีนี้ไม่ปลอดภัยครับ เอาค่าใส่ hidden input แบบนี้ ควรใช้แบบ session ดีกว่า
ในไฟล์ captcha.php ใส่ session_start() ไว้บนสุด แล้วที่
Code (PHP)
$text = createRandomPassword(); // เรียกใช้หังก์ชั้นสุ่มรหัสลับ แล้วมาเก็บค่าไว้ในตัวแปร $text
$_SESSION['captch'] = $text; // เอารหัสใส่ไว้ใน session
เวลาเช็คก็
Code (PHP)
<?php
session_start();
if(!$_SESSION['captcha'] || !$_SESSION['captcha']==$_POST['code'])
{
die('รหัสไม่ตรงกัน'); //ถ้าไม่มี session ที่เก็บค่า captcha หรือ ค่าใน session ไม่ตรงกับค่าที่กรอกมา
}
Date :
2012-03-08 10:13:24
By :
randOmizE
ยังไม่ได้อยู่ดีอ่ะค่ะ
ภาพมันไม่เปลี่ยนตอนที่เรากดลิงค์อื่นไปมา แล้วกลับมาที่เดิม ภาพมันก็เหมือนเดิม ไม่รีเฟรช
แต่ในเครื่องใช้ได้ปกติ ไม่เข้าใจว่าต้องแก้ไขอะไรที่เซิฟเวอร์หรือป่าวค่ะ งงงมากมาย
Date :
2012-03-08 13:42:49
By :
wilaiwan_a
Load balance : Server 00