ข้อพึงระวัง ในการใช้ PDO Transaction กับ auto_increment

ผมมีปัญหาเกี่ยวกับการใช้ transaction ซึ่งเดิมผมสร้าง table ไว้ 3 ตาราง เป็น MyISAM แต่ตอนหลังพบปัญหาข้อมูลไม่ถูกต้อง จึงเปลี่ยนเป็น InnoDB เพื่อทำ foreign key เชื่อมกัน ปัญหาที่พบคือ บางครั้ง INSERT ข้อมูลไปแล้วทั้ง 3 ตารางพร้อมกัน ข้อมูลมันติดค้างอยู่ใน transaction ซักพักก็ rollback ออกมา ทั้งที่ได้ข้อมูลครบถ้วนทุกอย่าง (พอ insert ผมลอง select ดู ซึ่งเท่าที่คิดน่าจะไป select จากใน trancaction ออกมาแสดง ) ปัญหานี้ทำให้ field ที่เป็น PK {auto increment} เลขมันรันต่อไปแล้ว แต่ record กลับไม่มี ปัญหาต่อมาคือ try INSERT ไปแล้ว ไม่แจ้ง error …

วิธีแก้ MySQL ERROR 1451,1452 Cannot add or update a child row: a foreign key constraint fails

หรืออะไรก็ตามที่มันจะแจ้งว่า a foreign key constraint fails การที่เราสร้าง foreign key ขึ้นมานั้น ตารางที่เราเชื่อมกัน (relation) จะต้องมีข้อมูลที่สัมพันธ์กัน! e.g. ตาราง employee มี {id, name, position} id เป็น PK  ตาราง emp_position มี {pos_id, pos_name} pos_id เป็น PK เราต้องการทำ employee.position เป็น FK ของ emp_position ข้อมูลที่เรามีนั้น จะต้องสัมพันธ์กันดังนี้ * ถ้าเพิ่มข้อมูล {1,’myname’, 1} ในตาราง employee ค่า 1 คือ FK ที่เราสร้างไว้ ถ้ามันพบค่า 1 ใน pos_id ของตาราง emp_position …

How to copy folder MySQL InnoDB for backup

ถ้าใครไม่เจอกับตัว จะไม่รู้เลยว่า เหตุการณ์นี้มันทำให้เราอกสั่นขวัญกระเจิงขนาดไหน สืบเนื่องมาจาก กระทู้เก่าของผมที่ถามว่าไว้ — เดิมทีเครื่องที่ผมใช้จะติดตั้ง XAMPP 1.8.1 ไว้ ทีนี้ผมต้องการทดสอบ PHP 5.5 เลยติดตั้งตัว XAMPP 1.8.3 มาใหม่ เมื่อผม copy ไฟล์ใน mysql/data ไว้แล้ว จากเดิมที่เคยเอาแค่ folder ฐานข้อมูลไปใส่ ก็ใช้งานได้แล้ว แต่ปัญหามันเกิดตรงนี้ครับ มันมีบาง table เป็น MyISAM และบาง table ก็เป็น InnoDB ซึ้งตอนที่สร้างนั้นผมไม่ได้สังเกตุ เพิ่งจะมาเห็นก็ตอนมีปัญหานี่แหละ แบบ MyISAM มันจะมีไฟล์ 3 ไฟล์ คือ .frm .MYD และ . MYI ส่วน InnoDB มันมีแค่ .frm ไฟล์เดียวเท่านั้น หลังจากผมคัดลอกใส่แล้ว ผลปรากฏว่า …

mysql_query และ mysql_db_query กำลังจะถูกโล๊ะทิ้ง

mysql_db_query() เพิ่งรู้นี่แหละว่า ไอ้ฟังชั่นนี้มันถูกยกเลิกไป ทั้งๆ ที่ตัวเองก็ไม่เคยใช้มันหรอก เพราะไม่เห็นความจำเป็นอะไรต้องใช้มันเลย เคยเห็น code ของหลายคน ที่เคยเอามาให้ดู พอเห็นเขาใช้ mysql_db_query() ผมก็ถามกลับไปว่า “ทำไมใช้ตัวนี้?” ผลก็คือ เขาก็ตอบไม่ได้ เพราะ อ. สอนมาอย่างงี้ หรือ ลอกมาแบบนี้ เลยไม่รู้ว่าทำไมถึงใช้แบบนี้ สุดท้ายเลยเป็นการใช้แบบผิดๆ ฟังชั่น mysql_query กับ mysql_db_query มันก็เหมือนกัน แต่ต่างกันตรงที่ จำนวน Database ที่ใช้อยู่ ณ ขณะนั้น mysql_query ( string $query [, resource $link_identifier = NULL ] ) ใช้ในการ query ข้อมูลจาก DB ปัจจุบัน ที่เราได้ mysql_select_db() เอาไว้ คือเป็นการจองพื้นที่ในระบบ สำหรับการเรียกใช้ …

1130 – Host ‘xxxx.local’ is not allowed to connect to this MySQL

How to Allow MySQL Client to Connect to Remote MySQL server สืบเนื่องจากเคยแนะนำโปรแกรม NaviCat ไปแล้ว คราวนี้หากใครเจอปัญหาข้างต้น ให้รู้เลยว่า สิทธิ์การเข้าถึง ของ user ที่เราใช้ มันไม่พอจะ connect เข้าไปได้ วิธีการแก้ไขก็คือ   คำอธิบาย GRANT คือคำสั่งสั่งหรับเพิ่ม user ใหม่ให้กับ mysql ALL คือ การให้สิทธิ์ทุกอย่าง ทั้ง Global ทั้ง user และ table ให้กับ user ชื่อนี้ *.* คือ ทุกฐานข้อมูล ทุกตาราง to คือ ให้กับ newuser คือชื่อผู้ใช้ที่ต้องการกำหนด หรือใช้ user เดิมก็ได้ครับ …

function php เปลี่ยนวันที่เป็นภาษาไทย

วันนี้นึกครึ้มมารื้อ function เก่าๆ มาเจอกันนี้เข้าก็เลยเปลี่ยนใหม่ซะเลย เดิมทีใช้ swich case มาเป็นตัวเช็คชื่อเดือน ตอนหลังมาเปลี่ยนเป็น array ดีกว่า จะได้ลดการเช็คเงื่อนไขไป มาดูตัวอย่างกันเลย $format = ใช้เช็คว่า เราจะใช้ ชื่อเดือน แบบไหน ถ้า 0 ก็จะเป็นแบบเต็มๆ ถ้า 1ก็จะเป็นแบบย่อๆ สามารถใสเพิ่มได้เป็น 2 3 4 จะให้รูปแบบเดือนเป็นแบบไหนก็ตามแต่ใจต้องการ $clock = ค่า true, false ว่าจะให้แสดงเวลาหรือไม่ ถ้าใช่ก็ใส่ true ถ้าไม่ใช้ก็ใส่ false การเรียกใช้ก็ง่ายๆ แบบนี้ $youdatetime ในที่นี้เอามาจาก MySQL ครับ จะมีรูปแบบดังนี้ YYYY-MM-DD HH:II:SS thai_date($yourdatetime, 1,false);