บันทึกข้อมูลตารางไอเทมลง MySQL ด้วย JSON

สอนการบันทึกข้อมูลแบบ ตาราง ด้วย JSON ลง MySQL
ผมจะสอน 2 ตัวทีสามารถบันทึกลง MySQL แบบง่ายๆ

วิธี 1 คือบันทึกลง MySQL ได้ทีละเยอะๆ

ข้อดี บันทึกข้อมูลได้ทีละเยอะๆโดยลูปทีเดี่ยว 
ข้อเสีย จะต้องลูป เพื่อดึงมาใช้งานด้วยนั้นเอง
ปล อาจจะมีวิธีดึงข้อมูลด้วยวิธีอื่นๆ ก็เป็นได้

2 แบบการดึงข้อมูลมาใช้งานได้ ง่ายสุดๆ ง่ายกว่าข้อแรกเสียอีก

ข้อเสีย บันทึกได้น้อยเพราะต้อง ทำเป็นข้อความก่อนลง บันทึก 
ข้อดี ดึงใช้งานได้ทันทีไม่ต้อง ลูป

แต่ข้อเสียก็แก้ไขได้ง่ายๆ แต่ต้องมาแก้ไขข้อความนั้นด้วยตัวเองและหากมีมากก็คงต้องเขียน ยาวเลย
เช่นแตกต่างจาก ข้อ 1 ทีแก้ไข แค่ตารางเฉยๆ นั้นเอง

1.1. ดึงตารางลงตัวฟังก์ชั้น toJSON()

local table = {
    { "exp"},
    { "level"},
    { "m4"},
    { "m4 mag"}
}

local value = toJSON( table )

แค่นี้ก็ ตัวแปร value ก็จะมีค่าเป็น text นำมาแสดงได้ โดยตัวอย่าง
chat:  [ [ [ "exp"], [ "level"], [ "m4"] ,[ "m4 mag"] ] ]

และเมื่อต้องการดีงข้อมูลก็สามารถใช้ fromJSON( value ) พารามิเดอร์ จากทีถูก toJSON() นั้นเอง หรือเป็นข้อความทีทำขึ้นมาเองก็ได้ เช่น
local text = '[ [ [ "exp"], [ "level"], [ "m4"] ,[ "m4 mag"] ] ]'


1.2. การดึงข้อมูลลง ตารางไอเทม พร้อมค่าสถานะของมันก่อนลง MySQL

local table = {
    { "exp"},
    { "level"},
    { "m4"},
    { "m4 mag"}
}

local valueItem = {} -- ตารางเก็บข้อมูลทั้งหมด พร้อมค่าสถานะก่อนลงบันทึก

for i,v in ipairs( table ) do 
    -- ในลูปนี้ก็ต้องตรวจสอบว่า ตัวสถานะนั้นของเรามีค่าเป็น false ไหม ถ้าเป็นอย่างนั้นให้เป็น 0 แทน
    local valueTable = getElementData( source, v[1]) or 0
    table.insert( valueItem , { v[1] , valueTable })
end

หลักการมันก็คือ insert ข้อมูลทั้งหมดทีลูปได้ลง ตาราง valueItem โดยไม่ทับกัน พร้อมกับค่า สถานะนั้นลงไปด้วย

ตัวอย่างลูปข้อมูลทั้งหมด ของตัวตาราง valueItem
chat:  [ [ [ "exp", 500], [ "level", 5], [ "m4", 1] ,[ "m4 mag", 30] ] ]

จากนี้ท่านก็สามารถบันทึกข้อมูลพวกนี้ลง MySQL ได้แล้ว
ตัวอย่างการบันทึก
dbExec( connection, "INSERT INTO `accounts` ( `table`) VALUES ( ?)" , toJSON( valueItem ) )

1.3. การดึงข้อมูลมาใช้งาน

ตัวอย่างดึงข้อมูลจาก MySQL

connection = dbConnect( "mysql", "dbname=mtasa;host=127.0.0.1", "root", "123"
local qh = dbQuery( connection, "SELECT * FROM `accounts`"
local rows = dbPoll( qh, -1 )

local value = rows[1]["table"] -- ดึงข้อมูลจาก MySQL
local valueTable = fromJSON( value  ) -- นำมาใช้กับ ฟังก์ชั่น fromJSON ก่อนลูป
for i,v in ipairs( valueTable ) do
    setElementData( source, v[1], v[2])
end



แบบการดึงข้อมูลมาใช้งานได้ ง่ายสุดๆ ง่ายกว่าข้อแรกเสียอีก ใช้งานดีกับการเก็บพิกัด

2.1. การร่วมรวมข้อมูลก่อนลงบันทึก

ข้อนี้ไม่ต้องมี ตาราง table = {} แบบนี้
แต่ต้องทำเป็นข้อความเสียก่อน

local x, y, z = getElementPosition( source ) 
local tJSON = '[ { "latest_x" : "' .. x .. '" , "latest_y" : "' .. y .. '", "latest_z" : "' .. z .. '" }]'

แค่นี้ก็บันทึกลง MySQL ได้เลย

dbExec( connection, "INSERT INTO `accounts` ( `positions`) VALUES ( ?)" , tJSON  )

2.2 การดีงข้อมูลมาใช้งาน

ตัวอย่างดึงข้อมูลจาก MySQL

local qh = dbQuery( connection, "SELECT * FROM `accounts`"
local rows = dbPoll( qh, -1 )

local value = rows[1]["positions"] -- ข้อมูลการ MySQL
local positions = fromJSON( value ) -- และนำมาใช้กับ ฟังก์ชั่น fromJSON ก่อนดึงข้อมูลก่อนใช้งาน

เริ่มดึงข้อมูลได้เลย
วิธีแรกต้องเรียกตัวแปร positions ตามด้วยตัว จุด และ ชื่อ ตารางทีบันทึกลงก่อนหน้านี้
local x = positions.latest_x
local y = positions.latest_y
local z = positions.latest_z



1 ความคิดเห็น: