Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,037

HOME > PHP > PHP Forum > ระหว่าง / คำสั่งนี้อะไรดีกว่ากันครับ แล้วปัญหาที่ตามมา อย่างไหนดีกว่า



 

ระหว่าง / คำสั่งนี้อะไรดีกว่ากันครับ แล้วปัญหาที่ตามมา อย่างไหนดีกว่า

 



Topic : 095888



โพสกระทู้ ( 376 )
บทความ ( 0 )



สถานะออฟไลน์




คือผม insert ข้อมูลเข้าไป และต้องการ ไอดีของข้อมูลที่ต้องการ ถ้าใช้ mysql_insert_id(); เฉยๆ เวลา insert พร้อมกันอาจจะเกิดปัญหาได้ เพราะ mysql_insert_id(); มันแสดง id ล่าสุด

และระหว่าง lock table ไปเลย จนกว่าจะ insert เรียบร้อย กับ insert ปกติ แล้วนำค่าที่ เพิ่มเข้าไป มาเปรียบเทียบแล้วคิวรี่ผลของ ไอดีออกมา แบบไหนกีกว่าครับ หรือมีวิธีแบบอื่นๆอีก แนะนำหน่อยน่ะครับ


Code (PHP)
mysql_query("LOCK TABLES Product WRITE"); // lock
   mysql_query("SET AUTOCOMMIT = 0");
   mysql_query("INSERT INTO Product (ID_Dosage, Name_Product) VALUES ('".trim($_POST['ID_Dosage'])."','".trim($_POST['Name_Product'])."')"); // คำสั่ง insert ข้อมูล
   $Product = mysql_insert_id(); // id ที่ insert เข้าไป
   mysql_query("COMMIT");
   mysql_query("UNLOCK TABLES"); // unlock


Code (PHP)
mysql_query("INSERT INTO Product (ID_Dosage,Name_Product) VALUES ('".trim($_POST['ID_Dosage'])."','".trim($_POST['Name_Product'])."')");
  $result= mysql_query("SELECT ID_Product FROM Product WHERE ID_Dosage='".trim($_POST['ID_Dosage'])."' 
  AND Name_Product='".trim($_POST['Name_Product'])."' ");
  $stuff = mysql_fetch_array($result);
	
  $Product = $stuff["ID_Product"];




Tag : PHP, MySQL







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2013-05-30 16:30:01 By : cappuczino View : 1155 Reply : 11
 

 

No. 1



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



สถานะออฟไลน์
Facebook Blogger

ผมใช้วิธีที่ 2 ครับ
สร้าง temp_id (เป็นฟิลด์ที่กำหนดให้ต้องมีทุกตาราง)
เก็บค่าที่ไม่ซ้ำ หลังจากบันทึกเสร็จ ก็ใช้เป็นเงื่อนไขดึง auto id ออกมา
หรืออ้างอิง auto id เพื่อคำนวนเลขที่เอกสารต่อจากเอกสารก่อนหน้า

ใช้เสร็จก็เคลียร์ temp_id
ยุ่งยากหน่อย แต่ปลอดภัยครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-05-30 17:00:53 By : {Cyberman}
 


 

No. 2



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ไม่ใช่ครับ 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
 

 

No. 3



โพสกระทู้ ( 376 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 1 เขียนโดย : {Cyberman} เมื่อวันที่ 2013-05-30 17:00:53
รายละเอียดของการตอบ ::
temp_id สร้าง แล้ว เครีย ยังไงอ่ะครับ มีตัวอย่างมั้ยครับ

ถ้าแบบที่ผมนึกออกคือ สร้างฟังค์ชั้นสุ่มตัวเลขสักชุด แล้ว insert เข้าไปในฐานข้อมูล แล้วค่อยเอาตัวเลขที่สุ่มมาเปรียบเทียบ แล้วดึงค่าออกมา แต่ของคุณมีเครียค่า id ด้วย เครียนี่คือ หลังจาก ดึงข้อมูลที่ต้องการเรียบร้อยให้ลบข้อมูลในฟิลนั้น ออกใช่แบบนี้หรือเปล่าครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-05-30 17:06:01 By : cappuczino
 


 

No. 4



โพสกระทู้ ( 376 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 2 เขียนโดย : cookiephp เมื่อวันที่ 2013-05-30 17:02:32
รายละเอียดของการตอบ ::
อ่อ ขอบคุณครับ พอดีผมไปอ่านเจอตามเว็บอื่นมา ว่าอาจจะมีปัญหาได้ ถ้า insert พร้อมๆกันหลายคน

ขอบคุณครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-05-30 17:08:16 By : cappuczino
 


 

No. 5



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 4 เขียนโดย : cappuczino เมื่อวันที่ 2013-05-30 17:08:16
รายละเอียดของการตอบ ::
เว็บไหนเหรอครับ
ขออ้างอิงหน่อย เผื่อผมพลาดอะไรไป
แต่ผมทดสอบแล้วครับ คือผมเคยคิดเรื่องนี้เหมือนกัน เมื่อนานมาแล้ว เลยทำการทดสอบไป
และก็ใช้มาตลอด ไม่เคยมีปัญหาครับ



ประวัติการแก้ไข
2013-05-30 17:13:21
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-05-30 17:12:35 By : cookiephp
 


 

No. 6



โพสกระทู้ ( 376 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 5 เขียนโดย : cookiephp เมื่อวันที่ 2013-05-30 17:12:35



ประวัติการแก้ไข
2013-05-30 17:17:37
2013-05-30 17:18:39
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-05-30 17:16:56 By : cappuczino
 


 

No. 7



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



สถานะออฟไลน์
Facebook Blogger

ตอบความคิดเห็นที่ : 2 เขียนโดย : cookiephp เมื่อวันที่ 2013-05-30 17:02:32
รายละเอียดของการตอบ ::
เห็นภาพชัดมากครับ ^^"
ว่าแต่ ทำไมเขาถึงว่าจะเกิดกรณีบันทึกพร้อมกันหลายเว็บจังเลยครับ
ผมก็ไปอ่านเจอมา เลยตื่นตูมก่ะเขาด้วย เพราะไม่เคยเห็นวิธีพิสูจน์อย่างจริงจัง

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-05-30 17:19:44 By : {Cyberman}
 


 

No. 8



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 6 เขียนโดย : cappuczino เมื่อวันที่ 2013-05-30 17:16:56
รายละเอียดของการตอบ ::
ผมว่าคนเขียนบทความนั้นคงไม่เคยทดสอบหรือหาข้อมูลยืนยันครับ คงคิดเอาเองว่าน่าจะเป็นอย่างนั้น


ในคู่มือของ mysql เองก็มีบอกไว้ครับ
http://dev.mysql.com/doc/refman/5.0/es/mysql-insert-id.html

The value of mysql_insert_id() is affected only by statements issued within the current client connection. It is not affected by statements issued by other clients.
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-05-30 17:24:17 By : cookiephp
 


 

No. 9



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

จริงครับ mysql_insert_id() มันฉลาดพอที่จะ return ให้กับ connection นั้น ๆ ครับ และผมก็คิดว่าคนเขียนเองก็คิดโจทย์นี้ตั้งแต่แรกอยู่แล้วครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-05-30 17:27:14 By : mr.win
 


 

No. 10



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 7 เขียนโดย : {Cyberman} เมื่อวันที่ 2013-05-30 17:19:44
รายละเอียดของการตอบ ::
ผมไม่เคยเจอเลยนะครับ บทความต่างประเทศที่เขียนบอกอย่างนั้น

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-05-30 17:30:12 By : cookiephp
 


 

No. 11



โพสกระทู้ ( 376 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 10 เขียนโดย : cookiephp เมื่อวันที่ 2013-05-30 17:30:12
รายละเอียดของการตอบ ::
ตอนแรกที่ผมใช้ ตัวนี้ ก้ไม่คิดว่า คำสั่นนี้มันจะ ทำงานแบบนั้นน่ะ ที่เรียกดูไอดีล่าสุดในเทเบิ้ลนั้นๆ ดูมันไม่ได้มาตราฐาน หรือ อ่อนเกินไป แต่พอมาเจอบทความเลยสงสัย + ผมไม่ได้ดูของต่างประเทศด้วย

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-05-31 08:53:02 By : cappuczino
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : ระหว่าง / คำสั่งนี้อะไรดีกว่ากันครับ แล้วปัญหาที่ตามมา อย่างไหนดีกว่า
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่