ท่านใดเคยเขียนเว็บที่มีการอัพเดทข้อมูลบน SQLถี่ๆเช่นเว็บเกี่ยวกับเงินบ้างครับ +1

เริ่มโดย nat-ns, 28 มิถุนายน 2016, 18:27:26

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

kingofdollars

พอดีผมไม่ได้เล่น Windows เลยไม่มี Exel ให้ทำ  เอางี้นะครับ ผมจะลองทำหัว ตารางให้ คร่าวๆ  พร้อม ข้อมูล


Table  USer

ID , NAME , BALANCE, INFO (Balance HASH), BALANCE2, INFO2 (Balance HASH), Register Date, STATUS, etc

1 : SYSTEM : 997,000 : XX34HASK2KXD : 1,000,000 :5OL9XHSDS : 2016-06-20 : 1
2 : A : 1000 : 5Ks9zLKDkd : 0 : SKSIKSF3343S :2016-06-28 : 1
3 : B : 2000 : XISLSsJSxXId : 0 : DKXODSLD : 2016-06-29 : 1

ใช้ชื่อ Field ของ Hash balance ให้เป็นชื่อที่เดาไม่ได้ เขาจะได้ไม่รู้ว่าอะไร
HASH INFO เอา UID + BALANCE + Register Date + Salt เป็นต้น
HASH INFO2 เอา UID + BLANCE2 + Register Date + Salt เป็นต้น   <---- yesterday balance


(A) Table Transaction แบบรวม แต่เวลาจะเอารายการของคนรับมาแสดง จะ Query ยากนิดนึง

ID, UID_Send, UID_Receive,  AMOUNT , HASH , DATE .....
1001 : 1 : 2 :  1,000 :  ASKDISD####$SDS : 2016-06-30
1002  : 1 : 3 : 2,000 : SKDFDISKD : 2016-06-30

(B) Table Transaction แบบแยก  แสดงรายการใคร ก็ query เฉพาะ User นั้นๆ

ID , UID , RID, XID . AMOUNT SEND, AMOUNT RECEIVE , HASH , XHASH , DATE ...
1001 : 1 : 2 : 1002 : 1,000 : 0 : DFDKFDSOSd : OSKX#S : 2016-06-30
1002 : 2 : 1 : 1001 : 0 : 1,000 : SKDIEX#SDK :OSKX#S :2016-06-30
1003 : 1 : 3 : 1004 : 2,000 : 0 : SKDI#DSDK : PLXI#SD : 2016-06-30
1004 : 3 : 1 : 1003 : 0 : 2,000 : SDK#SDDdk : PLXI#SD : 2016-06-30

HASH ธรรมดา เอาไว้ตรวจสอบ ยอดเงิน โอนให้ใครเมื่อไหร่ อย่าลืมใส่เกลือ
XHASH เอาไว้จับคู่ เอา HASH ตะกี้มาใส่อะไรเพิ่ม เช่น + UID Send + UID Receive + เกลือ



แบบหลังจะเห็นว่า ที่ ID 1001 เรารู้ได้อย่างไรถึง ID ล่วงหน้า ความจริงก็ Autorun เรารู้อยู่แล้วว่าเป็น ID อะไร แต่อย่างผมกันเหนียว ผมเก็บ
Transaction  ID เอาไว้ได้ เพราะต้องเอาไว้ลง row ใหม่อยู่แล้ว แล้วค่อยกลับไปอัพเดท row ที่แล้ว เพราะไม่แน่ว่า สองรายการเข้ามาพร้อมกัน คือการสร้าง row โอนออกพร้อมกัน row ฝั่งรับ อาจจะไม่ได้ run ลำดับนะครับ ต้องเก็บ id เอาไว้ก่อนแล้วค่อย update ทีหลัง

จินตนาการลำดับการโอนของ user ว่ากลายเป็น 1 -> 2, 1 -> 3 , 3 -> 1 , 2 -> 1 ก็เป็นได้ หวังว่าคงเข้าใจนะครับไม่งั้นการ อ้างอิงมั่วแน่

แบบนี้เวลาเราแสดงประวัติการโอนของ USER ID 1  เรา query ของ UID =1 เราก็เห็นว่าใครโอนให้ใคร เท่าไหร่ ได้เลย admin ก็ dril down จับคู่ได้ทันทีว่าคู่ไหน

____________
คราวนี้ เพื่อให้ระบบแม่นยำ คุณก็ทำทั้ง 2 Table แต่ Table แบบแรก ไม่เอาไปคำนวน Balance เอาไว้เก็บอ้างอิงเฉพาะแต่ละวัน ครบ  1 เดือนลบที

พอเจอว่า ยอดเงินมีปัญหา รวมของทุก USer แล้วไม่เท่าเดิม คุณก็ไปเอาข้อมูลแบบง่ายมา (A) มาประมวลผลแบบยาวใหม่ (B)

_____

ปัญหาคือ ใน table (A) มันอาจจะเข้ามา ซ้ำๆ ด้วยการกดรัวๆ ของ User ได้  เราต้องดักด้วย Javascript ในการ submit คือ ถ้ากด send แล้วต้อง Disable ปุ่มกด แล้วส่งข้อมูลไปหา server

ฝั่ง server ต้องตรวจสอบเวลาว่า หากในช่วง 1 นาทีที่ผ่านมา ใน Table(A) มีการส่งคำสั่งจาก User เดียวกันเข้ามา ก็ให้ถามให้แน่ใจก่อนว่า จะทำซ้ำหรือไม่ ดังนั้นถ้าเขาเปิดสองหน้าเพื่อโอนไป user เดียวกัน อีกหน้าก็จะมีการถาม ให้ยืนยันอีกที

______

มาเรื่องคำถาม  ว่ามันจะซ้ำกันอย่างไร
ถ้าคุณดักไว้ตามที่ผมว่า มันคงไม่ซ้ำละครับ แต่เผื่อกันเหนียว

หน้าที่เราก็แค่เช็ค XHASH ว่ามันมีเกิน 2 row หรือไม่ crone ตัวนี้ ทำงานหนักหน่อย ในแต่ละวันที่ประมวลผลตรวจสอบ

___

อย่าลืมว่า SYSTEM ก็เป็น user account อันหนึ่ง คุณต้องใส่ password ยาวๆเอาไว้
ระบบที่ผมเคยทำ มีการหักค่าธรรมเนียมด้วย  ก็จะมี SYSTEM account สำหรับค่าธรรมเนียมด้วย
เวลามีโอนเข้าโอนออก ก็จะหักจาก user account -> fees account ซึ่งเป็นของระบบ
เวลาเราถอนเงินกำไรออก ก็ลดค่าใน fee account ลง แต่ทุกอย่างก็รวมได้เท่าเดิม


คราวนี้การบริหารจัดการคือ

System account คือเงินในระบบ จะต้องเท่ากับเงินที่ท่านมีอยู่ในบัญชีธนาคาร (เนื่องจากผมทำ payment processor)
พอใครโอนเงินสดให้คุณ  เช็คเงินแล้ว ก็ไปอับเดทเงินในระบบ  แบบนี้คุณต้องทำ ตารางมาต่างหาก เพื่อดูข้อมูลการรับจ่ายเงิน  ยุ่งยาก


ผมใช้วิธี ตั้งเงินในระบบไว้ 1 ล้าน  ใครโอนเงินมา ผมก็โอนจาก System  เข้าไป  เราแค่เขียนโค้ดว่า ถ้ามาจาก User ID =1 (system) ก็ระบุชื่อว่า เติมเงิน   ถ้าถอนเงิน  User ก็โอนเข้า System

จะเห็นว่า ดูที่ยอดเงินของ system ถ้าเหลือ 900,000 แสดงว่ามีเงินในระบบอยู่ 100,000 บาท ตรงกับเงินในบัญชีธนาคารไหม

คราวนี้การแก้เงิน 1 ล้าน ให้เป็น 10 ล้าน ก็ทำได้ทันที  ตัวแปร คือ total money ซึ่งฝังอยู่ในโค้ดเลย แล้ว encrypt ด้วย ioncube แม้แต่เจ้าของ host ก็แก้ไม่ได้

พนักงานในบริษัท ก็แก้ไม่ได้ ใครไปยุ่งใน DB แล้วทำให้ hash เพี้ยน ก็หาตัวการได้เลย halt ระบบเอาไว้ได้ก่อน

อย่าลืม Salt แต่ละอันก็ encrypt ไว้หมด ในไฟล์ config แนะนำ ioncube มากกว่า zend ครับ

kingofdollars

ส่วน table crone ต้องทำครับ ไม่งั้น run crone แล้วมั่ว


ID , DATE , LAST TR ID ,status
1001: 2016-06-29 : 29393 , 0

ก่อน run ทุกครั้ง ตรวจสอบว่า run หรือยัง ไม่งั้นมั่วแน่นอน

nscyber


MapTwoZa

เล่นระบบบัญชีคู่เลยหรอ

ถ้าจะทำบัญชีคู่จริง จขกท ต้องไปศึกษาระบบบัญชีคู่ด้วยนะ มันซับซ้อนนิดนึง
Good code quality Developer :D

nat-ns

ขอบคุณครับพอเห็นภาพเลย  :-[

ผมสงสัยตรง
อ้างถึงคราวนี้การแก้เงิน 1 ล้าน ให้เป็น 10 ล้าน ก็ทำได้ทันที  ตัวแปร คือ total money ซึ่งฝังอยู่ในโค้ดเลย
ในเมื่อผมแก้ในสคริป php ผมก็ต้องเข้าไปแก้ใน Table  USer ID 1 ให้ BALANCE เพิ่มจากที่เหลือเข้าไปอีก 10 ล้านเช่น ปัจจุบันเหลืออยู่ 997,000 ก็เพิ่มไปอีก 997,000+10,000,000
ใช่ไหมครับ คือแก้ทั้งฐานข้อมูลและฝั่งสคริปที่ไว้ตรวจสอบ
-----------
ถ้า XHASH มีมากกว่าหนึ่งนี่ก็คือมีการเปลี่ยนแปลงข้อมูลก็จับ A มาทำ B ใหม่ และปรับค่า BALANCE ใน TABLE USER ใหม่ ผมเข้าใจถูกไหมครับ
-----------

อ้างถึงจาก: kingofdollars ใน 30 มิถุนายน 2016, 08:09:52
ส่วน table crone ต้องทำครับ ไม่งั้น run crone แล้วมั่ว


ID , DATE , LAST TR ID ,status
1001: 2016-06-29 : 29393 , 0

ก่อน run ทุกครั้ง ตรวจสอบว่า run หรือยัง ไม่งั้นมั่วแน่นอน

อันนี้คือของรายการต่อวันใช่ไหมครับ กรณีที่ เมื่อวานทำไปแล้วก็เก็บประวัติไว้ เพื่อจะได้ไม่ต้องย้อนกลับไปคำนวณของเมื่อวานอีก อย่างเช่น TR ID ของวันเก่าที่ status = 1(ทั้งหมด) จะมี TR ID=1001-1005 พอเราจะตรวจเชควันนี้ก็เริ่มที่ 1005-N ไปเลย  :wanwan012:

nat-ns

อ้างถึงจาก: MapTwoZa ใน 30 มิถุนายน 2016, 11:02:50
เล่นระบบบัญชีคู่เลยหรอ

ถ้าจะทำบัญชีคู่จริง จขกท ต้องไปศึกษาระบบบัญชีคู่ด้วยนะ มันซับซ้อนนิดนึง

ไม่ต้องถึงขนาดนั้นก็ได้ครับ จากหลักการข้างบนก็ใช้ได้แล้วครับ แต่ก็ฝากแนะนำด้วยครับ 555 เผื่อนำมาประยุกต์กันได้  :wanwan012:

kingofdollars

อ้างถึงจาก: nat-ns ใน 30 มิถุนายน 2016, 11:30:52
ขอบคุณครับพอเห็นภาพเลย  :-[

ผมสงสัยตรง
อ้างถึงคราวนี้การแก้เงิน 1 ล้าน ให้เป็น 10 ล้าน ก็ทำได้ทันที  ตัวแปร คือ total money ซึ่งฝังอยู่ในโค้ดเลย
ในเมื่อผมแก้ในสคริป php ผมก็ต้องเข้าไปแก้ใน Table  USer ID 1 ให้ BALANCE เพิ่มจากที่เหลือเข้าไปอีก 10 ล้านเช่น ปัจจุบันเหลืออยู่ 997,000 ก็เพิ่มไปอีก 997,000+10,000,000
ใช่ไหมครับ คือแก้ทั้งฐานข้อมูลและฝั่งสคริปที่ไว้ตรวจสอบ


นานๆ คงจะทำซักทีตรงนี้  นั่นคือคุณเปลี่ยนตัวแปรใน config ไฟล์  แล้ว แก้ไขข้อมูลใน DB และ HASH ให้ถูกต้องครับ

ทำ script เตรียมไว้เลยครับ บวกเงินทีละ 1,000,000 หรือ ลบทีละ 1,000,000 ในฐานข้อมูล พร้อม HASH ทำเสร็จ ลบไฟล์นี้ทิ้ง (อย่าลืมทำ password hard-coded ไว้เลย เผื่อลืมลบไฟล์)  ได้ยอดที่ต้องการแล้วก็ไปแก้ใน config เอาไว้เปรียบเทียบ


-----------
ถ้า XHASH มีมากกว่าหนึ่งนี่ก็คือมีการเปลี่ยนแปลงข้อมูลก็จับ A มาทำ B ใหม่ และปรับค่า BALANCE ใน TABLE USER ใหม่ ผมเข้าใจถูกไหมครับ

ถ้ามีเกิน 1 คู่เมื่อไหร่ แสดงว่ามีข้อผิดพลาดเกิดขึ้น ก็ต้อง run cron เริ่มจาก นำ balance เก่าแต่ละรายมาคิด แล้วดึงข้อมูลจาก Table A มาคำนวนใหม่ทีละรายการ เพื่อให้ได้ Table B อันใหม่  บางคนเลยอาจจะมียอดเงินติดลบ แต่คิดว่าคงเกิดขึ้นนานๆที
-----------

อ้างถึงจาก: kingofdollars ใน 30 มิถุนายน 2016, 08:09:52
ส่วน table crone ต้องทำครับ ไม่งั้น run crone แล้วมั่ว


ID , DATE , LAST TR ID ,status
1001: 2016-06-29 : 29393 , 0

ก่อน run ทุกครั้ง ตรวจสอบว่า run หรือยัง ไม่งั้นมั่วแน่นอน

อันนี้คือของรายการต่อวันใช่ไหมครับ กรณีที่ เมื่อวานทำไปแล้วก็เก็บประวัติไว้ เพื่อจะได้ไม่ต้องย้อนกลับไปคำนวณของเมื่อวานอีก อย่างเช่น TR ID ของวันเก่าที่ status = 1(ทั้งหมด) จะมี TR ID=1001-1005 พอเราจะตรวจเชควันนี้ก็เริ่มที่ 1005-N ไปเลย  :wanwan012:

ถ้ามีปัญหา เราจะได้รู้ว่า ID สุดท้ายของ Table B ที่ไม่มีปัญหาคืออะไร
Algo คือ
1 ตรวจสอบว่า run cron หรือยัง ถ้า run แล้วก็จบ
2 ถ้ายังไม่ run ก็เริ่มรัน พร้อมบันทึกวันที่วันนี้ลงไป
3 หา Hash ที่เกิน 1 คู่ ถ้าเกิน ลบข้อมูลใน table B ทิ้งตั้งแต่ 1006 เป็นต้นไป
4 ถ้า 3 ไม่มีปัญหา เช็คยอดเงินรวม  ถ้ามีปัญหา ก็ทำข้อ 3
5 เอา ID สุดท้ายของ table B ใส่กลับเข้ามา เป็นอันจบ


nat-ns

อ้างถึงจาก: kingofdollars ใน 30 มิถุนายน 2016, 13:59:24
อ้างถึงจาก: nat-ns ใน 30 มิถุนายน 2016, 11:30:52
ขอบคุณครับพอเห็นภาพเลย  :-[

ผมสงสัยตรง
อ้างถึงคราวนี้การแก้เงิน 1 ล้าน ให้เป็น 10 ล้าน ก็ทำได้ทันที  ตัวแปร คือ total money ซึ่งฝังอยู่ในโค้ดเลย
ในเมื่อผมแก้ในสคริป php ผมก็ต้องเข้าไปแก้ใน Table  USer ID 1 ให้ BALANCE เพิ่มจากที่เหลือเข้าไปอีก 10 ล้านเช่น ปัจจุบันเหลืออยู่ 997,000 ก็เพิ่มไปอีก 997,000+10,000,000
ใช่ไหมครับ คือแก้ทั้งฐานข้อมูลและฝั่งสคริปที่ไว้ตรวจสอบ


นานๆ คงจะทำซักทีตรงนี้  นั่นคือคุณเปลี่ยนตัวแปรใน config ไฟล์  แล้ว แก้ไขข้อมูลใน DB และ HASH ให้ถูกต้องครับ

ทำ script เตรียมไว้เลยครับ บวกเงินทีละ 1,000,000 หรือ ลบทีละ 1,000,000 ในฐานข้อมูล พร้อม HASH ทำเสร็จ ลบไฟล์นี้ทิ้ง (อย่าลืมทำ password hard-coded ไว้เลย เผื่อลืมลบไฟล์)  ได้ยอดที่ต้องการแล้วก็ไปแก้ใน config เอาไว้เปรียบเทียบ


-----------
ถ้า XHASH มีมากกว่าหนึ่งนี่ก็คือมีการเปลี่ยนแปลงข้อมูลก็จับ A มาทำ B ใหม่ และปรับค่า BALANCE ใน TABLE USER ใหม่ ผมเข้าใจถูกไหมครับ

ถ้ามีเกิน 1 คู่เมื่อไหร่ แสดงว่ามีข้อผิดพลาดเกิดขึ้น ก็ต้อง run cron เริ่มจาก นำ balance เก่าแต่ละรายมาคิด แล้วดึงข้อมูลจาก Table A มาคำนวนใหม่ทีละรายการ เพื่อให้ได้ Table B อันใหม่  บางคนเลยอาจจะมียอดเงินติดลบ แต่คิดว่าคงเกิดขึ้นนานๆที
-----------

อ้างถึงจาก: kingofdollars ใน 30 มิถุนายน 2016, 08:09:52
ส่วน table crone ต้องทำครับ ไม่งั้น run crone แล้วมั่ว


ID , DATE , LAST TR ID ,status
1001: 2016-06-29 : 29393 , 0

ก่อน run ทุกครั้ง ตรวจสอบว่า run หรือยัง ไม่งั้นมั่วแน่นอน

อันนี้คือของรายการต่อวันใช่ไหมครับ กรณีที่ เมื่อวานทำไปแล้วก็เก็บประวัติไว้ เพื่อจะได้ไม่ต้องย้อนกลับไปคำนวณของเมื่อวานอีก อย่างเช่น TR ID ของวันเก่าที่ status = 1(ทั้งหมด) จะมี TR ID=1001-1005 พอเราจะตรวจเชควันนี้ก็เริ่มที่ 1005-N ไปเลย  :wanwan012:

ถ้ามีปัญหา เราจะได้รู้ว่า ID สุดท้ายของ Table B ที่ไม่มีปัญหาคืออะไร
Algo คือ
1 ตรวจสอบว่า run cron หรือยัง ถ้า run แล้วก็จบ
2 ถ้ายังไม่ run ก็เริ่มรัน พร้อมบันทึกวันที่วันนี้ลงไป
3 หา Hash ที่เกิน 1 คู่ ถ้าเกิน ลบข้อมูลใน table B ทิ้งตั้งแต่ 1006 เป็นต้นไป
4 ถ้า 3 ไม่มีปัญหา เช็คยอดเงินรวม  ถ้ามีปัญหา ก็ทำข้อ 3
5 เอา ID สุดท้ายของ table B ใส่กลับเข้ามา เป็นอันจบ



ขอบคุณมากครับ  :wanwan019:  :wanwan017:  :wanwan017:  :wanwan017:  :wanwan017: