Enviar respuesta 
[MYSQ] INSERT/UPDATE Sentence Maker
Autor Mensaje
Sugisaki Sin conexión
Miembro Destacado


Medalla de aportes Trebol purpura 1k
Mensajes: 1,090
Registro en: Jul 2014
Reputación: 21
Mensaje: #1
[MYSQ] INSERT/UPDATE Sentence Maker
Como el titulo indica ni mas ni menos. Whatdone

facil uso:
Código PHP:
// INSERT
    
sid sql_init(SQL_INSERT);
    
sql_set_table(sid"tabla")
    
sql_set_value(sid"c1""data^"")
    sql_set_value(sid, "
c2", "%s", "data")
    sql_execute(sid);
    //UPDATE
    sid = sql_init(SQL_UPDATE)
    sql_set_table(sid, "
tabla")
    sql_set_value(sid, "
c1", "data")
    sql_update_value(sid, "
c2", "123", true, "c2", "+")
    sql_update_value(sid, "
c3", "jose")
    sql_set_where(sid, "
player", "SUGI", "pass", "^"2\ \^"23");
    sql_execute(sid)
    // MANUAL WHERE 
    sid = sql_init(SQL_UPDATE)
    sql_set_table(sid, "
tabla")
    sql_set_value(sid, "
c1", "data")
    sql_update_value(sid, "
c2", "123", true, "c2", "+")
    sql_update_value(sid, "
c3", "jose")
    sql_set_where_manual(sid, "
player='jose' AND pass='sugi123'");
    sql_execute(sid) 

quedaria algo como:
Image

cuando tenga un chancecito lo explico mejor
si alguien aporta mejoras al mismo, se le agradece


Código PHP:
#include <sqlx>

enum SQL_QUERY_MODE
{
    
SQL_INSERT,
    
SQL_UPDATE
}

const 
__SQL_MAX_COLUMN_BUF_SIZE 256
const __SQL_MAX_QUERY_BUF_SIZE 1280
const __SQL_MAX_IDENTIFIER_NUMS 4
const __SQL_TABLE_SIZE_BUFF 32

stock Trie
:_QUERY_SENTENCER
stock any
:_QUERY_IDENTIFIER 0;


enum _:__QS_ARRAY
{
    
SQL_QUERY_MODE:__SQL_MODE,
    
__TABLE[__SQL_TABLE_SIZE_BUFF],
    Array:
__COLUMN,
    Array:
__DATA,
    Array:
__WHERE_C,
    Array:
__WHERE_D,
    
__WHERE_MANUAL[__SQL_MAX_COLUMN_BUF_SIZE]
}
/**
 * Inicia Preparacion de la oracion sql
 *
 * @param mode      Modo
 * 
 * @return identificador del inicios
 *
 */
stock SQL_DATA:sql_init(SQL_QUERY_MODE:mode)
{
    if(!(
SQL_INSERT <= mode <= SQL_UPDATE))
    {
        
log_error(AMX_ERR_NATIVE"[AMXX] SQL Mode not valid!")
        return 
any:0;
    }
    new 
a[__QS_ARRAY], num[__SQL_MAX_IDENTIFIER_NUMS];
    if(!
_QUERY_SENTENCER)
    {
        
_QUERY_SENTENCER TrieCreate()
    }
    
a[__SQL_MODE] = mode
    _QUERY_IDENTIFIER 
+= 1;
    
num_to_str(_QUERY_IDENTIFIERnumcharsmax(num))
    
TrieSetArray(_QUERY_SENTENCERnumasizeof(a))
    return 
_QUERY_IDENTIFIER;
}
/**
 * Establece la tabla a trabajar
 *
 * @param id        Identificador
 * @param table     Tabla a trabajar
 * 
 * @noreturn
 *
 */
stock sql_set_table(SQL_DATA:id, const table[])
{
    new 
a[__QS_ARRAY], num[__SQL_MAX_IDENTIFIER_NUMS];
    
num_to_str(any:idnumcharsmax(num))
    if(
TrieGetArray(_QUERY_SENTENCERnumasizeof(a)) == false)
    {
        
log_error(AMX_ERR_NATIVE"[AMXX] SQL DATA ID not valid!")
        return;
    }
    
formatex(a[__TABLE], charsmax(a[__TABLE]), "%s"table);
    
TrieSetArray(_QUERY_SENTENCERnumasizeof(a))
}
/**
 * Establece la tabla a trabajar
 *
 * @param id            Identificador
 * @param column        Establece una columna
 * @param data          Datos a establecer en una columna
 * @param ...           Datos para formatear el texto establecido en data
 *
 * @noreturn
 *
 */
stock sql_set_value(SQL_DATA:id, const column[], const data[], any:...)
{
    new 
a[__QS_ARRAY], num[__SQL_MAX_IDENTIFIER_NUMS], buff[__SQL_MAX_COLUMN_BUF_SIZE];
    
num_to_str(any:idnumcharsmax(num))
    if(
TrieGetArray(_QUERY_SENTENCERnumasizeof(a)) == false)
    {
        
log_error(AMX_ERR_NATIVE"[AMXX] SQL DATA ID not valid!")
        return;
    }
    
vformat(buffcharsmax(buff), data4);
    new Array:
a[__COLUMN];
    new Array:
a[__DATA];
    if(!
c)
    {
        
ArrayCreate(__SQL_MAX_COLUMN_BUF_SIZE)
        
ArrayCreate(__SQL_MAX_COLUMN_BUF_SIZE)
        
a[__COLUMN] = c
        a
[__DATA] = d
    
}
    
replace_all(buffcharsmax(buff), "\", "\\");
    replace_all(buff, charsmax(buff), "
^"""\^"");
    
    ArrayPushString(c, column)
    ArrayPushString(d, buff)
    TrieSetArray(_QUERY_SENTENCER, num, a, sizeof(a))
}
/**
 * Actualiza datos de una columna
 * Esta funcion esta pensada para usar numeros enteros/flotantes
 * Pero se pueden usar strings
 *
 * @param id                            Identificador
 * @param column                        Establece una columna
 * @param data                          Datos a establecer en una columna
 * @param update_with_other_column      con true para actualizar con datos de otra columna
 * @param update_from                   si "
update_with_other_column" se estable en true se debe establecer la columna para tomar los datos de esa columna
 * @param update_operator               se utiliza un operador logico para relizar operaciones matematicas usando de base los datos de la columna establecida por "
update_from"
 *
 * @noreturn
 *
 */
stock sql_update_value(SQL_DATA:id, const column[], const data[], bool:update_with_other_column=false, const update_from[]="", const update_operator[]="")
{
    new a[__QS_ARRAY], num[__SQL_MAX_IDENTIFIER_NUMS], buff[__SQL_MAX_COLUMN_BUF_SIZE];
    num_to_str(any:id, num, charsmax(num))
    if(TrieGetArray(_QUERY_SENTENCER, num, a, sizeof(a)) == false)
    {
        log_error(AMX_ERR_NATIVE, "
[AMXXSQL DATA ID not valid!")
        return;
    }
    if(a[__SQL_MODE] != SQL_UPDATE)
    {
        log_error(AMX_ERR_NATIVE, "
[AMXXSQL DATA ID IS NOT UPDATE MODE!")
        return;
    }
    new Array:c = a[__COLUMN];
    new Array:d = a[__DATA];
    if(!c)
    {
        c = ArrayCreate(__SQL_MAX_COLUMN_BUF_SIZE)
        d = ArrayCreate(__SQL_MAX_COLUMN_BUF_SIZE)
        a[__COLUMN] = c
        a[__DATA] = d
    }
    if(update_with_other_column && update_from[0] && update_operator[0])
    {
        formatex(buff, charsmax(buff), "
`%s`%s%i", update_from, update_operator, str_to_num(data));
    }
    else
    {
        copy(buff, charsmax(buff), data)
        replace_all(buff, charsmax(buff), "
\", "\\");
        replace_all(buff, charsmax(buff), "
^"""\^"");
        
    }
    ArrayPushString(c, column)
    ArrayPushString(d, buff)
    TrieSetArray(_QUERY_SENTENCER, num, a, sizeof(a))
}
/**
 * Establece una condicion manual
 *
 * @param id            Identificador
 * @param where         Establece una condicion de manera manual
 * @param ...           Datos para formatear el texto establecido en where
 *
 * @noreturn
 *
 */
stock sql_set_where_manual(SQL_DATA:id, const where[], any:...)
{
    new a[__QS_ARRAY], num[__SQL_MAX_IDENTIFIER_NUMS]
    num_to_str(any:id, num, charsmax(num))
    if(TrieGetArray(_QUERY_SENTENCER, num, a, sizeof(a)) == false)
    {
        log_error(AMX_ERR_NATIVE, "
[AMXXSQL DATA ID not valid!")
        return;
    }
    vformat(a[__WHERE_MANUAL], charsmax(a[__WHERE_MANUAL]), where, 3);
    TrieSetArray(_QUERY_SENTENCER, num, a, sizeof(a))
}
/**
 * Establece una condicion Formateada
 *
 * @param id            Identificador
 * @param ...           Se establece una condicion sql preformateada con datos, 
 *                      donde el primer argumento sera la columna y el segundo 
 *                      argumento seria el dato de la columna a verificar
 *                      Este argumento tendra un "
escape string", los 
 *                      argumentos siguentes argumetos se cumpliran de la misma 
 *                      manera que el argumento 1 y 2
 *
 * @note                Ejemplo: sql_set_where(id, "
user", "SU^"GI")
 *                      
en la oracion sql se rellenaria asi WHERE `user`="SU\"GI"
 
*                      Otro Ejemplo sql_set_where(id"user""SU^"GI", "password", "Sugiiiiisaiiii^"^"")
 *                      en la oracion sql se rellenaria asi WHERE `user`="
SU\"GI" AND `password`="Sugiiiiisaiiii\"\""
 
*
 *
 * @
noreturn
 
*
 */
stock sql_set_where(SQL_DATA:idany:...)
{
    new 
a[__QS_ARRAY], num[__SQL_MAX_IDENTIFIER_NUMS], data[__SQL_MAX_COLUMN_BUF_SIZE]
    
num_to_str(any:idnumcharsmax(num))
    if(
TrieGetArray(_QUERY_SENTENCERnumasizeof(a)) == false)
    {
        
log_error(AMX_ERR_NATIVE"[AMXX] SQL DATA ID not valid!")
        return;
    }
    new Array:
a[__WHERE_C];
    new Array:
a[__WHERE_D];
    if(!
c)
    {
        
ArrayCreate(__SQL_MAX_COLUMN_BUF_SIZE)
        
ArrayCreate(__SQL_MAX_COLUMN_BUF_SIZE)
        
a[__WHERE_C] = c
        a
[__WHERE_D] = d
    
}
    new 
posch;
    for(new 
numargs() ; i++)
    {
        
pos 0;
        while((
ch getarg(ipos )))
        {
            
data[pos++] = ch;
        }
        
data[pos++] = '^0';
        if((
2) == 0)
        {
            
replace_all(datacharsmax(data), "\", "\\");
            replace_all(data, charsmax(data), "
^"""\^"");
            ArrayPushString(d, data);
        }
        else
        {
            ArrayPushString(c, data);
        }
    }
    TrieSetArray(_QUERY_SENTENCER, num, a, sizeof(a))
}
/**
 * Ejecuta una una Oracion SQL 
 *
 * @note The handler should look like:
 *       public QueryHandler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
 *       failstate - One of the three TQUERY_ defines.
 *       query     - Handle to the query, do not free it.
 *       error     - An error message, if any.
 *       errnum    - An error code, if any.
 *       data      - Data array you passed in.
 *       size      - Size of the data array you passed in.
 *       queuetime - Amount of gametime that passed while the query was resolving.
 * @note This will not interrupt gameplay in the event of a poor/lossed 
 *       connection, however, the interface is more complicated and 
 *       asynchronous. Furthermore, a new connection/disconnection is 
 *       made for each query to simplify driver support.
 * @note The handle does not need to be freed.
 *
 * @param id            Identificador
 * @param SQL_TUPLE     Tuple handle, returned from SQL_MakeDbTuple().
 * @param Handler       A function to be called when the query finishes. It has to be public.
 * @param data          Additional data array that will be passed to the handler function.
 * @param dataSize      The size of the additional data array. 
 * 
 *
 * @noreturn
 *
 */
stock sql_execute(SQL_DATA:id, Handle:SQL_TUPLE, const Handler[], const szData[]="", DataSize=0)
{
    new a[__QS_ARRAY], num[__SQL_MAX_IDENTIFIER_NUMS], data[__SQL_MAX_COLUMN_BUF_SIZE], query[__SQL_MAX_QUERY_BUF_SIZE], len;
    num_to_str(any:id, num, charsmax(num))
    if(TrieGetArray(_QUERY_SENTENCER, num, a, sizeof(a)) == false)
    {
        log_error(AMX_ERR_NATIVE, "
[AMXXSQL DATA ID not valid!")
        return;
    }

    len = formatex(query, charsmax(query), "
%`%s", a[__SQL_MODE] == SQL_INSERT ? "INSERT INTO" : a[__SQL_MODE] == SQL_UPDATE ? "UPDATE" : "", a[__TABLE])
    new Array:d, Array:c, i;
    c = a[__COLUMN];
    d = a[__DATA];
    if(a[__SQL_MODE] == SQL_INSERT)
    {
        len += add(query[len], charsmax(query), "
(");
        for( i = 0 ; i < ArraySize(c) ; i++)
        {
            ArrayGetString(c, i, data, charsmax(data))
            len += formatex(query[len], charsmax(query), "
%s`%s`", i > 0 ? "," : "", data);
        }
        len += add(query[len], charsmax(query), "
VALUES (");
        for( i = 0 ; i < ArraySize(d) ; i++)
        {
            ArrayGetString(d, i, data, charsmax(data))
            len += formatex(query[len], charsmax(query), "
%s^"%s^"", i > 0 ? "," : "", data);
        }
        len += add(query[len], charsmax(query), "
)");
    }
    else if(a[__SQL_MODE] == SQL_UPDATE)
    {
        len += add(query[len], charsmax(query), "
SET ");
        new data2[__SQL_MAX_COLUMN_BUF_SIZE]
        for( i = 0 ; i < ArraySize(c) ; i++)
        {
            ArrayGetString(c, i, data, charsmax(data))
            ArrayGetString(d, i, data2, charsmax(data2))
            len += formatex(query[len], charsmax(query), "
%s`%s`=%s%s%s", i > 0 ? "," : "", data, data2[0] != '`' ? "^"" ""data2data2[0] != '`' "^"" : "");
        }
        if(!a[__WHERE_MANUAL])
        {
            new Array:wc, Array:wd;
            wd = a[__WHERE_D]
            wc = a[__WHERE_C]
            len += add(query[len], charsmax(query), " 
WHERE ");
            for(new i = 0 ; i < ArraySize(wc) ; i++)
            {
                ArrayGetString(wc, i, data, charsmax(data))
                ArrayGetString(wd, i, data2, charsmax(data2))
                len += formatex(query[len], charsmax(query), "
%s`%s`=^"%s^"", i > 0 ? " AND " : "", data, data2)
            }
            ArrayDestroy(wc)
            ArrayDestroy(wd)
        }
        else
        {
            len += formatex(query[len], charsmax(query), " 
WHERE %s", a[__WHERE_MANUAL]);
        }
        
    }
    server_print(query)
    ArrayDestroy(c)
    ArrayDestroy(d)
    TrieDeleteKey(_QUERY_SENTENCER, num)
    SQL_ThreadQuery(SQL_TUPLE, Handler, query, szData, DataSize);



Archivo(s) adjuntos
sql_helper.inc (Tamaño: 11.67 KB / Descargas: 1)

Competitive/Face it Pick Up Game (PUG) servidor de prueba: 45.77.94.109:27016 Click para Entrar
Image

(14/08/2015 10:15 PM)Sugisaki escribió:  "El mundo es caotico, irracional e injusto. No tiene ningun significado"
Palabras que desde hace mucho tiempo he buscado para describir, ¿Que es el mundo?
Crab

Código PHP:
if(ayuda && free)
{
    exit();

(Este mensaje fue modificado por última vez en: 03/12/2019 02:15 PM por Sugisaki.)
01/12/2019 03:33 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
andres_1041 Sin conexión
Miembro


Mensajes: 209
Registro en: Jun 2019
Reputación: 0
Mensaje: #2
RE: [MYSQ] INSERT/UPDATE Sentence Maker
Buen Aporte!Mario

Image
01/12/2019 04:01 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
totopizza Sin conexión
http://www.MexicanServers.com


Donador Forum supporter Trebol verde Trebol de oro 1k
Mensajes: 2,094
Registro en: Mar 2014
Reputación: 40
Mensaje: #3
RE: [MYSQ] INSERT/UPDATE Sentence Maker
Excelente aporte @Sugisaki, estaría bueno también que añadas:
Código PHP:
sql_set_where(where[]=""any:...) // En el caso que sea algun SELECT?
sql_set_order(order[]=""// En el caso que sea algun SELECT?
sql_set_limit(startend// En el caso que sea algun SELECT? 

Nothingdohere

OFF:
(01/12/2019 04:01 PM)andres_1041 escribió:  Buen Aporte!Mario

No tienes ni la más mínima idea de cómo funciona y en qué facilita las cosas Oh god why

Image

Estudia siempre; el tiempo es oro, lo material se puede recuperar pero el tiempo no se puede recuperar.
(02/10/2016 05:05 PM)meTaLiCroSS escribió:  Siempre me gusta ayudar cuando alguien esta interesado realmente en ver que esta programando.
(08/08/2019 05:32 PM)meTaLiCroSS escribió:  grax x el dato cr4ck


Mis aportes

PLUGINS
MAPAS
Menú LANG [SF] Sistema de Frags
Say System (Admin Prefix)
(Este mensaje fue modificado por última vez en: 01/12/2019 04:47 PM por totopizza.)
01/12/2019 04:30 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Pan Bimbo (? Ausente
Anti-cheat Team


Plugin developer
Mensajes: 341
Registro en: Jun 2015
Reputación: 8
Mensaje: #4
RE: [MYSQ] INSERT/UPDATE Sentence Maker
Justo tenia que hacer un sistema de cuentas, veremos a ver que pex.

Oh god why (AM como red social) (? (? (?
(Venganza le dijo el ganzo ala ganza.)
(Este mensaje fue modificado por última vez en: 02/12/2019 01:33 PM por Pan Bimbo (?.)
02/12/2019 01:33 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Hypnotize Ausente
Miembro Sr.


Plugin developer Donador
Mensajes: 612
Registro en: Dec 2017
Reputación: 13
Mensaje: #5
RE: [MYSQ] INSERT/UPDATE Sentence Maker
Esta muy bueno, sería algo así como
$query->bindValue ??



Solo una duda eso protege caracteres sql??

Mis plugins
[ ZP ] Sistema de Códigos + APP
[ ZP ] Sistema de Códigos SQL
MySQL Admin Vencimiento + APP
Rangos CSGO
Granadas CSGO
Hunger Games
[ SQL ] Crear Tablas
[ ZE ] Ganar Exp en Meta
Tienda por natives
Hats

Image
(05/12/2018 02:58 AM)angel escribió:  Image
(20/05/2019 10:22 PM)Exertency escribió:  
Código PHP:
if(Time <= Time && Time 0

Image

(07/07/2019 01:06 AM)DavidLG escribió:  Los necesito a los dos. Nazi experto en Mapas, y Chema En programacion , con respecto a Scripting.

RoflmaoRoflmao
02/12/2019 02:12 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
PredatorFlys Sin conexión
Miembro Sr.


Mensajes: 609
Registro en: Sep 2014
Reputación: 10
Mensaje: #6
RE: [MYSQ] INSERT/UPDATE Sentence Maker
un novato en mysql se le hará mas fácil de usar :3 aunque igual den aprender mysql
una eternidad para aportarlo ¬¬

Image
02/12/2019 02:22 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
LuKks Sin conexión
Miembro Sr.


Plugin developer
Mensajes: 467
Registro en: Jul 2014
Reputación: 19
Mensaje: #7
RE: [MYSQ] INSERT/UPDATE Sentence Maker
Qué hay de SELECT, DELETE, EXISTS y COUNT?

Eficiente sería que hacer una consulta tome una sola línea de código sino por qué alguien se molestaría escribiendo 5 líneas para hacer un simple update?
Podés comprobar en el sma de mi plugin de estadísticas generales donde armé una función (muy pobre pero sirve como concepto) para realizar muchas consultas pero había quedado breve y simple.

Podés obtener mejores ideas de lo que dije anteriormente acá:
https://github.com/LuKks/like-mysql
https://github.com/LuKks/like-mysql/blob...r/index.js
Para INSERT y UPDATE creo que sería difícil lograrlo en una línea (en AMXX) pero para el resto de consultas es factible.

Además, nombrás a tus funciones como "prepare" pero no son técnicamente consultas preparadas así que tenés que utilizar la función escape en cada valor para evitar SQL injection, de otra forma, nosotros al usar tu código tenemos que usar escape lo cual sería ultra tedioso y extenso, aparte todos se olvidan de hacerlo.

No inspira confianza usar un código donde hay una función llamada "STUPID_FUNCTION".
Podés cambiarlo a "sql_init" y que nosotros tengamos que añadirlo en plugin_init así evitás llamadas innecesarias pero lo importante era el nombre de la función.

Podrías intentar organizar el código en un .inc así como hice en mis redes neuronales o sino también podés crear natives, aunque es más simple include.

(01/12/2019 04:30 PM)totopizza escribió:  Excelente aporte @Sugisaki, estaría bueno también que añadas:
Código PHP:
sql_set_where(where[]=""any:...) // En el caso que sea algun SELECT?
sql_set_order(order[]=""// En el caso que sea algun SELECT?
sql_set_limit(startend// En el caso que sea algun SELECT? 

Nothingdohere

No te olvides del identificador.

Código PHP:
new SQL_DATA:sid sql_prepare_update("pug_stats_player""id='%i' ORDER BY id DESC LIMIT 1"1);
// sql_set_value ...
// sql_execute ... 
vs
Código PHP:
new SQL_DATA:sid sql_prepare_update("pug_stats_player""id='%i'"1);
// sql_set_value ...
sql_set_order(sid"id DESC")
sql_set_limit(sid1);
// sql_execute ... 

Ahora imaginá que tenés 10 updates en todo tu plugin, incluso con 1 update prefiero la primer forma.

02/12/2019 02:37 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Sugisaki Sin conexión
Miembro Destacado


Medalla de aportes Trebol purpura 1k
Mensajes: 1,090
Registro en: Jul 2014
Reputación: 21
Mensaje: #8
RE: [MYSQ] INSERT/UPDATE Sentence Maker
(02/12/2019 02:37 PM)LuKks escribió:  Eficiente sería que hacer una consulta tome una sola línea de código sino por qué alguien se molestaría escribiendo 5 líneas para hacer un simple update?
A que te refieres cuando dices eficiencia?
Tecnicamente no estas enviando consultas por el numero de funciones sql_* que exista en un frame.

"Eficiente" seria realizar una consulta update extremadamente larga de una manera la cual sea legible.

Imagina tener mmmmm 15 columnas, las cual, las acualizas/insertas cada vez que se desconecta un jugador, tendrias que realizar tecnicas en el editor para poder formatear la "Oracion SQL" la cual no se te mezcle datos de una columna con otra, o que te falte una variable, o que agreges columnas nuevas al proyecto. La tecnica que usaba era alinear las columnas con los caracteres de escape y las variables unas abajo de otras para no tener problemas de formato ya que se retrasaria el proyecto

(esto es un ejemplo)
Image

(02/12/2019 02:37 PM)LuKks escribió:  Podés obtener mejores ideas de lo que dije anteriormente acá:
https://github.com/LuKks/like-mysql
https://github.com/LuKks/like-mysql/blob...r/index.js
Para INSERT y UPDATE creo que sería difícil lograrlo en una línea (en AMXX) pero para el resto de consultas es factible.
Proud dejame revisar

(02/12/2019 02:37 PM)LuKks escribió:  Además, nombrás a tus funciones como "prepare" pero no son técnicamente consultas preparadas así que tenés que utilizar la función escape en cada valor para evitar SQL injection, de otra forma, nosotros al usar tu código tenemos que usar escape lo cual sería ultra tedioso y extenso, aparte todos se olvidan de hacerlo.

no esta diseñado para captar datos introducidos por el usuario, si te refieres al nombre, basta con hacer
Código PHP:
sql_set_value(x"x""^"%s^""name 

(02/12/2019 02:37 PM)LuKks escribió:  No inspira confianza usar un código donde hay una función llamada "STUPID_FUNCTION".
Podés cambiarlo a "sql_init" y que nosotros tengamos que añadirlo en plugin_init así evitás llamadas innecesarias pero lo importante era el nombre de la función.
Whatdone
no hace peso esa condicion, se puede mejorar, pero lo hice por lo mas rapido

estare por mejorar esas cositas Proud

Competitive/Face it Pick Up Game (PUG) servidor de prueba: 45.77.94.109:27016 Click para Entrar
Image

(14/08/2015 10:15 PM)Sugisaki escribió:  "El mundo es caotico, irracional e injusto. No tiene ningun significado"
Palabras que desde hace mucho tiempo he buscado para describir, ¿Que es el mundo?
Crab

Código PHP:
if(ayuda && free)
{
    exit();

02/12/2019 04:42 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
LuKks Sin conexión
Miembro Sr.


Plugin developer
Mensajes: 467
Registro en: Jul 2014
Reputación: 19
Mensaje: #9
RE: [MYSQ] INSERT/UPDATE Sentence Maker
(02/12/2019 04:42 PM)Sugisaki escribió:  A que te refieres cuando dices eficiencia?
Tecnicamente no estas enviando consultas por el numero de funciones sql_* que exista en un frame.

"Eficiente" seria realizar una consulta update extremadamente larga de una manera la cual sea legible.

Mala elección mía de palabra, quise decir más productivo en cuanto a escribir el código necesario para realizar la consulta.

(02/12/2019 04:42 PM)Sugisaki escribió:  no esta diseñado para captar datos introducidos por el usuario, si te refieres al nombre, basta con hacer
Código PHP:
sql_set_value(x"x""^"%s^""name 

Eso no evita SQL injection. Lo que sucede es que ^" sirve para insertar comilla sin hacer conflicto de sintaxis en AMXX.
En MySQL los strings van entre comillas y en AMXX los strings también se definen con comillas.

Así sería seguro:
Código PHP:
sql_set_value(x"x""^"%s^""mysql_escape_string(name)) 
Pero el escape lo tiene que hacer tu librería internamente, no es negociable, y aparte nos ahorrás el mysql_escape_string a todos.



Veo mucho código repetido:
Código PHP:
if(== 0)
{
    
len += formatex(query[len], charsmax(query), "`%s`"data);
}
else
{
    
len += formatex(query[len], charsmax(query), ",`%s`"data);


Aprovecho para decir que las llaves quedan mejor así:
Código PHP:
if(== 0) {
  
len += formatex(query[len], charsmax(query), "`%s`"data);
} else {
  
len += formatex(query[len], charsmax(query), ",`%s`"data);


Lo importante es que si vemos código repetido, casi siempre hay una forma de reducirlo:
Código PHP:
len += formatex(query[len], charsmax(query), "%s`%s`"== "" ","data); 

Si paso un string de 300 caracteres no alcanza el buffer:
Código PHP:
stock sql_set_value(SQL_DATA:sql_id, const colum[], const value[], any:...) {
    new 
buf[256], num[4]
    
vformat(bufcharsmax(buf), value4)
    
// ...

Lo mismo para el resto de valores, tablas, queries, etcétera.
Algunas const con valores máximos podría resolverlo, si alguien necesita más sería fácil de incrementar.

__count no provoca un error cuando se pase el límite máximo de integer? Si count vuelve a cero el código seguiría funcionando correctamente?

(Este mensaje fue modificado por última vez en: 02/12/2019 06:47 PM por LuKks.)
02/12/2019 06:15 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Sugisaki Sin conexión
Miembro Destacado


Medalla de aportes Trebol purpura 1k
Mensajes: 1,090
Registro en: Jul 2014
Reputación: 21
Mensaje: #10
RE: [MYSQ] INSERT/UPDATE Sentence Maker
(02/12/2019 06:15 PM)LuKks escribió:  Eso no evita SQL injection. Lo que sucede es que ^" sirve para insertar comilla sin hacer conflicto de sintaxis en AMXX.
En MySQL los strings van entre comillas y en AMXX los strings también se definen con comillas.

(30/10/2014 04:30 PM)meTaLiCroSS escribió:  El string seria tomado como "holamundo'peperulz'jeje'", solo tomara como inicio y termino las comillas dobles, las comillas simples no importaran un huevo. Y un nombre de CS no puede tener comilla doble, entonces no hay de que atarearse.


(02/12/2019 06:15 PM)LuKks escribió:  Aprovecho para decir que las llaves quedan mejor así:
Código PHP:
if(== 0) {
  
len += formatex(query[len], charsmax(query), "`%s`"data);
} else {
  
len += formatex(query[len], charsmax(query), ",`%s`"data);

eso depende del programador no afecta la logica del codigo

(02/12/2019 06:15 PM)LuKks escribió:  Lo importante es que si vemos código repetido, casi siempre hay una forma de reducirlo:
Código PHP:
len += formatex(query[len], charsmax(query), "%s`%s`"== "" ","data); 

Whatdone, si eso lo vi, si ves un poco mas baja esta esa condicion y me dio pereza modificarla
(02/12/2019 06:15 PM)LuKks escribió:  Si paso un string de 300 caracteres no alcanza el buffer:

que columna tendra mas de 256 caracteres? Whatever


(02/12/2019 06:15 PM)LuKks escribió:  __count no provoca un error cuando se pase el límite máximo de integer? Si count vuelve a cero el código seguiría funcionando correctamente?
no hay problema, al momento que se ejecuta sql_execute se elimina los datos referente a la identificacion dejandola libre
PD: tiene que ser uns sv que nunca se apague para que llegue a su valor maximo (2,147,483,647)

Competitive/Face it Pick Up Game (PUG) servidor de prueba: 45.77.94.109:27016 Click para Entrar
Image

(14/08/2015 10:15 PM)Sugisaki escribió:  "El mundo es caotico, irracional e injusto. No tiene ningun significado"
Palabras que desde hace mucho tiempo he buscado para describir, ¿Que es el mundo?
Crab

Código PHP:
if(ayuda && free)
{
    exit();

(Este mensaje fue modificado por última vez en: 02/12/2019 08:53 PM por Sugisaki.)
02/12/2019 07:47 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Enviar respuesta 


Salto de foro:


Usuario(s) navegando en este tema: 1 invitado(s)

Contáctanos | Allied Modders en español | Volver arriba | Volver al contenido | Archivo (Modo simple) | Sindicación RSS