ปัญหา PHP อ่าน Text file (ค่าภาษาไทย) เพื่อเก็บลง MySQL
รบกวนอาจารย์แนะนำด้วยครับ......
ผมอัพโหลด textfile ไปวางบน server แล้วให้ php อ่านค่าใน text ไปเก็บใน mysql แต่พบเจอฟิลด์ที่เป็นภาษาไทย กลับได้ค่าว่าง
ตัวอย่างtext 1|36213|นายอภิชาติ|กนกสิงห์|1|2515
แต่เวลารันบน localhost กลับอ่านค่าได้เป็นปกติ
อย่างนี้มีปัญหาที่ server หรือเปล่าครับ ต้องแก้ config อะไรหรือไม่
- OS REDHAT
- PHP 5.2.5
ผมอัพโหลด textfile ไปวางบน server แล้วให้ php อ่านค่าใน text ไปเก็บใน mysql แต่พบเจอฟิลด์ที่เป็นภาษาไทย กลับได้ค่าว่าง
ตัวอย่างtext 1|36213|นายอภิชาติ|กนกสิงห์|1|2515
แต่เวลารันบน localhost กลับอ่านค่าได้เป็นปกติ
อย่างนี้มีปัญหาที่ server หรือเปล่าครับ ต้องแก้ config อะไรหรือไม่
- OS REDHAT
- PHP 5.2.5
ปัญหาอาจอยู่ที่คำสั่งที่ใช้ และ ภาษา
เช่น ถ้ามีการใช้ คำสั่งในกลุ่ม preg และใช้ UTF-8 ควรมี flag u
ไฟล์เป็น Ansi หรือ UTF-8
ถ้าไฟล์เป็น UTF-8 คำสั่งบางอันอาจไม่รองรับ อาจต้องเปลี่ยนไปใช้ฟังก์ชั่นในกลุ่ม mb เช่น mb_strpos แทน strpos (เติม mb_ หน้าฟังก์ชั่น)
$rec = fgetcsv($handle, 1024, "|")
เก็บค่าจาก array
ต้องเปลี่ยนเป็นยังไงครับ รบกวนขอแบบละเอียดครับ
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 ในข้อมูลได้ (ข้อมูลต้องไม่มีการขึ้นบรรทัดใหม่) เนื่องจากเป็นตัวคั่น เช่นกัน
เนื่องจากผมศึกษาการเขียน PHP เอง เลยไม่มีความรู้เท่าไหร่
อย่างที่อาจารย์แนะนำ ใช้ได้เลยครับ ผมเขียนอย่างนี้ครับ
$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 ครับ