Update 3-5-2011 !!!!
ให้อ่านเป็นภาษาไทยใน database ได้แล้ว
หลายๆ คนคงเจอปัญหาประมาณว่า มีข้อมูลอยู่ในไฟล์ Excel แล้วต้องการที่จะนำข้อมูลไปใช้กับ MySQL ผมก็เจอกับปัญหานี้เช่นกัน ลองมาหลายๆวิธีแล้วพบปัญหา import แล้ว error หรือไม่แสดงออกมาเป็นภาษาไทย
วันนี้ผมมีวิธีการ Import ข้อมูลจาก Excel เข้าสู่ MySQL และสามารถแสดงออกมาเป็นภาษาไทยในรูปแบบ UTF-8 แบบไม่มีปัญหาใดๆ ^^ มาเริ่มกันเลยดีกว่า
ก่อนอื่นผมมีตัวอย่างจากไฟล์ xls ดังนี้
ทำการ Save File Excel ให้เป็น CSV ก่อนดังนี้
ไปที่ File -> Save As -> OtherFormats
จากนั้นเลือก Formats เป็น CSV (Comma delimited) (*.csv)
จากนั้นทำการแปลง Encode ของไฟล์เป็น UTF-8 โดย
เปิดไฟล์ CVS ด้วย Notepad
หาก Save ถูก Formats จะพบข้อมูลดังรูป
ทำการลบข้อมูลหัวตารางออกให้เลือกแต่ข้อมูลที่เราต้องการนำไปใส่ใน MySQL
ไปที่ File -> Save As
ด้านล่างเลือก Encoding เป็น UTF-8
เข้าไปสร้างฐานข้อมูลและตารางใน MySQL ตามข้อมูลที่เราต้องการ
ตัวอย่างของผมเป็นดังนี้
สร้างฐานข้อมูลชื่อ slayer_project และเลือก MySQL connection collation: เป็น utf8_unicode_ci
สร้างตารางตามข้อมูลที่มีอยู่
จากนั้นทำการเขียน Code PHP เพื่ออ่านข้อมูลจากไฟล์ CVS ลงฐานข้อมูล MySQL
ตัวอย่าง Code ของผมเป็นดังนี้
ขอขอบคุณ Code จาก thaicreate.com
นำไฟล์ cvs ไว้ที่เดียวกับไฟล์ php เพื่อทำการ import
หากการ Import ข้อมูลไม่มีปัญหาจะขึ้นข้อความว่า Import Done.
เมื่อลองดูในฐานข้อมูลก็จะพบว่ามีข้อมูลที่เราต้องการอยู่ในฐานข้อมูลแล้ว
ลองเขียน Code ดึงข้อมูลออกมาแสดงเปิดดูในรูปแบบ UTF-8 ก็แสดงภาษาไทยได้อย่างไม่มีปัญหา ก่อนที่จะ query ข้อมูลออกมาต้อง mysql_query("SET NAMES UTF8");ก่อนด้วยครับ
ตัวอย่าง Code
ตัวอย่างข้อมูลที่แสดง
Credits : พี่ตั้ม , อ.กบ , thaicreate.com , พี่ไผ่
Link เกี่ยวข้อง : http://www.thaicreate.com/php/php-convert-csv-to-mysql.html
ให้อ่านเป็นภาษาไทยใน database ได้แล้ว
หลายๆ คนคงเจอปัญหาประมาณว่า มีข้อมูลอยู่ในไฟล์ Excel แล้วต้องการที่จะนำข้อมูลไปใช้กับ MySQL ผมก็เจอกับปัญหานี้เช่นกัน ลองมาหลายๆวิธีแล้วพบปัญหา import แล้ว error หรือไม่แสดงออกมาเป็นภาษาไทย
วันนี้ผมมีวิธีการ Import ข้อมูลจาก Excel เข้าสู่ MySQL และสามารถแสดงออกมาเป็นภาษาไทยในรูปแบบ UTF-8 แบบไม่มีปัญหาใดๆ ^^ มาเริ่มกันเลยดีกว่า
ก่อนอื่นผมมีตัวอย่างจากไฟล์ xls ดังนี้
ทำการ Save File Excel ให้เป็น CSV ก่อนดังนี้
ไปที่ File -> Save As -> OtherFormats
จากนั้นทำการแปลง Encode ของไฟล์เป็น UTF-8 โดย
เปิดไฟล์ CVS ด้วย Notepad
หาก Save ถูก Formats จะพบข้อมูลดังรูป
ทำการลบข้อมูลหัวตารางออกให้เลือกแต่ข้อมูลที่เราต้องการนำไปใส่ใน MySQL
ไปที่ File -> Save As
ด้านล่างเลือก Encoding เป็น UTF-8
เข้าไปสร้างฐานข้อมูลและตารางใน MySQL ตามข้อมูลที่เราต้องการ
ตัวอย่างของผมเป็นดังนี้
สร้างฐานข้อมูลชื่อ slayer_project และเลือก MySQL connection collation: เป็น utf8_unicode_ci
สร้างตารางตามข้อมูลที่มีอยู่
จากนั้นทำการเขียน Code PHP เพื่ออ่านข้อมูลจากไฟล์ CVS ลงฐานข้อมูล MySQL
ตัวอย่าง Code ของผมเป็นดังนี้
- //ส่วนของการเชื่อมต่อฐานข้อมูล MySQL
- $objConnect = mysql_connect("localhost","username","password") or die("Error Connect to Database"); // Conect to MySQL
- $objDB = mysql_select_db("database_name");
- //ทำการเปิดไฟล์ CSV เพื่อนำข้อมูลไปใส่ใน MySQL
- $objCSV = fopen("member.csv", "r");
- while (($objArr = fgetcsv($objCSV, 1000, ",")) !== FALSE) {
- //นำข้อมูลใส่ในตาราง member
- $strSQL = "INSERT INTO member ";
- //ข้อมูลใส่ใน field ข้อมูลดังนี้
- $strSQL .="(id,name,lastname,age,tel) ";
- $strSQL .="VALUES ";
- //ข้อมูลตามที่อ่านได้จากไฟล์ลงฐานข้อมูล
- $strSQL .="('".$objArr[0]."','".$objArr[1]."','".$objArr[2]."' ";
- $strSQL .=",'".$objArr[3]."','".$objArr[4]."') ";
- //ให้ข้อมูลอยู่ในรูปแบบที่อ่านได้ใน phpmyadmin (By.SlayerBUU Credits พี่ไผ่)
- mysql_query("SET NAMES UTF8");
- //เพิ่มข้อมูลลงฐานข้อมูล
- $objQuery = mysql_query($strSQL);
- }
- fclose($objCSV);
- echo "Import Done.";
- ?>
นำไฟล์ cvs ไว้ที่เดียวกับไฟล์ php เพื่อทำการ import
หากการ Import ข้อมูลไม่มีปัญหาจะขึ้นข้อความว่า Import Done.
เมื่อลองดูในฐานข้อมูลก็จะพบว่ามีข้อมูลที่เราต้องการอยู่ในฐานข้อมูลแล้ว
ตัวอย่าง Code
- $objConnect = mysql_connect("localhost","username","password") or die("Error Connect to Database"); // Conect to MySQL
- $objDB = mysql_select_db("database_name");
- $sql = ("SELECT * from member");
- mysql_query("SET NAMES UTF8");
- $result = mysql_query($sql);
- While($row= mysql_fetch_array($result)){
- echo "id = ".$row['id'];
- echo "name = ".$row['name'];
- echo "lastname = ".$row['lastname'];
- echo "age = ".$row['age'];
- echo "tel = ".$row['tel'];
- }
- ?>
ตัวอย่างข้อมูลที่แสดง
Link เกี่ยวข้อง : http://www.thaicreate.com/php/php-convert-csv-to-mysql.html
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
เพิ่มเข้าไปถึงจะใช้ได้ แต่แบบนี้จะมีผลต่อ security มั๊ยคะ เพราะปานนี่ต้องใช้กับระบบlogin การซื้อขายหน่ะค่ะ
แล้วจริงๆถ้าใช้งานกับ https ปกติถ้าไม่ใส่code ตัวนี้มันใช้ได้มั๊ยคะ หรือเพราะ url ที่เป็น https นี้มันเซ็ต ssl ไว้ไม่ดี ขึ้นpopup alert เตือนทุกครั้งที่เปิดเรยค่ะ
แต่ขอแสดงความคิดเห็นกับคำถามของ parnni แบบบ้านๆ ดังนี้:
>> พี่โรตีคะ แล้วถ้าจะใช้งานกับ https หล่ะคะ เคยลองใช้แล้วมันใช้ไม่ได้ เลยลองใส่
>> curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
>> เพิ่มเข้าไปถึงจะใช้ได้ แต่แบบนี้จะมีผลต่อ security มั๊ยคะ
>> เพราะปานนี่ต้องใช้กับระบบlogin การซื้อขายหน่ะค่ะ
เท่าที่ไป google ดู ในการเซต CURLOPT_SSL_VERIFYPEER ให้เป็น 0 นั้น จะเป็นการ bypass หรือการข้ามขั้นตอนการ verify ไป คือ ไม่ต้องทำการ Verify กับทาง server ที่เรา request ไป แต่การรับส่งข้อมูลระหว่างกันนั้น ยังมีการเข้ารหัสในการเชื่อมต่อกันด้วย ssl เหมือนเดิม แต่เราจะไม่รู้ ว่าเรากับลังเชื่อมต่ออยู่กับใครเท่านั้น (อ้างอิงที่นี่)
ซึ่งถ้าถามว่า จะมีผลต่อ security มั้ยนี่ ในแง่ของการป้องกันชาวบ้านมาดักดูข้อมูลระหว่างทาง ไม่น่าจะมีผลอะไร แต่ในแง่ของการยืนยันว่าเรากำลังคุยกับใครอยู่นั้น ก็คงจะมีผลบ้าง แต่ถ้าไม่ได้กังวล หรือ server ที่เราคุยไปนั้นเชื่อถือได้ ก็คงจะไม่เป็นอะไร (อันนี้ความคิดเห็นส่วนตัวน้ะคับ)
>> แล้วจริงๆถ้าใช้งานกับ https ปกติถ้าไม่ใส่code ตัวนี้มันใช้ได้มั๊ยคะ
CURLOPT_SSL_VERIFYPEER โดย default จะมีค่าเป็น 1 หรือ TRUE อยู่ (อ้างอิงที่นี่) เพราะฉะนั้นถ้าไม่ใส่ code นี้เข้าไปเพื่อเซตให้มันเป็น 0 หรือ FALSE ก็ต้องใส่ code เพื่อเซต CURLOPT_CAFILE หรือ CURLOPT_CAINFO เพื่อใส่ข้อมูลการ verify ถ้าไม่อย่างนั้น ก็คงจะไม่ผ่าน
>> หรือเพราะ url ที่เป็น https นี้มันเซ็ต ssl ไว้ไม่ดี ขึ้นpopup alert เตือนทุกครั้งที่เปิดเรยค่ะ
เท่าที่ทราบมา มันไม่เกี่ยวกับการเซต ssl ไว้ไม่ดีหรอกครับ แต่ที่มันขึ้น popup alert เข้าใจว่าเขาเซตโดยใช้ OpenSSL ซึ่งเป็นของฟรี ไม่เสียค่า licene ก็จะขึ้น popup alert อย่างนั้นแหล่ะ ถ้าไม่อยากให้มันขึ้น popup ต้องใช้ SSL แบบเสียตังค์ :)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...
ผมเคยลองเรียกแบบย้อนกลับเข้าหาโดเมนหลัก แค่นั้น
บางโฮสถึงกับนิ่งไปเลย
ผมเลยใช้ fsockopen .. ฉิวเลย
ถ้าใครคิดจะใช้ fsockopen ผมมีข้อแนะนำ 2 ข้อ
1. ถ้าลำบากเรื่องการเขียน GET POST อย่างไรถึงจะเหมาะ
หา Sniffer มาดัก Browser เลยครับ ก็อบ/แก้/วาง อิๆ
2. ระวังเรื่อง Connection ด้วย ผมเคยเผลอก็อบ keep-alive มา
ถึงกับนิ่งเลย เลยต้องมาใช้ Connection: Close
สคริปถึงจะทำงานต่อครับ
ถ้าจะใช้แบบ low-level แบบนี้ นักพัฒนาก็ต้องมีความรู้เยอะหน่อย รู้ว่าอะไรไปยังงัย มายังงัย ซึ่งจะทำให้เราสามารถควบคุมทุกอย่างไว้ได้ แต่ ... อย่างหนึ่งที่น่าคำนึงต่อหน่อย (อย่างปัญหาที่ผมพบอยู่บ่อยๆ) คือว่า หลังๆ มาชักเริ่มไม่แน่ใจว่า standard มันเป็นยังงัยกันแน่ แล้วก็ถ้าเราใช้ tools เข้ามาช่วยเหมือนที่คุณ EThaiZone แนะนำ เช่น Sniffer อย่างนี้ก็ดีน้ะคับ แต่ว่า ถ้าเกิดเราทำงานกับ server หลายๆ ที่เช่น ต้องเขียน app. คุยกับ operator ซึ่งบ้านเรามีอยู่ 3 เจ้าหลัก คือ AIS, DTAC และ TRUEMOVE (อันนี้บ่นจากประสบการณ์ตรง อิอิ) ถ้าทั้งสามเจ้านี้ ต้องเขียน post ไปคนละแบบ อย่างน้อยๆ เราก็ต้องมี 3 เงื่อนไข และทั้งนี้ทั้งนั้น ถ้าทั่นๆ ทั้ง 3 operator นี้เปลี่ยนระบบ หรือ upgrade ระบบ เราก็ต้องมานั่งทดลองกันใหม่ ในบางครั้ง ผมจึงเลือกใช้ tools หรือ lib ที่มีออกมาเช่น curl นี้ ซึ่งถ้าเทียบกับความเร็วที่ช้าลง แต่จะได้ความไวในการพัฒนามาแทน ผมว่ามันก็คุ้มน้ะครับ
แต่ทั้งนี้ทั้งนั้น ก็คงจะ แล้วแต่ลักษณะของงานเป็นหลัก ว่าอะไรควร อะไรไม่ควร :)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...
สำหรับการรับข้อมูล เช่นข้อมูล xml ซึ่งปกติจะถูกส่งมาด้วย POST สามารถรับได้ด้วยตัวแปล HTTP_POST_RAW_DATA แต่ทางผู้ส่ง ต้องระบุ content-type มาด้วย และต้องไม่เป็น mulitpart/form-data
หรืออีกวิธี ลองใช้
ob_start(); readfile("php://input"); $rawData = ob_get_clean(); ?>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...
ตัว app เขียนแบบนี้ค่ะ
$urlWithProtocol = "http://ip:port/app";
$request = "";
$isRequestHeader = false;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlWithProtocol);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_HEADER, (($isRequestHeader) ? 1 : 0));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
print_r($response);
ซึ่งเมื่อรันแล้ว ไม่แสดงค่าอะไรเลยน่ะค่ะ เป็นหน้าจอว่างๆ..
สำหรับตัว $urlWithProtocol ลองใส่ 2 url ค่ะ urlนึงแสดงผล อีกตัวไม่แสดงผล เลยงงว่า เกิดจากอะไรค่ะ
>> ขอสอบถามเพิ่มเติมค่ะสำหรับการรับข้อมูล เช่นข้อมูล xml ซึ่งปกติจะถูกส่งมาด้วย POST
ปกติแล้ว ฝั่ง server ที่ response ข้อมูลมาให้ เช่นข้อมูล xml ที่พูดถึงกันอยู่นี้ ผมเรียกว่า "response ข้อมูลมา" เพราะว่า ทาง server เขาจะไม่ได้ "ส่งมาด้วย POST" คือเขาแค่ response หรือ return ข้อมูลกลับมา เพื่อเป็นการตอบสนอง request ของ client
ถ้าจะพูดให้ถูก น่าจะต้องบอกว่า:
>> ขอสอบถามเพิ่มเติมค่ะสำหรับการรับข้อมูล เช่นข้อมูล xml ซึ่งทางผู้ให้บริการ หรือ server จะรับ request ด้วย POST method และจะ response ข้อมูลกลับมา ในรูปแบบของ xml
ตอบคำถามต่อ :)
จากข้อมูลที่ให้มานี้ ขอแยกออกเป็น 3 ประเด็น
[1] >> $request = "";
ตรงนี้ ไม่รู้ว่าเป็น request ที่ถูกต้องหรือไม่ อย่างไร เช่น ทาง server ยอมให้ request โดยที่ไม่ส่งข้อมูลอะไรไป ได้หรือไม่ อย่างไร แต่ทั้งนี้ ทั้งนั้น server ที่ดี ก็ควรจะ ตอบสนองต่อ request ที่มีเข้ามา ไม่ว่าข้อมูลจะถูกต้องตาม protocol ที่ server กำหนดหรือไม่ก็ตาม
[2] >> ซึ่งเมื่อรันแล้ว ไม่แสดงค่าอะไรเลยน่ะค่ะ เป็นหน้าจอว่างๆ..
การที่หน้าจอว่างๆ อาจจะเกิดจาก response ที่ได้รับมาเป็น xml และเป็น tag ที่ browser ไม่รู้จัก ก็เลยไม่ได้แสดงผลออกมาก็ได้น้ะครับ เช่น เขาอาจจะ response กลับมาเป็น
[3] >> สำหรับตัว $urlWithProtocol ลองใส่ 2 url ค่ะ urlนึงแสดงผล อีกตัวไม่แสดงผล เลยงงว่า เกิดจากอะไรค่ะ
อันนี้ ก็คงตอบอะไรไม่ได้มาก เพราะไม่รู้ protocol ของทั้ง 2 urls นี้ ว่าเหมือน หรือแตกต่างกันยังงัย แต่ถ้าจะให้เดา ก็คงเป็นเรื่องของการจัดการ request ที่เข้ามา เช่น url แรกที่แสดงผล อาจจะจัดการ request และ response ดีกว่า จึงแสดงผล แต่อีก url นั้นไม่
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...
$request = "";
นี่แหล่ะ ว่าทาง server เค้ายอมให้ request ด้วยข้อมูลว่างๆ ได้หรือไม่ อย่างไร
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...
ถ้าเข้าใจไม่ผิด มันคือ ตัว bot หรือ engine ที่จะไปดูดเอา web document (หรือ html document หรือ xhtml document หรือ rss document หรืออื่นๆ) มาจาก web site ต่างๆ แล้วเอา web document มาประมวลผล อาจจะเอามาจัด indexing สำหรับทำ search engine หรืออื่นๆ ใช่ป่ะคับ ??
ถ้าใช่ ...
การนำ curl ใน php มาใช้ในการทำ web spider นั้น สามารถนำมาช่วยได้ ในขั้นตอนการ ดูด (get, fetch แล้วแต่จะเรียก แต่ไม่รู้ว่าศัพท์ทางการเขาเรียกอะไร) web document มา ซึ่งก็สะดวกมากด้วย
แต่ขั้นตอนการประมวลผล web document นั้นคิดว่า curl ไม่มี function อะไรที่จะมาช่วย (เพราะมันถูกสร้างขึ้นมาเป็น web client ไม่ใช่ string processor) เราคงจะต้องเขียนโปรแกรม เพื่อมาประมวลผล และจัดการต่อเองครับ
สำหรับตัวอย่าง ของการเอา curl มาทำแบบนี้ ผมไม่มีเหมือนกัน แต่ว่า ถ้าจะเอามันมาทำหน้าที่ดูด web document ตัวอย่างข้างต้นนี้ ก็น่าจะใช้ได้น้ะคับ
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...
$urlWithoutProtocol = "www.example.com:80/someServices"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $urlWithoutProtocol); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); curl_close($ch); echo $response; ?>