ระหว่าง / คำสั่งนี้อะไรดีกว่ากันครับ แล้วปัญหาที่ตามมา อย่างไหนดีกว่า
ผมใช้วิธีที่ 2 ครับ
สร้าง temp_id (เป็นฟิลด์ที่กำหนดให้ต้องมีทุกตาราง)
เก็บค่าที่ไม่ซ้ำ หลังจากบันทึกเสร็จ ก็ใช้เป็นเงื่อนไขดึง auto id ออกมา
หรืออ้างอิง auto id เพื่อคำนวนเลขที่เอกสารต่อจากเอกสารก่อนหน้า
ใช้เสร็จก็เคลียร์ temp_id
ยุ่งยากหน่อย แต่ปลอดภัยครับ
Date :
2013-05-30 17:00:53
By :
{Cyberman}
ไม่ใช่ครับ mysql_insert_id() แสดง id ที่ INSERT ล่าสุดของ "request นั้นๆ ครับ" ไม่ใช่ของทั้งตาราง
ใช้ mysql_insert_id() ได้เลยครับ ไม่ต้องล็อกตารางด้วย
ลองดูตัวอย่างนี้
insert1.php
<?php
mysql_connect('localhost', 'root', '');
mysql_select_db('testdb');
mysql_query("INSERT INTO `test_table` (`creation_date`) VALUES (NOW())");
sleep(10);
echo mysql_insert_id();
insert2.php
<?php
mysql_connect('localhost', 'root', '');
mysql_select_db('testdb');
mysql_query("INSERT INTO `test_table` (`creation_date`) VALUES (NOW())");
echo mysql_insert_id();
ตัวอย่างข้างบน หากมีข้อมูลในตาราง id ล่าสุดอยู่ที่ 5
เรียก insert1.php ให้ทำงาน หลังจาก INSERT แล้ว ตรงนี้ id ที่ INSERT ไปคือ 6
แต่ insert1.php จะหยุดทำงานเป็นเวลา 10 วินาทีด้วยคำสั่ง sleep(10)
ระหว่าง 10 วินาทีนั้นหากเราเรียก insert2.php
ก็จะ INSERT และ mysql_insert_id() จะแสดง 7
เพราะ insert1.php ได้ INSERT ข้อมูลไปก่อนหน้าแล้ว
แต่พอ insert1.php ครบ 10 วินาที
mysql_insert_id() ใน insert1.php จะแสดง 6 ไม่ใช่ 7
แม้ insert2.php ได้ INSERT ข้อมูลเพิ่มไประหว่างที่ insert1.php sleep() อยู่ก็ตาม
เขาถึงมีฟังก์ชั่นนี้ออกมาให้ใช้ไงล่ะครับ เขาป้องกันปัญหา race condition ไว้แล้ว
ประวัติการแก้ไข 2013-05-30 17:05:15
Date :
2013-05-30 17:02:32
By :
cookiephp
จริงครับ mysql_insert_id() มันฉลาดพอที่จะ return ให้กับ connection นั้น ๆ ครับ และผมก็คิดว่าคนเขียนเองก็คิดโจทย์นี้ตั้งแต่แรกอยู่แล้วครับ
Date :
2013-05-30 17:27:14
By :
mr.win
Load balance : Server 05