การแก้ปัญหา mysql_insert_id() ไม่คืนค่า record ที่ insert อย่างถ

ปัญหาคำสั่ง mysql_insert_id() ไม่คืนค่า record ที่ insert เข้าไปอาจเกิดขึ้นได้ครับ หากเกิดการ insert ข้อมูลพร้อมๆกัน มากกว่า 1 ครั้ง (อาจเกิดโดย user ที่ online คนละคนกัน) ซึ่งปัญหานี้มีวิธีแก้ไขครับ ผมเสนอไป 2 วิธีละกัน

วิธีแรก ทำการ lock ตารางก่อนการ insert ครับ ป้องกันการ insert ซ้ำเพื่อให้ mysql ทำการจัดการคำสั่งแรกให้เสร็จก่อน แล้วถึงค่อยทำคำสั่งต่อไป วิธีนี้ควรทำการ lock ตารางตั้งแต่คำสั่งแรกจนสิ้นสุดกระบวนการแล้วค่อยปลดล๊อคนะครับ
<?php
   mysql_query("LOCK TABLES tablename WRITE"); // lock
   mysql_query("SET AUTOCOMMIT = 0");
   mysql_query("INSERT INTO tablename (field1, field2) VALUES ('value1',value2)"); // คำสั่ง insert ข้อมูล
   $insert_id = mysql_insert_id(); // id ที่ insert เข้าไป
   mysql_query("COMMIT");
   mysql_query("UNLOCK TABLES"); // unlock
?>


วิธีที่ 2 กำหนดคีย์ เพื่อใช้ในการตรวจสอบ โดยการสุ่มตัวอักษร แล้ว insert ไปพร้อมกันครับ หลังจากนั้นให้อ่าน id ที่ insert จากคีย์นี้ครับ
<?php
  $key = rndname(32); // สร้างตัวอักษรสุ่ม
  mysql_query("INSERT INTO tablename ('field1', 'field2', 'hash') VALUES ('value1','value2',$key)"); // เก็บตัวอักษรที่สุ่มลงไปพร้อมกับข้อมูลที่บันทึก
  $result= mysql_query("SELECT id FROM tablename WHERE hash='$key' ORDER BY id DESC LIMIT 1"); // อ่าน id โดยค้นหาจาก key ที่เก็บไว้
  $stuff = mysql_fetch_assoc($result);
  $insert_id =$stuff[id]; // id ที่ insert เข้าไป
?>
ผู้เขียน goragod โพสต์เมื่อ 17 พ.ย. 2552 เปิดดู 12,722 ป้ายกำกับ SQLMySQL
^