Problemas con Sqllite - Forum

Forum Navigation
You need to log in to create posts and topics.

Problemas con Sqllite

Page 1 of 2Next

hola, estoy experimentando con este tipo de base de datos a traves de la aplicacion, lo que quiero es simplemente mostrar en principio cuantos registros tiene mi base de datos y los datos de ese registro.

Lo unico que me muestra es el numero " 43" como cantidad de registros encontrados cuando en realidad la base solo tiene un registro.

ahora bien,me cree una base de datos simple a traves de "SQLite Browser"con el nombre "GuaviyuServicios" con una tabla "Usuarios" a la cual le agrgue los campos "Nombre" como texto , "Clave" como texto y "Id" como numerico, tambien le agregue un Registro. y la guarde con la extension .db a la base desde la misma aplicacion

Luego copie la base de datos a la misma carpeta donde hago la compilacion

Modifique el archivo Config.php poniendo los datos mios y de mi base:

$adminName="123";
$adminPass="123";

$usersDb="neophp.db";

$fileAlias[0]="file1";
$fileNames[0]="myfile.txt";
$filePermissions[0]="rw";
$fileMaxUserLevel[0]=0;

$fileAlias[1]="file2";
$fileNames[1]="myfile2.txt";
$filePermissions[1]="rw";
$fileMaxUserLevel[1]=0;

$dbAlias[0]="GuaviyuServicios";
$dbNames[0]="GuaviyuServicios.db";

//Select sample
$sqlAlias[1]="cargarTabla";
$sqlQuerys[1]="SELECT * FROM Usuarios";
$sqlMaxUserLevel[1]=0;

 

En este paso tengo mis dudas , ejemplo donde dice :

$usersDb="neophp.db";

Ahi va puesto eso que esta ahi o tambien va el nombre de mi base en ese lugar?

La subrutina a ejecutar dentro de la aplicacion le puse como nombre "CargarTabla" y la modifique:

CreateEmptyArray [tableData]
SetVar [tableData] [data]
ArrayLen [tableData] [totalRecords]
SetVar [currentRecord] 0
SetVar [Nombre] [tableData([currentRecord])('Nombre')]
SetVar [Clave] [tableData([currentRecord])('Clave')]

En modo de experimento agregue un boton que me muestre la cantidad de registros de la base mediante el siguiente codigo:

neoPhpExecSql "GuaviyuServicios" "cargarTabla" "" "CargarTabla"

Al ejecutar la pagina a traves de localhost y presionar el boton me muestra el resultado "43" cuando en realidad hay solo un registro en la base

Hola @gustavo1973,

Necesitaríamos poder echar un vistazo a tu proyecto para saber de donde sale ese 43.
¿Puedes facilitarnos un enlace de descarga? (Necesitarímos el archivo .neoapp, el config.php y la propia base de datos).
De todos modos fíjate por favor en el ejemplo más básico que viene con VisualNEO Web (neoPhpSimplestDataBase.neoapp), verás que el archivo config.php es mucho más sencillo ya que no necesitas la mayor parte de los datos de configuración.

Saludos.

Programa:

https://drive.google.com/open?id=1sVYJSP2Xbu066hMDAGA9eW64mmiUNHEc

Config.php:

https://drive.google.com/open?id=13ePXdj-yF3UbLXi32KhAl54eW3QkDfm7

Base de datos:

https://drive.google.com/open?id=1GgAUReUU3hAYKjpI7EZo54_HikaemJc5

Hola @gustavo1973

El problema es con los permisos de la Query. Tu has puesto esto:

$sqlAlias[1]="cargarTabla";
$sqlQuerys[1]="SELECT * FROM Usuarios";
$sqlMaxUserLevel[1]=0;

Esto hace que solo el administrador pueda ejecutar la query y, como no te has logueado, no te lo permite.
Deberías haber puesto esto para permitir que la query se ejecute aun sin estar logueado en el sistema:

$sqlAlias[1]="cargarTabla";
$sqlQuerys[1]="SELECT * FROM Usuarios";
$sqlMaxUserLevel[1]=-1;

Para comprobar que la información de la base de datos está llegando correctamente a la aplicación, te recomiendo poner una instrucción como esta en tu subrutina de recogida de datos (CargarTabla):

AlertBox "Datos recibidos:" "[data]" ""

De este modo podrás saber si ha habido algún problema en la recepción de los datos.
Verás como ahora si funciona correctamente.

Saludos!

Muchas gracias Luis

Ahora una consulta, precisamente donde estava el error

mi pregunta es, cada vez que quiera hacer un llamado a una tabla determinada tengo que agregar ese codigo en el archivo Config.php o ese codigo me sirve para llamar a cualquier tabla de mi base de datos?

  1. $sqlAlias[1]="cargarTabla";
  2. $sqlQuerys[1]="SELECT * FROM Usuarios";
  3. $sqlMaxUserLevel[1]=-1;

En el ejemplo de arriba la consulta es la tabla "Usuarios" pero que pasa si quiero llamar a otra tabla?repito el codigo con el nombre de la otra tabla?

No se si logro explicarme, o puedo poner una variable por la cual pasar la tabla en la cual quiero hacer la consulta:

  1. $sqlAlias[1]="cargarTabla";
  2. $sqlQuerys[1]="SELECT * FROM [TablaSelecionada]";
  3. $sqlMaxUserLevel[1]=-1;

Hola @gustavo1973,

Fíjate que todo el código que hay en config.php no es NeoScript, sino PHP. Así que no es posible utilizar variables de VisualNEO dentro de él. Además no es buena idea, por razones de seguridad, exponer el nombre de las tablas de modo que cualquiera pueda verlo en el código fuente.

Así que la respuesta es que conviene definir una query diferente para cada tabla.

Lo que si es posible es pasar parámetros a la query desde VisualNEO Web.
Mira el siguiente ejemplo de query en config.php:

$sqlAlias[1]="cargarTabla";
$sqlQuerys[1]="SELECT * FROM Usuarios where id > ?";
$sqlMaxUserLevel[1]=-1;

El signo de interrogante será sustituido por el parámetro enviado desde la instrucción neoPhpExecSql en VisualNEO WEb:

neoPhpExecSql "GuaviyuServicios" "cargarTabla" "10" "CargarTabla"

En este caso el valor enviado es 10, por lo que es como si ejecutásemos esta query:

$sqlQuerys[1]="SELECT * FROM Usuarios where id > 10";

Pueden utilizarse tantos parámetros como queramos, por lo que podemos usar querys muy complejas. Los parámetros se separan unos de otros en neoPhpExecSql con "::" tal y como viene explicado en la ayuda del propio comando.

 

Holas:

Siguiendo este hilo tengo un problema similar, esto debería de ser así entonces?:

PHP:

//Insert sample
$sqlAlias[2]="insertararticulo";
$sqlQuerys[2]="INSERT INTO Art (categ, nombre, descript) VALUES (?,?,?)";
$sqlMaxUserLevel[2]=-1;

Mi tabla se llama Art y mis campos son categ, nombre, descript y coloque el userlevel en -1 para que cualquiera pueda ejecutar la consulta.

Ahora bien, en VisualNeo creo los campos, le asigno las variables y en el botón procesar pongo:

neoPhpExecSql "db1" "insertararticulo" "[cat]::[nombre]::[descript]" ""

Si esto esta correcto hay algo que tengo mal en el php o en alguna parte porque al iniciar el neoPHP y entrar en localhost todo parece funcionar excepto que nada se agrega a la SQL.

Saludos!

Muchas gracias luis por la ayuda, me ahorrastes de preguntarte lo de pasar parametros que no lo tenia muy claro, ahora bien que pasa si el parametro a buscar no es numerico? en el archivo de busqueda debe ponerse sin comillas como en el ejemplo que distes de buscar el Id numero 10?

  1. $sqlQuerys[1]="SELECT * FROM Usuarios where id > 10";

o deberia ser con comllas:

  1. $sqlQuerys[1]="SELECT * FROM Usuarios where Clave = 'Horacio' ";

Estuve haciendo unas pruebas intentando pasarle parametros:

  1. neoPhpExecSql "GuaviyuServicios" "cargarTabla" "[Clave]" "CargarTabla"

Le agregue en la subrutina un ALERTBOX que me muestre la cadena devuelta del servidor

Obteniendo dos resultados diferentes dependiendo del valor que le paso en la variable CLAVE

si el valor pasado por parametro coincide con algun registro no me muestra el ALERTBOX y me queda bloqueada la pantalla teniendo que Actualizar

Si el valor pasado por parametro no coincide con ningun registro en la base me muestra el ALERTBOX con una cadena vacia que supongo es lo correcto

CORREGIDO:

Creo que ambos estais teniendo el mismo problema.
Si el parámetro no es numérico hay que utilizar comillas simples en la query.
En el ejemplo de @palamar sería:

$sqlQuerys[2]="INSERT INTO Art (categ, nombre, descript) VALUES (?,?,?)";

El resto creo que ambos lo estáis haciendo correctamente.
Ya me diréis.

Hola Luis; pues no, no funciona, al menos para mí.

Hago exactamente como mencionas en la consulta, por lo que creo que el problema puede estar en la acción de VisualNeo:

neoPhpExecSql "db1" "insertarenbdd" "[categ]::[nombre]::[descript]" ""

Una vez compilado, creada la base de datos (con SQLite browser) y copiada a la carpeta raíz junto al php con las consultas configuradas. Ejecuto y nada, al menos en el SQLite no se agrega ningún parámetro (no se crea el registro). No sé que puedo estar haciendo mal porque lo veo bastante sencillo ahora. Revise que el alias y el nombre de la BDD estén correctos (No sé si respeta mayúsculas o minúsculas así que por las dudas directamente puse todo en minúsculas), la consulta en el php se llama tal cual la llamo en la acción neoPhpExecSql.

@palamar, envíame un .zip con el proyecto para que le eche un vistazo o compártelo mediante un enlace aquí por favor.
Sólo necesito la base de datos, el archivo config.php y el .neoapp.
Lo miro y te digo algo.

SI por la mañana no puedo resolverlo estaré enviándote un zip. La pregunta rápida es, estoy equivocado en la sentencia de arriba o esta bien expresada?, es necesario poner el form de alguna manera especial o lo que importa es que las variables tengan contenido y ya?. Dime eso a ver si puedo darle en la tecla. Saludos y gracias!

@palamar, aparentemente está bien.
No hay nada especial que debas hacer. Echa un vistazo a los ejemplos que vienen con el programa y que permiten añadir y eliminar registros a ver si te dan una pista. Si sigue sin funcionar, me dices.
Saludos.

Bien, despues de tanto dar vuelta he logrado resolver parte del problema. A tener en cuenta:

  1. No fue necesario poner las ' comillas simples para que los datos se ingresaran correctamente (Incluso siendo de texto). De hecho se guarda el ? cuando las pongo.
  2. Cuando SQLite guarda la base de datos creada lo hace sin extensión, al menos que se la demos manualmente el PHP busca el archivo con extensión, al no encontrarlo pues nada se graba en la BDD.

Despues de ver eso sigo teniendo un problema y es que cuando le doy al botón se generan tantos registros como columnas tengo. digamos, en el ejemplo ya dado:

neoPhpExecSql "db1" "insertarenbdd" "[categ]::[nombre]::[descript]" ""

Se crean 3 registros. En el primero encuentro el primero de los datos, en el segundo encuentro el primero mas el segundo y en el último el registro como debería ser. No hay loop ni nada raro...entonces?.

Saludos!

@palamar, efectivamente:

  1. Hay un bug en el plugin neoPHP que hace que la query se ejecute tantas veces como parámetros se le pasan. Adjunto aquí el plugin corregido y un pequeño ejemplo de inserción de datos.
  2. Al utilizar PDO (como hace neoPHP, NO deben ponerse comillas en el caso de las cadenas de texto). He corregido el texto en donde comentaba que había que ponerlas.

Por favor, instala el plugin corregido y confírmame que ahora todo funciona correctamente.
¡Gracias!

Uploaded files:
  • You need to login to have access to uploads.

Hola Luis:

Pues funciona de maravilla ahora. Que bueno que haya servido para resolver un bug. Bien, voy a comenzar con el tema usuarios y voy a ver si puedo mostrar ciertas cosas en grilla como mencioné en otro post. Estaré posteando en el otro post o abriré nuevos según las dudas para que no se mezclen.

Gracias!

luishp has reacted to this post.
luishp

Hola, necesito pasar el valor de [TotalRecords] desde la subrutina a la pagina para saber cuantos registros encontro pero me encuentro que si intento usar esa variable en otra parte del programa una ves recibidos los datos me la da vacia pero dentro de la subrutina tiene un valor

Existe alguna manera de definir una variable tipo GLOBAL como en VisualNeoWin para poder usarla en toda la aplicacion?

Otro problema que tengo es que necesito borrar la variable en la cual el usuario puso la clave de acceso en caso de que no sea la correcta para que lo haga nuevamente y tambien hacer foco en el campo de ingreso numerico, todo esto desde la subrutina y no me permite hacerlo

Y ya aprovecho a sugerirte que estaria bueno poder asignar teclas a los botones ingresados como lo hacemos en VISUAL NEO WIN

@Gustavo1973:

I need to pass the value of [TotalRecords] from the subroutine to the page to know how many records I found but I find that if I try to use that variable in another part of the program, once the data is received, it is empty but within the subroutine a value

Is there any way to define a GLOBAL type variable like in VisualNeoWin to be able to use it in the whole application?

1) Define the parameter that references the variable as Type = VARNAME

2) This NeoScript subroutine (called gkPopulateVariableNeo) ...

... example of returning value in requested variable
SetVar [gkAnswer] "Answer from NeoSub"
SetVar "[gkVariableFromNeoSub]" "[gkAnswer]"

... can be called using something like ...

gkPopulateVariableNeo "[thisvariable1]"
AlertBox "thisVariable1" "[thisVariable1]" ""

3) This Javascript subroutine (called gkPopulateVariableJS) ...

// example of returning value in requested variable
gkAnswer = "Answer from JS Subroutine";
$App[gkVariableFromJSSub] = gkAnswer;

... can be called using something like ...

gkPopulateVariableJS "[thisVariable2]"
AlertBox "thisVariable2" "[thisVariable2" ""

 

 

@Gustavo1973:

I need to delete the variable in which the user entered the password in case it is not correct to do it again and also focus on the numerical entry field, all this from the subroutine and it does not allow me to do it

I am not sure what is meant by "and also focus on the numerical entry field" ... but let us say that the variable for the Password Input is [userPass] ... then a button that calls a subroutine like so ...

gkDeletePassword "[userPass]"
AlertBox "userPass" "[userPass]" ""

... will do it ... your subroutine's first parameter (say [passwordVar]) must be defined as Type = VARNAME ... the subroutine can then ...

SetVar "[passwordVar]" ""

... or even better ...

a) you can set the initial-value of the Password Input to be a variable

b) pass this variable's content to the subroutine (as an additional parameter) ... so the subroutine can reset the value of the password to its initial-value

Page 1 of 2Next