Jump to content

Problema con SQL


TheCrazy17

Recommended Posts

Hola a todos :D Estoy aprendiendo a usar SQL para hacer un sistema de guardado para unas tiendas de campaña, estuve mirando un poco de esto en otros scripts y en el foro y logre esto:

addEventHandler("onResourceStart",getResourceRootElement(),function() 
    --Conectar a la base de datos 
    tiendasDB = dbConnect("sqlite",":/Tiendas.db") 
     
    --Si no se puede conectar, cancelar 
    if not tiendasDB then 
        outputDebugString("[TIENDAS] No se puede conectar a la base de datos.") 
        cancelEvent() 
        return 
    else 
        outputDebugString("[TIENDAS] Sistema iniciado correctamente.") 
    end 
    --Crea la tabla de tiendas en la base de datos si no existe 
    dbExec(tiendasDB,"CREATE TABLE IF NOT EXISTS Tiendas (Dueño TEXT, PosX INTEGER, PosY INTEGER, PosZ INTEGER, Rotacion INTEGER)") 
end,false) 
  
function armarTienda(source) 
  setPedAnimation(source, "BOMBER", "BOM_Plant", -1, false, false, nil, false) 
  local source = source 
  setTimer(function() 
    local x, y, z = getElementPosition(source) 
    local xr, yr, zr = getElementRotation(source) 
    px, py, pz = getElementPosition(source) 
    prot = getPedRotation(source) 
    local offsetRot = math.rad(prot + 90) 
    local vx = px + 5 * math.cos(offsetRot) 
    local vy = py + 5 * math.sin(offsetRot) 
    local vz = pz + 2 
    local vrot = prot + 180 
    tent = createObject(3243, vx, vy, z - 1, 0, 0, vrot) 
    setObjectScale(tent, 1.3) 
    tentCol = createColSphere(x, y, z, 4) 
    attachElements(tentCol, tent, 0, 0, 0) 
    setElementData(tentCol, "parent", tent) 
    setElementData(tent, "parent", tentCol) 
    setElementData(tentCol, "tent", true) 
    setElementData(tentCol, "vehicle", true) 
    setElementData(tentCol, "MAX_Slots", 100) 
     
    vz = z - 1 
    nombre = getPlayerName(source) 
    dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES ( "..nombre..", "..vx..", "..vy..", "..vz..", "..vrot..")") 
    outputChatBox("Tienda creada, Datos: X:"..x.." Y:"..y.." Z:"..z.." R:"..vrot, root, 0, 255, 0) --Debug 
  
end, 1500, 1) 
end 
addCommandHandler("tienda", armarTienda) 

Me pareció que estaba todo bien, pero me sale este error:

1544393_742786069101821_3347036161339546037_n.jpg?oh=e59d2d8f7852d6d3fc5a7d706e0ae49a&oe=550F3C2E

Alguien podría darme una manito? La verdad es que no entiendo mucho de esto y quiero aprender :D

Gracias de antemano

Link to comment
  • MTA Team

Eso es por que estas intentando insertar un string sin especificarlo.

Cambia a esto:

  
addEventHandler("onResourceStart",getResourceRootElement(),function() 
    --Conectar a la base de datos 
    tiendasDB = dbConnect("sqlite",":/Tiendas.db") 
    
    --Si no se puede conectar, cancelar 
    if not tiendasDB then 
        outputDebugString("[TIENDAS] No se puede conectar a la base de datos.") 
        cancelEvent() 
        return 
    else 
        outputDebugString("[TIENDAS] Sistema iniciado correctamente.") 
    end 
    --Crea la tabla de tiendas en la base de datos si no existe 
    dbExec(tiendasDB,"CREATE TABLE IF NOT EXISTS Tiendas (Dueño TEXT, PosX INTEGER, PosY INTEGER, PosZ INTEGER, Rotacion INTEGER)") 
end,false) 
  
function armarTienda(source) 
  setPedAnimation(source, "BOMBER", "BOM_Plant", -1, false, false, nil, false) 
  local source = source 
  setTimer(function() 
    local x, y, z = getElementPosition(source) 
    local xr, yr, zr = getElementRotation(source) 
    px, py, pz = getElementPosition(source) 
    prot = getPedRotation(source) 
    local offsetRot = math.rad(prot + 90) 
    local vx = px + 5 * math.cos(offsetRot) 
    local vy = py + 5 * math.sin(offsetRot) 
    local vz = pz + 2 
    local vrot = prot + 180 
    tent = createObject(3243, vx, vy, z - 1, 0, 0, vrot) 
    setObjectScale(tent, 1.3) 
    tentCol = createColSphere(x, y, z, 4) 
    attachElements(tentCol, tent, 0, 0, 0) 
    setElementData(tentCol, "parent", tent) 
    setElementData(tent, "parent", tentCol) 
    setElementData(tentCol, "tent", true) 
    setElementData(tentCol, "vehicle", true) 
    setElementData(tentCol, "MAX_Slots", 100) 
    
    vz = z - 1 
    nombre = getPlayerName(source) 
    dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES ( '"..nombre.."', "..vx..", "..vy..", "..vz..", "..vrot..")") 
    outputChatBox("Tienda creada, Datos: X:"..x.." Y:"..y.." Z:"..z.." R:"..vrot, root, 0, 255, 0) --Debug 
  
end, 1500, 1) 
end 
addCommandHandler("tienda", armarTienda) 

PD: No te recomiendo insertar tus valores a esa Query de esa forma, mejor utiliza columna=(?)

nombre = "'"..getPlayerName(source).."'" 
    dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES (?, ?, ?, ?, ?)",nombre,vx,vy,vz,vrot) 

Link to comment
Eso es por que estas intentando insertar un string sin especificarlo.

Cambia a esto:

  
addEventHandler("onResourceStart",getResourceRootElement(),function() 
    --Conectar a la base de datos 
    tiendasDB = dbConnect("sqlite",":/Tiendas.db") 
    
    --Si no se puede conectar, cancelar 
    if not tiendasDB then 
        outputDebugString("[TIENDAS] No se puede conectar a la base de datos.") 
        cancelEvent() 
        return 
    else 
        outputDebugString("[TIENDAS] Sistema iniciado correctamente.") 
    end 
    --Crea la tabla de tiendas en la base de datos si no existe 
    dbExec(tiendasDB,"CREATE TABLE IF NOT EXISTS Tiendas (Dueño TEXT, PosX INTEGER, PosY INTEGER, PosZ INTEGER, Rotacion INTEGER)") 
end,false) 
  
function armarTienda(source) 
  setPedAnimation(source, "BOMBER", "BOM_Plant", -1, false, false, nil, false) 
  local source = source 
  setTimer(function() 
    local x, y, z = getElementPosition(source) 
    local xr, yr, zr = getElementRotation(source) 
    px, py, pz = getElementPosition(source) 
    prot = getPedRotation(source) 
    local offsetRot = math.rad(prot + 90) 
    local vx = px + 5 * math.cos(offsetRot) 
    local vy = py + 5 * math.sin(offsetRot) 
    local vz = pz + 2 
    local vrot = prot + 180 
    tent = createObject(3243, vx, vy, z - 1, 0, 0, vrot) 
    setObjectScale(tent, 1.3) 
    tentCol = createColSphere(x, y, z, 4) 
    attachElements(tentCol, tent, 0, 0, 0) 
    setElementData(tentCol, "parent", tent) 
    setElementData(tent, "parent", tentCol) 
    setElementData(tentCol, "tent", true) 
    setElementData(tentCol, "vehicle", true) 
    setElementData(tentCol, "MAX_Slots", 100) 
    
    vz = z - 1 
    nombre = getPlayerName(source) 
    dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES ( '"..nombre.."', "..vx..", "..vy..", "..vz..", "..vrot..")") 
    outputChatBox("Tienda creada, Datos: X:"..x.." Y:"..y.." Z:"..z.." R:"..vrot, root, 0, 255, 0) --Debug 
  
end, 1500, 1) 
end 
addCommandHandler("tienda", armarTienda) 

PD: No te recomiendo insertar tus valores a esa Query de esa forma, mejor utiliza columna=(?)

nombre = "'"..getPlayerName(source).."'" 
    dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES (?, ?, ?, ?, ?)",nombre,vx,vy,vz,vrot) 

Funciono perfecto :D Muchas gracias

Ahora otra pregunta, como obtengo todos los datos (Dueño, PosX, PosY, PosZ y Rotacion) que se guardaron en la base de datos ? Para así que poder hacer que se restauren todas las tiendas creadas cuando el script inicie :)

Link to comment
  • MTA Team

No lo probé pero deberia funcionar:

  
function cargarTiendas() 
local consulta = dbQuery(tiendasDB,"SELECT * FROM Tiendas") 
local resultado =  dbPoll( consulta, -1 ) 
    if resultado then 
        for _, v in ipairs(resultado)do 
        local owner = v['Dueño'] 
        local vX = v['PosX'] 
        local vY = v['PosY'] 
        local vZ = v['PosZ'] 
        local rot = v['Rotacion'] 
  
        local tent = createObject(3243, vX, vY, vZ - 1, 0, 0, rot) 
        setObjectScale(tent, 1.3) 
        local tentCol = createColSphere(vX, vY, vZ, 4) 
        attachElements(tentCol, tent, 0, 0, 0) 
        setElementData(tentCol, "parent", tent) 
        setElementData(tent, "parent", tentCol) 
        setElementData(tentCol, "tent", true) 
        setElementData(tentCol, "vehicle", true) 
        setElementData(tentCol, "MAX_Slots", 100) 
        end 
    end 
end 
addEventHandler("onResourceStart",getResourceRootElement (getThisResource()),cargarTiendas) 

Link to comment
No lo probé pero deberia funcionar:
  
function cargarTiendas() 
local consulta = dbQuery(tiendasDB,"SELECT * FROM Tiendas") 
local resultado =  dbPoll( consulta, -1 ) 
    if resultado then 
        for _, v in ipairs(resultado)do 
        local owner = v['Dueño'] 
        local vX = v['PosX'] 
        local vY = v['PosY'] 
        local vZ = v['PosZ'] 
        local rot = v['Rotacion'] 
  
        local tent = createObject(3243, vX, vY, vZ - 1, 0, 0, rot) 
        setObjectScale(tent, 1.3) 
        local tentCol = createColSphere(vX, vY, vZ, 4) 
        attachElements(tentCol, tent, 0, 0, 0) 
        setElementData(tentCol, "parent", tent) 
        setElementData(tent, "parent", tentCol) 
        setElementData(tentCol, "tent", true) 
        setElementData(tentCol, "vehicle", true) 
        setElementData(tentCol, "MAX_Slots", 100) 
        end 
    end 
end 
addEventHandler("onResourceStart",getResourceRootElement (getThisResource()),cargarTiendas) 

A la perfección :D De nuevo muchas gracias :)

Link to comment

Para evitar hacer otro post vuelvo a preguntar aquí:

Como hago para borrar una tienda en especifico de la base de datos?

Hice esto para poder borrar las tiendas, pero lógicamente como no se borra de la base de datos sigue apareciendo cuando se inicia el script:

Cliente

function onPlayerTargetPickup(theElement) 
    if getElementData(source,"Tienda") then 
        setElementData(getLocalPlayer(),"currentCol",source) 
        outputChatBox("Entraste en un colshape de tienda") 
    end 
end 
addEventHandler("onClientColShapeHit",getRootElement(),onPlayerTargetPickup) 
  
function onPlayerTargetPickup (theElement) 
if theElement == getLocalPlayer() then 
    local players = getElementsWithinColShape ( source, "player" ) 
    if players == getLocalPlayer() then --[[return ]]end 
    setElementData(getLocalPlayer(),"currentCol",false) 
end 
end 
addEventHandler("onClientColShapeLeave",getRootElement(),onPlayerTargetPickup) 
  
function borrar() 
    local col = getElementData(getLocalPlayer(),"currentCol") 
    if col then 
        Objeto = getElementData(col,"parent") 
        triggerServerEvent("removerTienda",getLocalPlayer(), Objeto, col) 
    else 
        outputChatBox("No estas en un colshape") --Debug 
    end 
end 
addCommandHandler("borrar", borrar) 

Servidor

addEventHandler("onResourceStart",getResourceRootElement(),function() 
    --Conectar a la base de datos 
    tiendasDB = dbConnect("sqlite",":/Tiendas.db") 
    
    --Si no se puede conectar, cancelar 
    if not tiendasDB then 
        outputDebugString("[TIENDAS] No se puede conectar a la base de datos.") 
        cancelEvent() 
        return 
    else 
        outputDebugString("[TIENDAS] Sistema iniciado correctamente.") 
    end 
    --Crea la tabla de tiendas en la base de datos si no existe 
    dbExec(tiendasDB,"CREATE TABLE IF NOT EXISTS Tiendas (Dueño TEXT, PosX INTEGER, PosY INTEGER, PosZ INTEGER, Rotacion INTEGER)") 
end,false) 
  
function cargarTiendas() 
local consulta = dbQuery(tiendasDB,"SELECT * FROM Tiendas") 
local resultado =  dbPoll( consulta, -1 ) 
TiendasC = 0 
    if resultado then 
        for _, v in ipairs(resultado)do 
        local owner = v['Dueño'] 
        local vX = v['PosX'] 
        local vY = v['PosY'] 
        local vZ = v['PosZ'] 
        local rot = v['Rotacion'] 
  
        local tent = createObject(3243, vX, vY, vZ - 1, 0, 0, rot) 
        setObjectScale(tent, 1.3) 
        local tentCol = createColSphere(vX, vY, vZ, 4) 
        attachElements(tentCol, tent, 0, 0, 0) 
        setElementData(tentCol, "parent", tent) 
        setElementData(tent, "parent", tentCol) 
        setElementData(tentCol, "Tienda", true) 
        setElementData(tentCol, "MAX_Slots", 100) 
        TiendasC = TiendasC + 1 
        end 
    end 
outputChatBox(TiendasC.." tiendas restauradas") 
end 
addEventHandler("onResourceStart",getResourceRootElement (getThisResource()),cargarTiendas)  
  
function armarTienda(source) 
  setPedAnimation(source, "BOMBER", "BOM_Plant", -1, false, false, nil, false) 
  local source = source 
  setTimer(function() 
    local x, y, z = getElementPosition(source) 
    local xr, yr, zr = getElementRotation(source) 
    px, py, pz = getElementPosition(source) 
    prot = getPedRotation(source) 
    local offsetRot = math.rad(prot + 90) 
    local vx = px + 5 * math.cos(offsetRot) 
    local vy = py + 5 * math.sin(offsetRot) 
    local vz = pz + 2 
    local vrot = prot + 180 
    tent = createObject(3243, vx, vy, z - 1, 0, 0, vrot) 
    setObjectScale(tent, 1.3) 
    tentCol = createColSphere(x, y, z, 4) 
    attachElements(tentCol, tent, 0, 0, 0) 
    setElementData(tentCol, "parent", tent) 
    setElementData(tent, "parent", tentCol) 
    setElementData(tentCol, "Tienda", true) 
    setElementData(tentCol, "vehicle", true) 
    setElementData(tentCol, "MAX_Slots", 100) 
    
    vz = z - 1 
    nombre = "'"..getPlayerName(source).."'" 
    dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES (?, ?, ?, ?, ?)",nombre,vx,vy,vz,vrot) 
    outputChatBox("Tienda creada, Datos: X:"..x.." Y:"..y.." Z:"..z.." R:"..vrot, root, 0, 255, 0) --Debug 
  
end, 1500, 1) 
end 
addCommandHandler("tienda", armarTienda) 
  
function removeTent(Objeto, Colision) 
    destroyElement(Objeto) 
    destroyElement(Colision) 
end 
addEvent("removerTienda", true) 
addEventHandler("removerTienda", getRootElement(), removeTent) 

Que debo hacer o usar para borrar de la base de datos, la tienda que se destruye?

Link to comment
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...