สนใจลงโฆษณา คลิกที่นี่

ผู้เขียน หัวข้อ: พบ Bug ในการ Edit หัวข้อครับ  (อ่าน 10634 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

ออฟไลน์ terdsak

  • New Member
  • *
  • กระทู้: 12
    • ดูรายละเอียด
พบ Bug ในการ Edit หัวข้อครับ
« เมื่อ: 29/04/07, 14:00:24 »
    ผมลองเพิ่งใช้  SMF ได้ไม่นานครับ และก็เจอ Bug ที่ค่อนข้างเห็นได้ชัดคือ
ผมตั้งหัวข้อยาวๆ พอผม Submit แล้วมาวันนึง ผมอยากแก้ไขข้อความข้างในกระทู้

ผมก็กด Edit ปรากฏว่าตอนที่มัน Save แล้วมันจะตัดหัวข้อบางส่วนทิ้ง แล้วห้อยตัวอักษรประหลาดๆต่อท้าย

ผมใช้ Encoding แบบ utf-8  และคิดว่าปัญหาน่าจะเกิดจากการ Post ข้อมูลกลับคืนโดย Ajax

อยากให้เพื่อนๆช่วยกันแก้ไข Bug ข้อนี้ด้วยครับ

ออฟไลน์ terdsak

  • New Member
  • *
  • กระทู้: 12
    • ดูรายละเอียด
Re: พบ Bug ในการ Edit หัวข้อครับ
« ตอบ #1 เมื่อ: 29/04/07, 14:12:31 »
Step แรกครับ ผมตั้งหัวข้อกระทู้จำลองขึ้นมา จะเห็นว่าหัวข้อ "อยากเลี้ยงลูกแมว แต่ที่บ้านมีหมาอยู่ อยู่ 4 ตัวน่ะค่ะ ทำไงดี"  ยังเป็นปรกติดีอยู่

[ไฟล์แนบถูกลบโดยผู้ดำเนินการ]

ออฟไลน์ terdsak

  • New Member
  • *
  • กระทู้: 12
    • ดูรายละเอียด
Re: พบ Bug ในการ Edit หัวข้อครับ
« ตอบ #2 เมื่อ: 29/04/07, 14:14:12 »
พอผมกดแก้ไข หรือ Edit หัวข้อ จะพบว่าใน Textbox มันได้เปลี่ยนหัวข้อไปเป็น "อยากเลี้ยงลูกแมว แต่ที่บ้านมีหมาอยู่ อ&" เสียแล้ว

[ไฟล์แนบถูกลบโดยผู้ดำเนินการ]

ออฟไลน์ terdsak

  • New Member
  • *
  • กระทู้: 12
    • ดูรายละเอียด
Re: พบ Bug ในการ Edit หัวข้อครับ
« ตอบ #3 เมื่อ: 29/04/07, 14:17:26 »
จากรูปหัวข้อจะเพี้ยนไปแล้วครับ  อยากให้เพื่อนๆช่วยกันลองดูนะครับ ผมก็จะพยายามไล่โค้ดเหมือนกันครับ

[ไฟล์แนบถูกลบโดยผู้ดำเนินการ]

ออฟไลน์ terdsak

  • New Member
  • *
  • กระทู้: 12
    • ดูรายละเอียด
Re: พบ Bug ในการ Edit หัวข้อครับ
« ตอบ #4 เมื่อ: 30/04/07, 03:18:44 »
เจอแล้วครับ เป็นเพราะ field "subject" ใน table "smf_messages" มันเป็น TINYTEXT ครับ
 ซึ่งผม Query โดยใช้ MySQL Query Browser ลอง query ข้อมูลขึ้นมาดูมันจะเก็บอักษรในลักษณะ html encode ครับ
เช่น
โค้ด: [เลือก]
อยากเลี้ยงลูกแมว แต่ที่บ้านมีหมาอยู่ อยู่สองตัว ทำไงดีคะ ซึงมันจะเก็บข้อมูลได้แค่ 255 byte เท่านั้น

ผมเลยเอาสคริปต์ sql ดังนี้ไปรัน เพื่อเปลี่ยนฟิลด์นี้ให้เป็น MEDIUMTEXT
โค้ด: [เลือก]
ALTER TABLE `micnet_smf`.`smf_messages` MODIFY COLUMN `subject` MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
ปรากฎว่าเวลาแก้ไขแล้วหัวข้อไม่เปลี่ยนแปลงครับ ได้ผล

ตัวผมเองก็ไม่อยากแก้ด้วยวิธีนี้เหมือนกันอะครับ เพราะมันดูถึกไปหน่อย แต่หากไปยุ่งกับ code ของมันก็ยุ่งยากปวดหัวเหมือนกัน
และก็มีข้อสงสัยอีกอย่างคือ ทำไมมันต้องเก็บ ข้อมูลในรูปแบบ html encode ด้วย ซึ่งข้อเสียของมันคือ query ขึ้นมาแล้วอ่านไม่รู้เรื่องครับ

ออฟไลน์ kaazoo

  • New Member
  • *
  • กระทู้: 3
    • ดูรายละเอียด
Re: พบ Bug ในการ Edit หัวข้อครับ
« ตอบ #5 เมื่อ: 16/07/07, 00:20:39 »
เพิ่งดาวน์โหลดไปใช้งาน เจอปัญหานี้เหมือนกัน

ปัญหาเกิดจากการใช้ charset เป็น utf-8 ทำให้มีการจัดเก็บตัวอักษรเพิ่มขึ้น วิธีการแก้ปัญหาสามารถแก้ได้หลายจุด หรืออาจจะต้องแก้พร้อมๆกัน
1. ในส่วนของ database mysql ถ้าหากเป็น utf8_bin อาจจะต้องไปแก้ใน​ table "smf_messages" ​จาก​ TINYTEXT ​เป็น MEDIUMTEXT
ข้อนี้เท่ากับเป็นการขยายขนาดฟิลด์ แต่ถ้าแก้แค่นี้ก็ยังคงเหมือนเดิม นอกจากจะเปลี่ยนสคริปตามที่คุณ terdsak บอก

2. การแก้ไขในส่วนของคำสั่ง
  เปิดไฟล์  /Sources/Post.php แล้วหาบรรทัดคำสั่ง

   // Make sure the subject isn't too long - taking into account special characters.
   if ($func['strlen']($form_subject) > 100)
      $form_subject = $func['substr']($form_subject, 0, 100);

   // At this point, we want to make sure the subject isn't too long.
   if ($func['strlen']($_POST['subject']) > 100)
      $_POST['subject'] = addslashes($func['substr'](stripslashes($_POST['subject']), 0, 100));

   // Maximum number of characters.
   if ($func['strlen']($_POST['subject']) > 100)
      $_POST['subject'] = addslashes($func['substr'](stripslashes($_POST['subject']), 0, 100));

ทั้งหมด 3 จุด แล้วเปลี่ยนตัวเลขจาก 100 ให้เพิ่มขึ้นเป็นซัก 300 - 500 แทน
ตรงนี้ทำให้มีการตัดคำให้ยาวขึ้น ซึ่งจะแก้ปัญหาได้ระดับหนึ่ง แต่จะยังมีปัญหาว่าถ้าเกิดมีการตั้งหัวข้อที่ยาวมากๆๆก็จะเจอปัญหาการตัดคำไม่ลงตัว กลายเป็นมีตัวประหลาดเหมือนเดิม

ั3. เปิดไฟล์ /Themes/default/Post.template.php

ประมาณบรรทัดที่ 426
   // Now show the subject box for this post.
   echo '
                     <tr>
                        <td align="right" style="font-weight: bold;', isset($context['post_error']['no_subject']) ? 'color: red;' : '', '" id="caption_subject">
                           ', $txt[70], ':
                        </td>
                        <td>
                           <input type="text" name="subject"', $context['subject'] == '' ? '' : ' value="' . $context['subject'] . '"', ' tabindex="', $context['tabindex']++, '" size="80" maxlength="80" />

ให้เปลี่ยนค่า maxlength ให้ลดลงเหลือซัก 50

สรุปแล้วเรื่องนี้เป็นปัญหาที่เกิดกับซอฟแวร์เกือบทุกตัวที่ใช้ utf-8 ครับ

ใครมีวิธีอื่นที่ง่ายๆ ช่วยมาโพสต์แลกเปลี่ยนกันด้วยคับ


ออฟไลน์ pongsak

  • Jr. Member
  • **
  • กระทู้: 63
    • ดูรายละเอียด
Re: พบ Bug ในการ Edit หัวข้อครับ
« ตอบ #6 เมื่อ: 16/07/07, 18:03:32 »
ผมคิดว่า ในฟิลด์ subject แก้เป็น text ก็พอแล้วครับ เพราะได้ตั้ง 65535 ตัว

อ้างถึง
TINYTEXT

A character large object column with a maximum length of 255 (2^8 - 1) characters.

TEXT

A character large object column with a maximum length of 65535 (2^16 - 1) characters.

MEDIUMTEXT

A character large object column with a maximum length of 16777215 (2^24 - 1) characters.

LONGTEXT

A character large object column with a maximum length of 4294967295 (2^32 - 1) characters.

ออฟไลน์ xers

  • New Member
  • *
  • กระทู้: 1
    • ดูรายละเอียด
Re: พบ Bug ในการ Edit หัวข้อครับ
« ตอบ #7 เมื่อ: 6/11/09, 18:41:01 »
อยากขอบคุณ คุณkaazoo เลยสมัครเข้ามาครับ
แก้ปัญหาสำหรับ smf ที่อัพเกรดจากของเดิมได้
เพราะของเดิมใช้ฐานข้อมูล tis แล้วพอแปลงเป็น utf8
ทำให้เกิดโค้ดขยะ ทำให้ช่องข้อมูล tinytext เต็ม
ต้องจัดการขยายช่องเพิ่มขึ้น

เรื่องภาษาผมว่า utf8 ดีในแง่ถ้าอยากทำเว็บรองรับหลายภาษามากกว่า
เช่นภาษาที่แปลกๆไป และใช้ได้กับหลายเซิร์ฟเวอร์
ถ้าเป็นภาษาพื้นฐาน อังกฤษ ของเดิมก็รับไหวครับ
และ utf ใหญ่กว่าของเดิม tis ด้วยครับ

ปล. เห็นด้วยกับ คุณpongsak ครับ ผมใช้ text ครับ
อิอิ กลัว db บวม

ปล.2 utf8 อย่าลืมเวลาแก้ไขเสร็จก็ต้องเซฟเป็น utf8 ด้วยครับ พี่น้อง
ผมคิดว่าบางท่านอาจเผลอทำให้แก้ปัญหาเรื่องภาษาไทยใน utf8 ไม่ได้สักที
ทั้งที่แปลงฐานข้อมูลเป็น utf8 สำเร็จแล้ว แต่เวลาเรียกใช้งานก็ยัง ?????

ขอบคุณ คุณkrazoo มากเลยครับ