|
วันนี้พอดีเจอปัญหาในระบบ hosting ของลูกค้าท่านหนึ่ง แล้วปรากฎว่าทำการ reset ระบบ hosting ใหม่ก็แล้ว ลองเปลี่ยนชื่อโดเมนก็แล้ว ทดสอบทุกอย่างก็ยังไม่สามารถ insert ได้ คืออาการมันเป็นการไม่ยอมส่งค่าไปยังไฟล์ที่ทำหน้าที่ query insert ลง mysql ให้ครับ โดย function ดังกล่าวเป็นดังนี้ครับ
function postDataReturnText(url, data, callback){
var XMLHttpRequestObject = getHTTPObject();
if(XMLHttpRequestObject) {
XMLHttpRequestObject.open("POST", url);
XMLHttpRequestObject.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
XMLHttpRequestObject.onreadystatechange = function() {
if (XMLHttpRequestObject.readyState == 4 &&
XMLHttpRequestObject.status == 200) {
callback(XMLHttpRequestObject.responseText);
delete XMLHttpRequestObject;
XMLHttpRequestObject = null;
} else {
callback(" <img src='ajax-loader.gif'>loading");
}
}
XMLHttpRequestObject.send(data);
}
}
จากการตรวจสอบค้นหาข้อมูลก็พบว่า การส่งค่าแบบ POST เราได้ระบุไปว่าให้มีการส่งค่าแบบ form และ urlencoded ด้วย คือต้องมีการเข้ารหัสตัวอักษรให้อยู่ในรูปของ URL ด้วยครับ ดังนั้นขั้นตอนที่จะทำการเรียก function postDataReruntText จะต้องมีการ encode URI มาก่อนครับ
var param = encodeURI("string="+string);
postDataReturnText('save.php', param, displayMsg);
แบบนี้ปัญหาภาษาไทยก็จะหมดไปจาก ajax ครับ เนื่องจากว่าพวกฝรั่งเขาใช้ภาษาอังกฤษเป็นหลักเขาจึงไม่ค่อยเจออย่างเราครับ
คนส่วนใหญ่ใช้งาน hosting เวลาส่งค่าตัวแปรกันมักจะมองข้ามเรื่องของการเข้ารหัสให้ถูกต้องครับ เหมือนกรณีของ register global เช่นกันครับ ตรงนั้นก็เป็นเรื่องของการรับ-ส่งค่าตัวแปรใน hosting ให้ถูก method ครับ อ่านรายละเอียดเพิ่มเติมได้ที่ http://www.naxza.com/hosting_article_21-10_18-00-41.php
setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); req.send("ID="+ID);
มักจะส่งค่ากันแบบนี้ ถ้าเป็นค่าตัวเลข หรือ ภาษาอังกฤษก็ไม่ค่อยจะมีปัญหานะครับ แต่วิธีที่ถูกควรจะเป็น
setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); req.send(encodeURI("ID="+ID));
ส่วนใครที่อยากได้ javascript function ในการแปลง URLEncoding และ URLDecoding ก็ตามนี้เลยครับ
function URLDecode (encodedString) {
var output = encodedString;
var binVal, thisString;
var myregexp = /(%[^%]{2})/;
while ((match = myregexp.exec(output)) != null
&& match.length > 1
&& match[1] != '') {
binVal = parseInt(match[1].substr(1),16);
thisString = String.fromCharCode(binVal);
output = output.replace(match[1], thisString);
}
return output;
}
function URLEncode (clearString) {
var output = '';
var x = 0;
clearString = clearString.toString();
var regex = /(^[a-zA-Z0-9_.]*)/;
while (x < clearString.length) {
var match = regex.exec(clearString.substr(x));
if (match != null && match.length > 1 && match[1] != '') {
output += match[1];
x += match[1].length;
} else {
if (clearString[x] == ' ')
output += '+';
else {
var charCode = clearString.charCodeAt(x);
var hexVal = charCode.toString(16);
output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
}
x++;
}
}
return output;
}
หรือหากเป็น php script function สำหรับแปลงเราก็ใช้ urlencode() และ urldecode() ได้เลยครับ
สำหรับการแปลงภาษาไทยจาก TIS-620 เป็น UTF-8 ก็สามารถทำได้นะครับ อันนี้เป็น php script ครับ
function utf8_to_tis620($string) {
$str = $string;
$res = "";
for ($i = 0; $i < strlen($str); $i++) {
if (ord($str[$i]) == 224) {
$unicode = ord($str[$i+2]) & 0x3F;
$unicode |= (ord($str[$i+1]) & 0x3F) << 6;
$unicode |= (ord($str[$i]) & 0x0F) << 12;
$res .= chr($unicode-0x0E00+0xA0);
$i += 2;
} else {
$res .= $str[$i];
}
}
return $res;
}
หรือจะใช้เป็น iconv() ก็ได้ครับ echo iconv('UTF-8', 'TIS-620', $variable); หรือ echo iconv('TIS-620', 'UTF-8', $variable);
Webdesign Article : |