A-AA+then

ปัญหา PHP อ่าน Text file (ค่าภาษาไทย) เพื่อเก็บลง MySQL

3,443
รบกวนอาจารย์แนะนำด้วยครับ......

  ผมอัพโหลด textfile ไปวางบน server แล้วให้ php อ่านค่าใน text ไปเก็บใน mysql  แต่พบเจอฟิลด์ที่เป็นภาษาไทย กลับได้ค่าว่าง 

    ตัวอย่างtext  1|36213|นายอภิชาติ|กนกสิงห์|1|2515

    แต่เวลารันบน localhost กลับอ่านค่าได้เป็นปกติ

   อย่างนี้มีปัญหาที่ server หรือเปล่าครับ ต้องแก้ config อะไรหรือไม่
           - OS REDHAT
           - PHP 5.2.5
 

5 ความคิดเห็น

ไม่น่าเกี่ยวกับ Server....

ปัญหาอาจอยู่ที่คำสั่งที่ใช้ และ ภาษา

เช่น ถ้ามีการใช้ คำสั่งในกลุ่ม preg และใช้ UTF-8 ควรมี flag u

ไฟล์เป็น Ansi หรือ UTF-8

ถ้าไฟล์เป็น UTF-8 คำสั่งบางอันอาจไม่รองรับ อาจต้องเปลี่ยนไปใช้ฟังก์ชั่นในกลุ่ม mb เช่น mb_strpos แทน strpos (เติม mb_ หน้าฟังก์ชั่น)
1

ผมใช้คำสั่ง
$rec = fgetcsv($handle, 1024, "|")
เก็บค่าจาก array

ต้องเปลี่ยนเป็นยังไงครับ  รบกวนขอแบบละเอียดครับ
2

จะใช้ฟังก์ชั่นอะไร ก็ขึ้นกับรูปแบบของข้อความในไฟล์ครับ โดยปกติก็ใช้ฟังก์ชั่นในกลุ่ม string ครับ เช่น

explode()

split()

preg_match()

และ อื่นๆ อีกมากมาย

แต่สิ่งที่สำคัญคือ ต้องกลับไปดูว่า ข้อมูลในไฟล์มีลักษณะเช่นไร ใช้ อะไรเป็นตัวคั่นระหว่างฟิลด์ และ ใช้อะไรเป็นตัวคั่นระหว่าง record ถ้าคิดจะใช้ฟังก์ชั่นในกลุ่มใด ตอนสร้างไฟล์นั้นๆขึ้นมา ก็ต้องควบคุมรูปแบบของข้อความให้เป็นไปตามต้องการด้วย

ผมยกตัวอย่างนะ ข้อมูล

a|b|c|d\n
a2|b2|c2|d2\n

ข้อมูลด้านบน คั่นแต่ละฟิลด์ ด้วย | และ คั่นแต่ละ record ด้วย \n (รหัสขึ้นบรรทัดใหม่) การแยกออกก็จะใช้ฟังก์ชั่นแบบนี้

foreach(file('data.dat') AS $row) {
  $datas[] = explode('|', $row);
}
print_r($datas);

ปัญหาที่สำคัญของข้อมูลด้านบน คือ 
1. ไม่สามารถใช้ | ในข้อมูลได้ เนื่องจากเป็นตัวคั่น
2. ไม่สามารถใช้ \n ในข้อมูลได้ (ข้อมูลต้องไม่มีการขึ้นบรรทัดใหม่) เนื่องจากเป็นตัวคั่น เช่นกัน
3

ขอบคุณมากครับ ได้ความรู้เพิ่มมากเลยครับ

เนื่องจากผมศึกษาการเขียน PHP เอง เลยไม่มีความรู้เท่าไหร่
4

    อย่างที่อาจารย์แนะนำ ใช้ได้เลยครับ  ผมเขียนอย่างนี้ครับ
     
    $file="person.txt";
    foreach(file($file) AS $row) {
         $arr = explode('|', $row);
         $arr_num = count($arr);
         for ($j=0; $j < $arr_num; $j++) {
              echo "$arr[$j] ";
         }
         echo "<br>";
     }
     
    ใช้  explode แทน  fgetcsv ครับ
    
     

5
^