PDA

Ver la Versión Completa : [ CONSULTA ] Comunicarse con otro dispositivo sin plugin -> Crear un WebService con PHP para una DB SQL en la Web


Rsc
11/09/17, 16:16:39
Buenas, continuo con una app que utilizo para llevar la contabilidad de goles de un juego de fútbol y quiero mejorar la forma en la que se sincroniza un archivo compartido de Dropbox.

Para ello, tengo una DB SQL en la que guardo los registros, y por lo pronto al iniciar la app, utilizo el plugin Dropsync para sincronizarlo.

Después de la acción de sincronización, utilizo una acción de "espera hasta" y muestro un texto "Cargando..." Hasta que la sincronización haya sido completada.

El problema es que esa sincronización dura alrededor de 10 segundos, y lo veo excesivo.

He contemplado sincronizar cada X tiempo, y así cuando cualquiera inicie la app, el archivo ya esté listo y no tenga que volverlo a sincronizar, pero no lo veo efectivo, por el consumo de batería y porque cabe la posibilidad de que se abra sin haber sido actualizado.

La mejor opción es que cuando uno haga cambios en la base de datos, se comunique con el resto de tal forma que provoque un evento al que pueda responder con una sincronización.

He pensado en una llamada, un WhatsApp.. pero ninguna de las opciones son automáticas, y quería saber si a alguien se le ocurre algo mejor.

EDITO: Ha medida que se han ido planteando ideas para conseguir este fin, a WillyWeb se le ocurrió que sería mucho más efectivo interactuar con un DB SQL alojada en la web, en vez de con una DB SQL alojada en una carpeta compartida de Dropbox. Aunque en principio parecía un proyecto muy complicado, finalmente se ha conseguido, y a continuación dejo el enlace del hilo que se ha creado sobre esto, en el que intento detallar paso a paso, todo lo que me ha ido explicando WillyWeb.

Crear un WebService con PHP - Iteractuar con una DB SQL en la Web (Pendiente de añadir los últimos avances)
http://www.htcmania.com/showthread.php?p=27156494

Aunque el tema se ha ido desviando poco a poco hasta que solo nos hemos centrado en conseguir todo lo relacionado con el WebService, en este hilo también podéis encontrar algunas ideas para comunicarse con otro dispositivo, pero eso sí, por lo pronto únicamente con la ayuda de plugins.

Caravantes
12/09/17, 13:54:36
La mejor opción es que cuando uno haga cambios en la base de datos, se comunique con el resto de tal forma que provoque un evento al que pueda responder con una sincronización.

Suponiendo que todos los dispositivos tengan Tasker...
Suponiendo que no te importe instalar una app adicional (lo dudo porque en el título has puesto "sin plugin")...

Creo que los dos hilos siguientes aportan pistas que pueden ayudarte:

Tasker para principiantes: Lección 6. Autoremote.
http://www.htcmania.com/showthread.php?t=569291

Comunicacion entre androids bt o wifi lan para enviar tareas o variables
http://www.htcmania.com/showthread.php?t=1279076

Rsc
12/09/17, 16:03:41
Gracias Caravantes, pero dado que ya necesitamos usar Dropsync, en principio voy a evitar tener que usar otra app más.

Cómo es una app para un grupo de amigos, creo que al final optaré por que el detonante sea un mensaje de WhatsApp, aunque quede un poco chapuzas.

Mx WaR HaBiB
13/09/17, 22:15:18
app que utilizo para llevar la contabilidad de goles de un juego de fútbol

buen día estimado.

hace tiempo que te veo escribiendo sobre el tema y la verdad que ya tengo curiosidad :silbando:

podrías describir que hace tu tarea o si es posible compartirla para ver como funciona?

de antemano gracias por darle vida a este subforo tan guay! :platano:

Saludos!

Rsc
13/09/17, 22:52:12
Claro, acabo de subir un par de vídeos para el que quiera, pueda ver el resultado.

Cómo he comentado, es para llevar la contabilidad de goles y tarjetas de un juego de fútbol, que mis amigos y yo llevamos jugando toda la vida.

Antes lo anotabamos en una libreta, pero por desgracia ahora vivimos cada uno en una punta de España y hay que recurrir a Tasker.

https://youtu.be/TCGXjdOzBHk

https://youtu.be/vBLn46eZ-Nk

Mx WaR HaBiB
13/09/17, 23:00:03
contabilidad de goles y tarjetas de un juego de fútbol,

que hermosa interfaz... :cry:

todos pueden interactuar y agregarles goles, tarjetas o solo el admin?

me gustaria saber mas al respecto hay alguna manera?

gracias por compartir! :aplausos:

Rsc
13/09/17, 23:21:01
que hermosa interfaz... :cry:

Muchas gracias!

todos pueden interactuar y agregarles goles, tarjetas o solo el admin

La tabla Sqlite la ubico en una carpeta compartida de Dropbox, y ahí mismo puedes configurar quien tiene acceso a lectura y escritura sobre ese archivo.

También podrías poner cualquier tipo de condición en Tasker, para hacer cualquier tipo de modificación. Por ejemplo, que al iniciar la primera vez la app, requiera una contraseña (una acción de consultar variable) y en cada elemento de la escena que se pueda modificar la tabla, utilizarla como IF.

Ah, para que funcione, hace falta Dropsync, que en este caso lo uso como plugin de Tasker, para que cada vez que se haga una modificación, se actualice el archivo de la nube, porque claro, no se puede trabajar con un archivo que se encuentre únicamente en la nube.

Y poco más, la app básicamente se basa en el uso de tablas Sqlite, y todo lo he aprendido en el hilo que tenemos en este foro sobre este tema, gracias a los compañeros que se han molestado en explicarlo detalladamente, sobretodo en este caso danko9696, que entre otras cosas es el culpable de que el texto del elemento menú, se vea bien alineado.

WillyWeb
14/09/17, 08:35:21
Ah, para que funcione, hace falta Dropsync, que en este caso lo uso como plugin de Tasker, para que cada vez que se haga una modificación, se actualice el archivo de la nube, porque claro, no se puede trabajar con un archivo que se encuentre únicamente en la nube.

Pues me parece que eso no es del todo cierto. :silbando:

Yo investigaría la posibilidad de montar la base de datos online en uno de los cientos de alojamientos web gratuitos que proporcionan MySQL para acceder a ella remotamente desde tu aplicación en Tasker. Eso eliminaría de raíz el problema de sincronizar el archivo ya que los datos estarían disponibles para todos nada más ser editados.

Lo que no te puedo decir es el grado de dificultad que puede tener eso :oh:

danko9696
14/09/17, 16:11:14
Pues me parece que eso no es del todo cierto. :silbando:

Yo investigaría la posibilidad de montar la base de datos online en uno de los cientos de alojamientos web gratuitos que proporcionan MySQL para acceder a ella remotamente desde tu aplicación en Tasker. Eso eliminaría de raíz el problema de sincronizar el archivo ya que los datos estarían disponibles para todos nada más ser editados.

Lo que no te puedo decir es el grado de dificultad que puede tener eso :oh:
Algo he visto respecto a eso:
https://www.reddit.com/r/tasker/comments/3ypact/help_tasker_and_phpmyadminmysql/?st=j7kj740x&sh=4a5e7924

Rsc
14/09/17, 16:15:33
Gracias WillyWeb, se me olvidó añadir antes de esa afirmación un "que yo sepa..."

Eso que comentas mejoraría considerablemente el funcionamiento de la aplicación, voy a ver si encuentro algo de información y si soy capaz de implementarla en este proyecto. Un saludo

Edito: Justo cuando he enviado este mensaje, he visto tu comentario danko, gracias de nuevo.

WillyWeb
14/09/17, 16:30:34
Algo he visto respecto a eso...

En esa conversación tratan otra forma de atacar el problema que tampoco está nada mal, aunque requiere conocimientos de PHP ya que se tienen que crear unos script del lado del servidor que hagan de intermediarios entre tu aplicación y la base de datos remota. Los datos van y vienen a base de acciones HTTP Get/Post con los campos y valores pertinentes. Si encuentras esos scripts hechos (es cosa de buscar un poco) seguramente este método es más fácil de implementar en una aplicación de Tasker.

Mi propuesta era más directa ya que se trata de conectar directamente con la base de datos sin usar intermediarios. La pega puede estar en crear la conexión (lo que he visto es a base de Java) y en saber si Tasker es capaz de tratar con una base de datos remota (que no lo he mirado nunca).

Entretenimiento asegurado para el que se meta en el charco. :silbando:

Rsc
15/09/17, 23:14:44
Bueno, por mucho que intento buscar información, no consigo ni acercarme a la solución.

He creado una base de datos, con una única tabla en un servidor SQL, pero no encuentro la forma de comunicarme con ese servidor y de manipular la DB.

Copio a continuación lo que incluyo en la acción HTTP Get:

Mysql Server (2)
A1: HTTP Get [ Server:Port:sql11194714:[email protected] tabase.com Path: Attributes:show tables; Cookies: User Agent: Timeout:30 Mime Type: Output File: Trust Any Certificate:Off ]
A2: Flash [ Text:%HTTPR Long:Off ]

En esa tarea figura el usuario y la contraseña, que según indica la guía de Tasker, tiene que preceder al servidor de la siguiente manera

Usuario:contraseña@

Dejo los datos de la DB, por si alguien se anima a intentarlo, sin tener que crear una nueva.

Un saludo.

WillyWeb
16/09/17, 11:29:35
Es que creo que esa no es la forma de hacerlo :loco:

Por lo que he visto tienes dos opciones:


Conectar directamente con la base de datos remota (lo poco que he visto lo hacían con Java). Este sistema de debería permitir atacar directamente a la base de datos con comandos SQL. Para poder hacer esto necesitas un servidor que permita conexiones externas, que el soporte de Java de Tasker/Android tenga las instrucciones que necesitas y que el soporte de SQL de Tasker/Android sea capaz de tratar con una base de datos remota.
Dejar la conexión con la base de datos y los comandos SQL en manos de un script en PHP del lado del servidor y enviar/recibir los datos a base de HTTP Post/Get. Para esto necesitas ese script PHP reciba tus solicitudes HTTP y devuelva los datos en JSON o XML (para que sean fáciles de procesar con JavaScript, por ejemplo).


Al margen de la complejidad de cada uno de esos sistemas, en esa acción que has puesto parece que has mezclado los dos conceptos. :rolleyes:

Rsc
16/09/17, 11:59:18
Por lo que comentas, y lo que he estado viendo relativo a este tema, son conceptos que sin tener una base de conocimientos de programación, son difíciles de entender.

No obstante, seguiré echando un vistazo por si encuentro algún ejemplo de esos script que mencionas, que se puedan utilizar en Tasker.

WillyWeb
16/09/17, 19:08:53
Después de curiosear un poco no parece tan complicado :D

He visto que de los dos métodos que te he propuesto el más utilizado es el segundo (usar un script PHP que haga de intermediario entre la DB y la aplicación del móvil). Ese "concepto" recibe el nombre técnico de "WebService" y una vez que tienes la palabra clave Google te proporciona docenas de sitios con tutoriales sobre el tema.

En este sitio describen los scripts básicos que debe tener un proyecto típico. No es exactamente lo que necesitas pero te ayudará a ver que la cosa es relativamente sencilla.

http://programacion.net/articulo/como_interactuar_con_una_base_de_datos_mysql_usand o_php_141

En este otro sitio crean un proyecto completo (aplicación Android, DB y scripts PHP). No te pierdas en la creación de la aplicación Androd y salda al punto 5.

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

Nada de eso te soluciona el problema, pero es un buen punto de partida. Simplemente busca "crear webservice para aplicación android" (o algo parecido) y encontraras docenas de tutoriales.

Suerte :rolleyes:

Rsc
16/09/17, 22:07:43
Gracias WilliWeb, le he estado mirando por encima y tiene mejor pinta que lo que yo había ido leyendo hasta ahora. Por lo menos está todo bien explicado. Además, como tu dices, el saber que el termino que lo denomina es WebService, me facilitará mucho a la hora de buscar información.

Iré comentando por aquí los progresos, en caso de que haya. Saludos.

Rsc
16/09/17, 22:08:22
Mensaje duplicado

WillyWeb
17/09/17, 14:58:24
He seguido investigando un rato más y me he dado cuenta de algo a tener en cuenta desde el minuto cero. :oh:

La mayor parte de los ejemplos/tutoriales que he visto hacen uso de la arquitectura REST (https://es.wikipedia.org/wiki/Transferencia_de_Estado_Representacional) para construir la URL que recibe el WebService. En REST los "verbos" (las ordenes) no se pasan en la URL sino con el método HTTP (GET/POST/PUT/DELETE principalmente) y Tasker sólo soporta GET/POST, así que ya te puedes ir olvidando de implementar cualquier ejemplo de los que encuentres en el que se mencione REST. :cry:

Pero tranquilo, que no está todo perdido :-)

Revisa este ejemplo...

http://tosblama.blogspot.com.es/2015/02/crear-un-webservice-con-php.html

Es de una simplicidad extrema. Usa GET o POST indistintamente. Y lo mejor es que con muy pocos cambios/ajustes creo que lo podrías usar en tu proyecto.

Espero que te apañe :rolleyes:

danko9696
18/09/17, 19:03:23
Como ha dicho antes Caravantes yo antes de meterme en esos berenjenales probaría con autoremote, enviando y recogiendo las notificaciones como cadenas a las que luego puedes aplicar split/join para integrarlo en la base de datos local y funcionar como hasta ahora.

Y una vez hecho, tranquilamente, ponerse poco a poco con el tema del servidor web, que creo que es la mejor solución a más largo plazo, aunque la más complicada también.

WillyWeb
18/09/17, 20:54:31
Como ha dicho antes Caravantes yo antes de meterme en esos berenjenales probaría con autoremote...

Es que en el post #3 ya dejó claro que no quería usar otra aplicación. :loco:

Y no es que no sea un proyecto interesante inventar algo que notifique a los otros usuarios que la DB ha sufrido cambios para que procedan a descargarla, que lo es. Pero sería trabajo perdido si al final tira por la solución de usar una DB remota, que al margen de su complejidad (y después de mirarlo un poco ya no me lo parece tanto) yo diría que es la mejor solución al problema.

danko9696
18/09/17, 21:08:59
Es que en el post #3 ya dejó claro que no quería usar otra aplicación. :loco:

Y no es que no sea un proyecto interesante inventar algo que notifique a los otros usuarios que la DB ha sufrido cambios para que procedan a descargarla, que lo es. Pero sería trabajo perdido si al final tira por la solución de usar una DB remota, que al margen de su complejidad (y después de mirarlo un poco ya no me lo parece tanto) yo diría que es la mejor solución al problema.
No me refería a notificar a los otros usuarios de que la BD ha sufrido cambios, sino a que la propia notificación contenga información útil que se pueda integrar directamente en la base de datos local. Creo que sería muy sencillo y rápido de hacer y el tiempo perdido sería mínimo, por eso lo digo. Puede aprovechar casi todo lo que tiene hecho, ya que seguiría funcionando en local y sería añadir un envío/recepción de notificación con las modificaciones realizadas (por ejemplo si se ha hecho un insert, enviar la consulta entera del insert en la notificación). La única pega que veo así rápido sería el tener que usar otra aplicación extra, y bueno, que es una solución un tanto ñapa, pero para un grupo pequeño podría servir para salir al paso mientras se investiga la definitiva.

WillyWeb
18/09/17, 22:25:38
No me refería a notificar a los otros usuarios de que la BD ha sufrido cambios, sino a que la propia notificación contenga información útil que se pueda integrar directamente en la base de datos local.

La única pega que veo así rápido sería el tener que usar otra aplicación extra, y bueno, que es una solución un tanto ñapa...

Pues ya lo has dicho todo. :rolleyes:

Y luego está el pequeño problema de que la versión gratuita de AutoRemote sólo permite enviar dos caracteres ...

https://play.google.com/store/apps/details?id=com.joaomgcd.autoremote.lite

Nada que no se pueda solucionar convenciendo a RSC y sus colegas de que cada uno de ellos compre la versión completa por poco más de 3,5 €.

https://play.google.com/store/apps/details?id=com.joaomgcd.autoremote

:silbando:

Una aplicación extra, que tienen que comprar, para hacer una ñapa por no montar un WebService que ya está casi hecho.

Vale ... :maburro:

Rsc
18/09/17, 22:44:12
Realmente, es que poco a poco se ha ido "desviando" la cuestión inicial. Entre comillas porque no ha sido un desvío que haya dejado de lado la consulta, si no que ha surgido una idea alternativa y en caso de que funcione, mucho más efectiva para no tener que comunicarme con los otros teléfonos.

Digo esto, por que quizás en algún momento procede modificar el título de la consulta, ya que sería interesante que si hay un hilo en el que se consiga trabajar desde tasker en una DB ubicada en un servidor, estaría bien que sea fácil de localizar. Creo que podría dar mucho juego.

No obstante, por ahora no he logrado que funcione ni tengo muy claro donde tengo que poner cada parte del código que figura en la página que ha compartido WillyWeb, aunque tampoco he tenido mucho tiempo para probar.

Iré comentando en caso de que haga algún avance. Un saludo.

WillyWeb
18/09/17, 22:52:58
La verdad es que sí que nos hemos ido un poco del tema inicial y puede que sea buena idea cambiar el título del tema. :rolleyes:

Si decides seguir con lo de la DB remota no te olvides de comentar tus progresos. Y si necesitas ayuda con el tema ... ya sabes. :silbando:

Rsc
18/09/17, 23:38:00
Puede aprovechar casi todo lo que tiene hecho, ya que seguiría funcionando en local y sería añadir un envío/recepción de notificación con las modificaciones realizadas (por ejemplo si se ha hecho un insert, enviar la consulta entera del insert en la notificación)

Cuando se mencionó Autoremote había entendido que era para comunicar la modificación, y así sincronizar Dropsync, para lo cual harían falta ambas apps + la mía. Pero la idea de insertar el código en el mensaje de Autoremote y no tener que ubicar la DB en la nube, es muy buena.

Pero claro, yo si que tengo la versión de pago de AR desde que utilizo Tasker, y realmente para el que la use, no es dinero. Pero no quiero pedirles que se compren una app, que no van a utilizar nada más que para esto. Sobretodo por que la idea de esta app, es que sea menos engorroso llevar a cabo la contabilidad, y de no ser así, decidirían seguir usando un excel en la nube como hicimos el año pasado.

No obstante, esto mismo que has comentado se podría hacer con cualquier otra app de mensajería, de las que todos llevamos instaladas en el teléfono. Sería también un poco chapuza, pero podría funcionar.

Aún así, continuaré intentando lo de la DB en el servidor, que sigue siendo la solución más atractiva.

La verdad es que sí que nos hemos ido un poco del tema inicial y puede que sea buena idea cambiar el título del tema.

Veo la opción de cambiar el título, o la opción de crear otro hilo nuevo, en el que figure un enlace a este, así se mantiene también lo de "comunicarse entre dispositivos sin plugin" que también puede interesarle a alguien.

Eso lo dejo a criterio de los que os encargáis de que el foro esté bien organizado.

Si decides seguir con lo de la DB remota no te olvides de comentar tus progresos.

Como he dicho, creo que es la opción más eficaz para que varias personas puedan tener acceso a una DB, y claro está que cualquier avance lo pondré por aquí.

Y si necesitas ayuda con el tema ... ya sabes.

Se agradece, y todo apunta a que voy a necesitarla.

Rsc
19/09/17, 01:01:36
En el código que figura en ese enlace, únicamente soy capaz de completar, lo que indica literalmente que va en ese lugar. Como cuando se refiere a ('servidor','usuario','clave') etc, pero hay muchos campos que no soy capaz de averiguar que tengo que poner.

También creo que es complicado entender ese método que comenta de configurar las consultas en un archivo XML.

Creo que me va a hacer falta más ayuda de la que pensaba para conseguir esto... Quien lea mis comentarios de hace 3 o 4 años, comprobará que no sabía ni como funcionaban las variables. :sisi1:

WillyWeb
19/09/17, 10:13:16
Como ya has podido ver el sistema se basa en dos archivos. Un PHP (webservice.php) con el código del WebService y un XML (opciones.xml) con las consultas SQL que usa el proyecto.

El código PHP lo he puesto aquí (https://pastebin.com/qERR9wYq) para que sea más fácil de leer.

En ese archivo debes cambiar las líneas 56 (servidor_base_datos, usuario, clave) y 57 (base_de_datos) por los valores correspondientes a tu base de datos.

Y si quieres (no es obligatorio) también podrías cambiar en las líneas 3, 4 y 5 las palabras clave 'opcion', 'listaParametros' y 'format' por otras más cortas. Esas "palabras" son los nombres de los parámetros que se pasan al WebService en la URL de esta forma...

http://servidor/webservice.php?opcion=oooo&listaParametros=pppp&format=ffff

Yo pondría algo del estilo 'opc', 'par' y 'fmt' (soy de abreviar mucho, lo siento) para que la URL quede lo más corta/manejable posible, aunque ya te digo que esto no es obligatorio.

El archivo XML, que también he puesto aquí (https://pastebin.com/jbWf708h) para que se vea mejor, contiene las sentencias SQL que necesita tu proyecto. Puede que esta parte sea la más complicada de entender, pero es la que hace de este sistema una solución casi universal para este tipo de proyectos.

Si te fijas bien en el XML tienes varios bloques <opcion>...</opcion>, uno por cada sentencia SQL que necesites. Y dentro de cada <opcion> tienes un <nombre>...</nombre> y un <SQL>...</SQL>.

En <nombre> puedes pones lo que quieras pero te recomiendo usar términos descriptivos del propósito de la sentencia SQL. Si has creado una sentencia para listar los goles de un jugador yo usaría 'golesjugador'. Si tienes otra para obtener el listado de todos los jugadores podrías usar 'listajugadores'. Y así con todas las demás sentencias que necesites.

Evidentemente en el campo <SQL> tienes que poner la sentencia SQL, pero con un pequeño matiz. Si esa sentencia tiene un parámetro que pueda ser variable (como el nombre del jugador) debes poner '#PARAMETRO_1#' en su lugar (mira la línea 9 del XML de ejemplo). Si la sentencia tiene más de un parámetro de ese tipo pones '#PARAMETRO_1#' y '#PARAMETRO_2#'. Y así con todos los parámetros que necesite la sentencia.

Suponiendo que ya tienes todo montado tal y como te he propuesto conseguir la lista de jugadores en formato JSON sería algo así...

http://servidor/webservice.php?opc=listajugadores&fmt=json

O conseguir la lista de goles de Juan sería algo así...

http://servidor/webservice.php?opc=golesjugador&par=juan&fmt=json

Por cierto, si necesitas pasar varios parámetros los tienes que separar con '#' de esta forma

http://servidor/webservice.php?opc=nombre&par=param1#param2#param3

Y eso es todo.

¿Mejor ahora? :rolleyes:

Rsc
19/09/17, 12:39:25
¿Mejor ahora?

Mucho mejor, el único problema es que tenía cosas que hacer esta mañana, y esto me ha atrapado jeje

He modificado el código PHP así como el XML con los parámetros relativos a mi DB.

En lo que se refiera al XML, entiendo que si únicamente quiero hacer una consulta, solo hace falta un bloque, no? Lo digo por simplificar la sentencia hasta que lo domine.

<?xml version="1.0" encoding="utf-8" ?>
<OpcionesDisponibles>
<opcion>
<nombre>listajugadores</nombre>
<SQL>SELECT jugador FROM goleadores order by jugador = '#PARAMETRO_1#</SQL> //Sentencia incorrecta.
<SQL>SELECT jugador FROM goleadores ORDER BY '#PARAMETRO_1#' ASC</SQL> // Sentencia que sustituye a la línea anterior, correcta.
</opcion>

La siguiente duda que tengo es donde va cada cosa.

Tengo el cógido PHP y el XML modificado, los códigos que me has indicado para conseguir las listas de los jugadores, goles etc, pero ese es el problema, no se donde tengo que poner cada código, donde tengo que guardar el archivo XML... Le estoy echando mucha cara, porque se que me lo estas poniendo muy fácil y aún así no lo termino de comprender...

WillyWeb
19/09/17, 13:32:52
Le estoy echando mucha cara, porque se que me lo estas poniendo muy fácil y aún así no lo termino de comprender...

Tranquilo hombre, yo facturo por horas. Ya te pasaré la receta. :risitas:

En lo que se refiera al XML, entiendo que si únicamente quiero hacer una consulta, solo hace falta un bloque, no? Lo digo por simplificar la sentencia hasta que lo domine.

Correcto. Cada sentencia en un bloque <opcion>. Y no te preocupes por poner muchos. Son gratis y no piden de comer.

Por cierto, esa sentencia que has puesto creo que no es correcta. La parte 'ORDER BY' admite el nombre de una columna y/o uno de los códigos ASC o DESC. Creo que lo de jugador=loquesea no funciona.

Si lo que quieres es crear una sentencia que te proporcione la lista de jugadores ordenados de forma ascendente por una columna concreta la cosa sería así...

SELECT jugador FROM goleadores ORDER BY '#PARAMETRO_1#' ASC

Para más detalles ...
http://www.1keydata.com/es/sql/sql-order-by.php
https://www.w3schools.com/sql/sql_orderby.asp

La siguiente duda que tengo es donde va cada cosa.

El PHP y el XML deben ir juntos en la raíz del alojamiento web que estés usando de forma que puedas escribir una URL como las que puse antes de ejemplo.

Y para enviar esas URL al WebService tienes que usar las acciones 'HTTP Get' o 'HTTP Post' de Tasker.

¿Te referías a eso? :oh:

Rsc
19/09/17, 14:35:50
Correcto. Cada sentencia en un bloque <opcion>. Y no te preocupes por poner muchos. Son gratis y no piden de comer.

Una vez que consiga que funcione, crearé un bloque para SELEC, INSERT, UPDATE etc

La parte 'ORDER BY' admite el nombre de una columna y/o uno de los códigos ASC o DESC

En este caso "jugador" es una columna, normalmente muestro las tres columnas (goles,jugador,usuario) y lo ordeno por mayor número de goles y por orden alfabético. "ORDER BY goles DESC, jugador", pero de igual forma, lo completaré cuando consiga que funcine.

El PHP y el XML deben ir juntos en la raíz del alojamiento web que estés usando

En la web que tengo la DB, veo que hay una pestaña asociada a la tabla, que pone "crear codigo PHP", supongo que es ahí donde te refieres que tengo que copiar el código PHP y el código XML a continuación. Ahora en cuanto me dejen un hueco libre lo probaré.

Tranquilo hombre, yo facturo por horas. Ya te pasaré la receta.

Creo que voy a tener que anular mi suscripción a HTCMANIA :silbando:

Rsc
19/09/17, 17:38:26
Nada, no hay forma.

En la web hay una pestaña relativa a la tabla que pone "crear código php", pero no puedo hacer modificaciones.

Otra opción que he probado es a insertar archivos. Hay una pestaña relativa a la DB que pone "Importar"

Como "importar" requiere un archivo, y no tengo ni idea de que tipo de archivo es... He creado un archivo con el documento de texto de windows y le he llamado CódigoXML.xml y dentro de ese archivo he copiado el código xml y lo mismo he hecho con el código php, en un archivo llamado códigoPHP.php

En las opciones que figuran en la página de Importar, aparece una pestaña donde permite que tipo de formato tiene el archivo, y entre otros puede elegir XML.

Elijo XML importo el archivo y parece que lo hace de forma correcta porque no salta ningún error.

A la hora de importar el archivo .php (Que posiblemente me haya inventado yo hoy esa extensión de archivos), no me da ninguna opción que se asemeje a la extensión php (si es que existe..)

Veo CSV, SQL, ESRI y algunos más. Como ninguno se asemeja lo dejo en SQL, importo mi archivo .php y me salen 40 errores de sintaxis.

Como no tengo ni **** idea de como corregirlos, le doy a ignorar todos y continuo.

Luego, no se porque creo que hay posibilidades de que funcione, después de esos 40 errores, y desde Tasker ejecuto una acción HTTP Get, y en el apartado servidor puerto pongo:

http://servidor/webservice.php?opc=listajugadores&fmt=json No funciona.

Doy por hecho de que donde pone servidor, tengo que poner sql11.freesqldatabase.com (host base de datos)

y pongo esto:

http://sql11.freesqldatabase.com/webservice.php?opc=listajugadores&fmt=json. No funciona.

Continuo haciendo cambios, y donde pone "opc", yo pongo "opcion" porque cuando tu me has aconsejado eso:

Yo pondría algo del estilo 'opc', 'par' y 'fmt' (soy de abreviar mucho, lo siento) para que la URL quede lo más corta/manejable posible, aunque ya te digo que esto no es obligatorio.

Yo no te hecho caso. Bueno realmente lo he querido dejar con las palabras completas para no liarme. Entonces he probado así:

http://servidor/webservice.php?opcion=listajugadores&format=json. No funciona.

Continuaré haciendo pruebas, pero después de ver que la importación del archivo .php ha dado 40 errores, tengo pocas esperanzas.

WillyWeb
19/09/17, 17:50:21
En este caso "jugador" es una columna, normalmente muestro las tres columnas (goles,jugador,usuario) y lo ordeno por mayor número de goles y por orden alfabético. "ORDER BY goles DESC, jugador"...

Correcto. Pero eso no es lo que has puesto en la sentencia inicial. Ojo con ese igual que pusistes antes, que no pinta nada.

En la web que tengo la DB, veo que hay una pestaña asociada a la tabla, que pone "crear codigo PHP", supongo que es ahí donde te refieres que tengo que copiar el código PHP y el código XML a continuación. Ahora en cuanto me dejen un hueco libre lo probaré.

Yo diría que ese no es el sitio.

Más bien suena a una opción de phpMyAdmin que añade código PHP a las sentencias SQL que se van generando automáticamente a medida que manipulas la base de datos. Si se trata de eso no te vale.

En ese alojamiento web tienes que tener algo que te permita gestionar archivos/carpetas (el típico explorador). Eso es lo que tienes que usar para copiar el archivo PHP y el XML en la carpeta raíz del alojamiento. Otra forma en la que también se suele hacer es mediante un acceso FTP.

Creo que voy a tener que anular mi suscripción a HTCMANIA :silbando:

Demasiado tarde. En contador ya está en marcha. :grin:

WillyWeb
19/09/17, 20:00:08
Doy por hecho de que donde pone servidor, tengo que poner sql11.freesqldatabase.com (host base de datos)

Para, para. :loco:

¿Al registrarte en ese sitio cuál de estas opción has elegido?

Free MySQL database (http://www.freesqldatabase.com/freemysqldatabase/)

Free Website Hosting for 30 days (http://www.freesqldatabase.com/free-website-hosting/)

Si es la primera no te vale, y si es la segunda sólo te vale durante 30 días. :oh:

Rsc
19/09/17, 21:07:59
Que faena, elegí la primera opción.

Bueno, puedo registrarme con la prueba de 30 días, y si funciona, me planteo pagar por un servidor durante un tiempo, o buscar otra página.

Si me hago el registro de la prueba de 30 días. Hago todo como iba? Con el código en un archivo de texto y poniendo la extensión .XML y .PHP?

WillyWeb
19/09/17, 21:52:31
Bueno, puedo registrarme con la prueba de 30 días, y si funciona, me planteo pagar por un servidor durante un tiempo, o buscar otra página.

Puedes hacerlo como prefieras, pero yo empezaría por localizar un alojamiento que me permita hacer todo lo que quiero. :silbando:

Tienes infinidad de alojamientos web gratuitos con PHP y MySQL, es cosa de buscar un poco...

http://es.lmgtfy.com/?q=alojamiento+web+gratis+con+php+y+mysql

Hago todo como iba? Con el código en un archivo de texto y poniendo la extensión .XML y .PHP?

Ponles los nombre que te puse al principio

PHP ... webservice.php
XML ... opciones.xml

Por cierto, usa sólo minúsculas.

El XML está referenciado en el código y si le pones otro nombre no funcionará. Al PHP si que le puedes poner el nombre que quieras. Simplemente lo tienes que tener en cuenta para ponerlo igual en la URL que le mandas al WebService.

Rsc
20/09/17, 01:19:46
Bueno, he probado a registrarme en otra web, concretamente en http://www.atspace.com/

En la página figuran los siguientes datos relativos a la cuenta;

Hosting Estadísticas de la cuenta
ID de cliente 2454802
Actualización / renovación gratuita de Hosting
Caducidad de cuenta Nunca
Servicios Total disponible Usado
Espacio del disco 1000 MB 0 B
Tráfico Ilimitado 0 B
Dominios 1 0
Subdominios 3 0
DBs de MySQL 1 0
DB de PostgreSQL 0 0
Correos electrónicos 1 0
Actualizar Estadísticas
Nota : ¡El espacio en disco y las estadísticas de tráfico se actualizan cada hora!
Características de la cuenta de alojamiento
Servicios Estado Acción
Límite de tamaño de archivo 15 MB retirar
SMTP EN
Versión de PHP 5.6.31 cambio
Información de PHP ver que es eso
Versión de MySQL 5,7
Servidores de nombres (NS) ver que es eso
Rutas del sistema ver
Opciones de Firewall ver
Ingresar a la configuración de Hosting

Realmente no se distinguir si en este alojamiento web permite hacer lo que estoy intentando. Supongo que en los datos que he puesto, debe de indicarlo.

He creado una nueva DB, con el mismo nombre que la anterior (goleadores) y la misma estructura;

goles (INTYINT) jugador (VARCHAR 14) usuario (VARCHAR 8)

He hecho las correspondientes modificaciones en los archivos "opciones.xml" y "webservice.php", incluido la sentencia SQL en la que habías detectado el error. La he sustituido por la sentencia que has indicado a continuación.

SELECT jugador FROM goleadores ORDER BY '#PARAMETRO_1#' ASC

Lo siguiente que he hecho, ha sido volver a importar ambos archivos. El xml ha dado 4 errores y el php 12. Lo he vuelto a importar igual, dado que no veo nada en esa página que se asemeje a un explorador de archivos.

Por último he ejecutado una acción Tasker HTTP Get, indicando en el campo SERVIDOR:PUERTO

http://servidor/webservice.php?opcion=listajugadores&format=json

Al ejecutar la acción, da "error socked". A diferencia del error que daba cuando lo hacía con la otra web de alojamiento, este salta inmediatamente.

En la otra web, la acción tardaba unos segundos antes de dar el error, e indicaba "error entrada/salida". Creo que el error se debe a que no se copian los archivos a la raiz de alojamiento de la DB, pero tampoco es que lo tenga muy claro.

WillyWeb
20/09/17, 09:31:33
Bueno, he probado a registrarme en otra web, concretamente en http://www.atspace.com/

Vamos por partes que nos estamos perdiendo. :loco:

De primeras ese alojamiento parece que vale. Ahora lo tenemos que configurar para hacer lo que necesitas. Intentaré guiarte poco a poco. :rolleyes:

1. Crear la base de datos.

Esto ya lo tienes así que no te digo nada más. Por cierto, esos errores al "importar" el PHP y el XML son normales por la sencilla razón de que no es la forma correcta de "subir" esos archivos. Lo que la DB espera al importar es código SQL y le estás dando otra cosa, ¿no?.

2. Crear un subdominio.

Panel de control > Herramientas de alojamiento > Gestor de dominios > Crear un Subdominio Gratuito

Selecciona uno de los dominios base que te ofrecen y escribe en la casilla una palabra que te guste. La idea es componer una dirección web de esta forma...

http://miweb.atspace.cc/

Esa será la dirección base (el servidor) de la URL del WebService.

3. Subir el PHP y el XML.

Panel de control > Herramientas de alojamiento > Gestor de archivos

Aparecerá un gestor de archivos/carpetas básico en el que tendrás que seleccionar la carpeta que coincida con el subdominio que has creado antes. Esa carpeta es la raíz de tu WebService y es justo en ese sitio en el que tienes que "subir" los archivos PHP y XML.

4. Prueba básica

Si has llegado hasta aquí al poner la dirección de tu servidor en un navegador web deberías ver una página proporcionada por el alojamiento, y al poner la URL del WebService...

http://miweb.atspace.cc/webservice.php

...deberías ver un mensaje de error (Opcion incorrecta). Eso te indicará que el código del PHP se está ejecutando y que ha sido capaz de cargar el XML.

Te espero aquí. :palomitas:

Rsc
20/09/17, 12:37:29
Deberes terminados.

He creado el subdominio. pruminio.atspace.eu

He subido los archivos a la carpeta del subdominio.

opciones.xml 195 B Archivo XML Sep 20 10:08 -rwxr-xr-x

webservice.php 2.94 KB Archivo PHP Sep 20 10:08 -rwxr-xr-x

y al poner la URL del WebService...

Cuando en el navegador pongo esta dirección http://pruminio.atspace.eu Me manda una página que pone bienvenido a tu nueva página.

Cuando en el navegador pongo http://pruminio.atspace.eu/webservice.php me sale justo el mensaje que has comentado "opción incorrecta"

Cuando ejecuto la acción HTTP Get de Tasker, indicando:

http://servidor/webservice.php?opcion=listajugadores&format=json

El valor de la variable %HTTPR es "200"

Parece que vamos avanzando...

WillyWeb
20/09/17, 13:34:20
Cuando en el navegador pongo http://pruminio.atspace.eu/webservice.php me sale justo el mensaje que has comentado "opción incorrecta"

Correcto. :ok:

Cuando ejecuto la acción HTTP Get de Tasker, indicando:
http://servidor/webservice.php?opcion=listajugadores&format=json
El valor de la variable %HTTPR es "200"

:rolleyes:

Supongo que la prueba la has hecho bien pero la URL correcta no es la que has puesto. Es esta otra...

http://pruminio.atspace.eu/webservice.php?opcion=listajugadores&format=json

Ese "200" sólo indica que el servidor web ha respondido con una página, no que el sistema funcione correctamente. Lo cierto es que no lo hace porque al usar la URL correcta salta un error de conexión con la base de datos y un aviso de que se está usando una función obsoleta para hacer esa conexión. :(

¿Has puesto los datos correctos en la línea 56? (https://pastebin.com/qERR9wYq)

Si están bien puestos el problema será de esa función obsoleta y tocará estudiar un poco de PHP para buscar una alternativa. :silbando:

Por cierto, yo seguiría haciendo las pruebas con un navegador normal y corriente (mejor en un PC) para poder ver bien los resultados.

Rsc
20/09/17, 14:04:32
Supongo que la prueba la has hecho bien pero la URL correcta no es la que has puesto. Es esta otra...

Error mio, en el comentario lo he puesto mal, pero en el acción de Tasker estaba correcto.

Esta son las lines 56 y 57 y aquí estaba el error;

$db = mysql_connect('pruminio.atspace.eu','2454802_promu nio','5LI7EZXgQD') or die('No se pudo conectar con la base de datos');
mysql_select_db('2454802_promunio',$db) or die('No se pudo seleccionar la base de datos.');[/B]

Donde hay que indicar el 'servidor_base_datos' yo puse "pruminio.atspace.eu" y lo correcto es;
'fdb17.atspace.me'

Que es lo que viene reflejado en los datos de la DB alojadas en la cuenta, como "Host de BD"

Ahora cuando escribo la dirección en el navegador del PC obtengo el contenido la sentencia de SQL que he configurado en el archivo opciones.xml, pero me sigue indicando que la extensión mysql está obsoleta y será eliminada en el futuro.

Deprecated : mysql_connect (): La extensión mysql está obsoleta y se eliminará en el futuro: use mysqli o PDO en lugar de /srv/disk12/2454802/www/pruminio.atspace.eu/webservice.php en la línea 56

Advertencia : No se puede modificar información de cabecera - encabezados ya enviados por (salida iniciada en /srv/disk12/2454802/www/pruminio.atspace.eu/webservice.php:56) en /srv/disk12/2454802/www/pruminio.atspace.eu/webservice. php en la línea 81 ["jugador": "MESSI"}, {"jugador": "LUIS SUAREZ"}, {"jugador": "MESSI"}, {"jugador": "LUIS SUAREZ"}, ":" MORATA "}, {" jugador ":" RONALDO "}, {" jugador ":" MORATA "}, {" jugador ":"RONALDO"}]

No se si darte las gracias o darme de baja de la página por el tema de la factura que me querías pasar.

WillyWeb
20/09/17, 20:04:12
No se si darte las gracias o darme de baja de la página por el tema de la factura que me querías pasar.

:risitas: y lo bien que lo estamos pasando :piripi:

Antes de nada quiero pedir perdón por salirme tanto del tema con todo este follón de los WebServices, el PHP y los alojamientos web. Espero que el amigo Caravantes, que se ha encargado desde el principio de que todo esto esté limpio y ordenado, sepa perdonarme este "pequeño" rodeo que estoy dando para volver a Tasker, que es lo que nos tiene aquí entretenidos a tantos. xD

Al tema...

En esa salida que has puesto ya se ven datos. Eso quiere decir que todo funciona (PHP, XML, conexión a la DB, acceso a los datos y salida en JSON/XML) ... :platano:

Ahora vamos a quitar ese aviso de "Deprecated" que hace tanto daño a la vista y que también está ocasionando esa "Advertencia" que sale justo antes de los datos.

El aviso, aunque molesto, no es demasiado serio. Las funciones MySQL de PHP han sido actualizadas y te invitan a dejar de usar las viejas. Lo podemos solucionar de varias formas:

-Ignorar ese aviso en concreto
-Desactivar todos los avisos de esa clase
-Usar una versión de PHP que sólo tenga las funciones viejas
-Arreglar el código PHP pasa usar las nuevas funciones

Lo más fácil/rápido es lo primero. Simplemente tienes que poner una arroba delante del nombre de la función de la línea 56 para que quede así ... "@mysql_connect". :oh:

Ojo que esto no soluciona nada. Simplemente desactivamos los mensajes de error que pueda producir la ejecución de esa función. Pon la arroba, comprueba que ya no sale el error, y la quitas. Eso es una chapuza y no lo vamos a dejar así. ;-)

Otra cosa que también es fácil de hacer es cambiar la versión de PHP por una más vieja que no te "invite" a usar las nuevas funciones MySQL. En "Panel de control > Herramientas de alojamiento > Configuración de PHP" tendrás la versión 5.6.x. Con la 5.4.x se soluciona el tema. Pruebas y luego lo pones como estaba, que tampoco lo vamos a dejar así. :D

Vamos a cambiar las funciones MySQL viejas por las nuevas para que el script PHP no genere esos errores ni ahora ni un futuro próximo. Tranquilo que es poca cosa. ;-)

Línea 56:
- la función tiene que quedar así ... mysqli_connect('servidor','usuario','password','ba se_datos')
- ojo con esa "i" de mysqli_

Línea 57:
- añade // justo al principio para comentar/anular esa línea

Línea 58:
- la función tiene que quedar así ... mysqli_query($db,$sql)
- ojo con esa "i" de mysqli_ y con el orden de los parámetros

Línea 62:
- la función tiene que quedar así ... mysqli_num_rows
- ojo con esa "i" de mysqli_

Línea 64:
- la función tiene que quedar así ... mysqli_fetch_assoc
- ojo con esa "i" de mysqli_

Línea 71:
- la línea tiene que quedar así ... mysqli_close($db);
- ojo con esa "i" de mysqli_ y fuera la arroba que ya no hace falta

Con esos pequeños cambios el script PHP ya debería funcionar correctamente. Ahora ya puedes meter todas las consultas en el XML, cargar la tabla con todos los datos y hacer pruebas en el navegador para comprobar que el resultado es el esperado.

:palomitas:

Rsc
20/09/17, 22:12:31
Antes de nada quiero pedir perdón por salirme tanto del tema con todo este follón de los WebServices, el PHP y los alojamientos web

En cuanto saque un hueco, me comprometo a organizar en medida de lo posible, las dos cuestiones que se han tratado en dos hilos diferentes. La idea es, modificar el primer comentario de este, y resumir las soluciones que se han visto para mandar detonantes a otro teléfono sin el uso de plugin, y abrir un nuevo hilo, que recoja de forma detallada todo lo relacionado con la creación y el uso de una DB en un servidor.

En esa salida que has puesto ya se ven datos. Eso quiere decir que todo funciona

Por lo pronto he ido probando diferentes sentencias, y casi todo funciona bien. Digo casi todo, por que la siguiente sentencia, que aportó danko9696 y que vengo usando para que junto a una fuente monospace, quede todo bien cuadrado:

SELECT SUBSTR(" ",1,2-LENGTH(SUBSTR(goles,1,2))) || SUBSTR(goles,1,2) || " " ||

SUBSTR(jugador,1,15) || substr(" ",1,15-LENGTH(SUBSTR(jugador,1,15))) || " " ||

SUBSTR(usuario,1,10) || substr(" ",1,10-LENGTH(SUBSTR(usuario,1,10)))

AS "%%" FROM goleadores

ORDER BY goles DESC, jugador

me da este resultado:

[{"%%": "1"}, {"%%": "1"}, {"%%": "1"}, {" "%%": "1"}, {"%%": "1"}, {"%%": "1"}, {"%%": "1"}]

Como digo, en Tasker la uso habitualmente y debería de funcionar, aunque me tengo que volver a leer lo que explicaste de que "cuando son datos variables, hay que poner #PARAMETRO1", o algo así...

Además de esto, aún estoy pendiente de ir probando las soluciones que has indicado para solventar ese molesto error. A ver si me dan un poco de tregua esta noche y me da tiempo...

Otra cosa que estoy pendiente de darle una mejor solución es que; con la acción SQL Query de Tasker el resultado es un array, y cada array hija es una fila de la tabla, que únicamente contiene los campos de la misma.

Y al hacer las consultas a la DB del servidor, el valor se almacena en la variable incorporada %HTTPD y además de el contenido de la tabla, muestra también la estructura de la misma;

"usuario": "MESSI", "usuario": "RAUL"}, {"goles": "8", "jugador": "LUIS SUAREZ", "usuario" RICHY "}, {" goles ":" 13 "," jugador ":" MESSI "," usuario ":" RAUL "," usuario ":" LUIS SUAREZ "," usuario ":" RICHY "}, {" goles ":" 7 "," jugador ":" MORATA "," usuario ":" BIFU "}, "usuario": "SANDRO"}, {"goles": "7", "jugador": "MORATA", "usuario": "BIFU"}, "jugador": "RONALDO ","usuario": "SANDRO"}]

Nada que no se pueda solucionar con la acción de "buscar y remplazar", pero quizás hay alguna forma de hacer la consulta y que únicamente devuelva el contenido de la tabla.

y lo bien que lo estamos pasando

Ni te lo imaginas! :gracias:

WillyWeb
20/09/17, 23:24:39
En cuanto saque un hueco, me comprometo a organizar en medida de lo posible, las dos cuestiones que se han tratado en dos hilos diferentes...

Me parece bien. :ok:

Por lo pronto he ido probando diferentes sentencias, y casi todo funciona bien...

Seguro que danko te lo soluciona en un momento. :silbando:

Además de esto, aún estoy pendiente de ir probando las soluciones que has indicado para solventar ese molesto error. A ver si me dan un poco de tregua esta noche y me da tiempo...

No debería llevarte mucho tiempo hacer todas las pruebas que te he propuesto. ;-)

Otra cosa que estoy pendiente de darle una mejor solución es que; con la acción SQL Query de Tasker el resultado es un array, y cada array hija es una fila de la tabla, que únicamente contiene los campos de la misma.

Y al hacer las consultas a la DB del servidor, el valor se almacena en la variable incorporada %HTTPD y además de el contenido de la tabla, muestra también la estructura de la misma;

Lo que devuelve el WebService es un objeto JSON relativamente fácil de procesar usando JavaScript. Eso que te parece la estructura de la tabla en realidad son partes del objeto.

http://www.json.org/json-es.html

Rsc
20/09/17, 23:53:12
No debería llevarte mucho tiempo hacer todas las pruebas que te he propuesto.

He probado las soluciones, bueno solo lo del @ y la modificación de las lineas que has comentado. Añadiendo el @, efectivamente no se reflejan los errores, pero al modificar el archivo php tal y como has indicado, me sale "Consulta incorrecta" y a continuación la sentencia SQL.

Las modificaciones las he hecho de varias formas. Primero y las más lógica, interpretando cuando pones ... mysqli_connect('servidor','usuario','password','ba se_datos') que lo que pone antes y después de esa línea, no lo modifico.

Viendo que daba error, he modificado las líneas, indicando unicamente lo que tu has puesto, pero así me indica error de sintaxis.

También he probado con y sin el @ de la linea 56, ya que no lo mencionabas, pero al ver que el de la línea 71 había que quitarlo, pensaba que ese sería posible que también. EDITO: Sorry, ese @ es el que había puesto para evitar que se refleje el error.

Como ves esto no acaba, la próxima vez que quieras echarme un cable te lo vas a tener que pensar. :silbando:

danko9696
21/09/17, 00:25:01
Por lo pronto he ido probando diferentes sentencias, y casi todo funciona bien. Digo casi todo, por que la siguiente sentencia, que aportó danko9696 y que vengo usando para que junto a una fuente monospace, quede todo bien cuadrado:

SELECT SUBSTR(" ",1,2-LENGTH(SUBSTR(goles,1,2))) || SUBSTR(goles,1,2) || " " ||

SUBSTR(jugador,1,15) || substr(" ",1,15-LENGTH(SUBSTR(jugador,1,15))) || " " ||

SUBSTR(usuario,1,10) || substr(" ",1,10-LENGTH(SUBSTR(usuario,1,10)))

AS "%%" FROM goleadores

ORDER BY goles DESC, player

me da este resultado:

[{"%%": "1"}, {"%%": "1"}, {"%%": "1"}, {" "%%": "1"}, {"%%": "1"}, {"%%": "1"}, {"%%": "1"}]

Así de pronto es casi seguro que la concatenación no funciona con el ||, ya que parece que devuelve varios campos en lugar de uno solo como debería. Tendrás que buscar en la documentación para esa versión de sql para ver como se hace, que seguro que hay una instrucción para ello.

Luego, si no funciona todavía, deberías comprobar con varias consultas cada instrucción, extraer conclusiones y buscar de nuevo en la documentación si es necesario:

SELECT LENGTH(jugador) FROM jugadores;
SELECT SUBSTR(jugador2,3) FROM jugadores;
SELECT jugador AS ju FROM jugadores;

WillyWeb
21/09/17, 07:45:57
He probado las soluciones, bueno solo lo del @ y la modificación de las lineas que has comentado. Añadiendo el @, efectivamente no se reflejan los errores, pero al modificar el archivo php tal y como has indicado, me sale "Consulta incorrecta" y a continuación la sentencia SQL.

Es que no tienes que hacer todo a la vez. :(

O pones la arroba, dejando el resto sin tocar, o haces todos los cambios.

Las modificaciones las he hecho de varias formas. Primero y las más lógica, interpretando cuando pones ... mysqli_connect('servidor','usuario','password','ba se_datos') que lo que pone antes y después de esa línea, no lo modifico.

Esa es la forma. :ok:

[COLOR="Red"]Como ves esto no acaba, la próxima vez que quieras echarme un cable te lo vas a tener que pensar. :silbando:[/QUOTE]

Al final el que se borra del foro soy yo. :risitas:

WillyWeb
21/09/17, 07:56:47
... Tendrás que buscar en la documentación para esa versión de sql para ver como se hace, que seguro que hay una instrucción para ello...

Que yo recuerde...

CONCAT()
https://www.w3schools.com/sql/func_mysql_concat.asp

CONCAT_WS()
https://www.w3schools.com/sql/func_mysql_concat_ws.asp

COALESCE()
https://www.w3schools.com/sql/sql_isnull.asp

Rsc
21/09/17, 08:24:49
Es que no tienes que hacer todo a la vez.

Ya ya, me refiero que lo he probado ambas formas. Primero añadiendo lo del @ y luego únicamente haciendo las modificaciones que has indicado. Y aunque hubo un momento que se me olvidó quitar el @, finalmente hice solo las modificaciones, y me sigue saliendo "Consulta Incorrecta"

- la función tiene que quedar así ... mysqli_connect('servidor','usuario','password','ba se_datos')
- ojo con esa "i" de mysqli_

Aunque ahora que me vuelvo a fijar veo algo que no cambié. En la línea 56 indicas que añada una "i" y entre paréntesis 4 datos relativos a la DB. ('servidor','usuario','password','ba se_datos')

Y en el código inicial únicamente se indicaban 3 datos relativos a la DB en la línea 56 ('servidor_base_datos','usuario','clave')

En cuanto lo pruebe lo comprobaré, pero me temo que no podrá ser hasta esta tarde.

WillyWeb
21/09/17, 09:40:49
Aunque ahora que me vuelvo a fijar veo algo que no cambié...

Ya te vale :facepalm:

Rsc
21/09/17, 12:47:48
Aunque ahora que me vuelvo a fijar veo algo que no cambié. En la línea 56 indicas que añada una "i" y entre paréntesis 4 datos relativos a la DB. ('servidor','usuario','password','ba se_datos')

Y en el código inicial únicamente se indicaban 3 datos relativos a la DB en la línea 55 ('servidor_base_datos','usuario','clave')

Confirmo que este era el error. Ahora funciona todo perfectamente.

Por mi parte, únicamente me queda intentar hacer funcionar la sentencia que me facilitó danko9696, para que los campos de la tabla tuvieran un número fijo de caracteres e intentar procesar el objeto json, para que únicamente muestre los datos de los campos, y poder obtener un array por cada una de las filas.

Como ya he comentado, crearé un hilo que recoja todas las instrucciones que me ha ido dando WillyWeb, para poder hacer esto, ya que creo que trabajar con una DB en un servidor, puede dar mucho juego en este foro.

De nuevo agradecerte todo lo que has molestado en ir explicándome todos los pasos con tanta paciencia. :dios:

WillyWeb
21/09/17, 13:40:37
Digo casi todo, por que la siguiente sentencia, que aportó danko9696 y que vengo usando para que junto a una fuente monospace, quede todo bien cuadrado:

SELECT SUBSTR(" ",1,2-LENGTH(SUBSTR(goles,1,2))) || SUBSTR(goles,1,2) ||

" " || SUBSTR(jugador,1,15) || substr(" ",1,15-LENGTH(SUBSTR(jugador,1,15))) ||

" " || SUBSTR(usuario,1,10) || substr(" ",1,10-LENGTH(SUBSTR(usuario,1,10)))

AS "%%" FROM goleadores

ORDER BY goles DESC, jugador[/B]

me da este resultado:

[B][{"%%": "1"}, {"%%": "1"}, {"%%": "1"}, {" "%%": "1"}, {"%%": "1"}, {"%%": "1"}, {"%%": "1"}]

Por lo que veo el propósito de esa sentencia es obtener los tres campos de la base de datos en una única línea asignando a cada campo una cantidad fija de caracteres. Eso junto con la fuente monospace genera el efecto visual de una tabla ... ingenioso :ok:

Esa línea la tienes definida tal que así:

2 dígitos para 'goles' justificado a la derecha + 2 espacios + 15 letras para 'jugador' justificado a la izquierda + 3 espacios + 10 letras para 'usuario' justificado a la izquierda

:rolleyes:

Creo que se puede simplificar y hacer que funcione en MySQL todo de una. Lo explico por partes para que se entienda lo que pretendo...

Esta sentencia ...
RIGHT(CONCAT(REPEAT(" ",2), goles), 2)
... es equivalente a la parte en rojo.

Esta sentencia...
LEFT(CONCAT(jugador, REPEAT(" ",15)), 15)
... es equivalente a la parte en azul.

Esta sentencia...
LEFT(CONCAT(usuario, REPEAT(" ",10)), 10)
... es equivalente a la parte en verde.

Ahora compones la cojolínea juntando todo y metiendo un par de espacios en blanco entre cada campo ...

CONCAT_WS(REPEAT(" ", 2), parte1, parte2, parte3)

Y metes esa cojolínea en la consulta ...

SELECT cojolínea AS listado FROM goleadores ORDER BY goles DESC, jugador

Con lo que la sentencia final debería quedar tal que así ...

SELECT CONCAT_WS(REPEAT(" ",2), RIGHT(CONCAT(REPEAT(" ",2), goles), 2), LEFT(CONCAT(jugador, REPEAT(" ",15)), 15), LEFT(CONCAT(usuario, REPEAT(" ",10)), 10)) AS listado FROM goleadores ORDER BY goles DESC, jugador

Ya me contarás. :palomitas:

--EDITO--

Ahora que lo pienso, creo que la parte del "AS listado" se podría quitar. A fin de cuentas lo que esa sentencia SQL retorna a PHP es la línea formateada que necesitas y no es necesario darle un nombre concreto.

:pensando:

--EDITO--

Confirmado. Es mejor dejar la parte "AS listado". ;-)

--EDITO--

He dado con otra forma de hacerlo todavía más simple ...

SELECT CONCAT_WS(SPACE(2), LPAD(goles,2," "), RPAD(jugador,15," "), RPAD(usuario,10," ")) AS listado FROM goleadores ORDER BY goles DESC, jugador

Yo creo que esta ya es la buena. :D

WillyWeb
21/09/17, 13:46:18
Confirmo que este era el error. Ahora funciona todo perfectamente.

Estaba claro. ;-)

Por mi parte, únicamente me queda intentar hacer funcionar la sentencia que me facilitó danko9696...

Prueba lo que te he puesto en el mensaje anterior y me cuentas. :rolleyes:

... e intentar procesar el objeto json, para que únicamente muestre los datos de los campos, y poder obtener un array por cada una de las filas.

No es complicado con JavaScript.

https://www.w3schools.com/js/js_json_intro.asp

... creo que trabajar con una DB en un servidor, puede dar mucho juego en este foro.

Yo también lo creo. :pensando:

Rsc
21/09/17, 19:23:05
SELECT CONCAT_WS(SPACE(2), LPAD(goles,2," "), RPAD(jugador,15," "), RPAD(usuario,10," ")) AS listado FROM goleadores ORDER BY goles DESC, jugador
Yo creo que esta ya es la buena.

Esta funciona perfectamente.

CONCAT_WS(SPACE(2), RPAD(jugador,15," ")

CONCAT_WS(Concatena las expresiones con 2 espacios como separador), ALINEA EL TEXTO A LA DERECHA(cadena,caracteres para cadena,"¿Un espacio?")

WillyWeb
21/09/17, 19:41:56
Si me preguntas por lo que hacen esas funciones lo puedes ver aquí...

https://www.w3schools.com/sql/func_mysql_concat_ws.asp
https://www.w3schools.com/sql/func_mysql_space.asp
https://www.w3schools.com/sql/func_mysql_rpad.asp
https://www.w3schools.com/sql/func_mysql_lpad.asp

Básicamente es lo siguiente...

SPACE(longitud)

CONCAT_WS(separador, expresión1, expresión2, expresión3, ...)

RPAD(cadena, longitud, relleno)
LPAD(cadena, longitud, relleno)

'cadena' es el texto que vas a rellenar
'longitud' es el número de caracteres que quieres que tenga la cadena final
'relleno' es con lo que vas a completar 'cadena' hasta llegar a 'longitud' (si es necesario)

El relleno se hace por la derecha en el caso de RPAD y por la izquierda en el caso de LPAD, así que 'cadena' queda justificada al lado opuesto.

Rsc
21/09/17, 19:59:11
Ok, casi acierto alguna. Bueno esta noche me pongo con JSON

Rsc
22/09/17, 00:18:24
Estoy intentando interpretar el objeto JSON para obtener únicamente el contenido de los campos de la tabla, y leyendo un poco y viendo algunos tutoriales sobre JSON, he visto un código, que entiendo que debería de valer para conseguirlo, pero no es así

El código es el siguiente:

var xhr = new XMLHttpRequest();
xhr.open('GET',http://pruminio.atspace.eu/webservice.php?opcion=tabla&format=json');
xhr.onload = function(){
if(xhr.status == 200){
var json = JSON.parse(xhr.responseText);
console.log(json);
}else{
console.log("EXISTE UN ERROR")
}
}
xhr.send();

No se si me estoy acercando o si esto no tiene nada que ver con lo que necesito.

WillyWeb
22/09/17, 10:20:37
Ese código es el típico de cualquier aplicación que use AJAX (https://es.wikipedia.org/wiki/AJAX), una técnica para construir aplicaciones web intereactivas. En este caso no es aplicable, además de ser un poco más complicada de lo que en principio necesitas.

Para capturar los datos usa la acción de Tasker "HTTP Get" que te dejará el JSON en la variable global %HTTPD. Luego, con una acción "JavaScriptlet" capturas esa variable, la conviertes en un objeto JSON y la procesas a tu gusto. El códogo es muy simple...

json=global("HTTPD");
obj=JSON.parse(json);

//proceso del objeto

var datos=loquesea;

Cualquier variable que definas con "var" será visible el Tasker como una variable local normal y corriente siempre que su nombre cumpla con los requisitos de Tasker.

WillyWeb
22/09/17, 13:49:54
Añado una pista más...

Normalmente un resultado en formato JSON es convertible en un objeto con la función JSON.parse() (https://www.w3schools.com/js/js_json_intro.asp). Y los valores de un objeto son navegables fácilmente conforme a la estructura de cualquier objeto en JavaScript (https://www.w3schools.com/js/js_objects.asp). El JSON que devuelve el WebService es un array de objetos, la única forma de enviar en un JSON una matriz bidimensional. Eso lo debes tener en cuenta a la hora de procesar el JSON. Las palabras clave que tienes que buscar para meter mano a esto son ... json, array, objeto y javascript.

Procesar ese JSON puede ser un poco farragoso. Le estoy dando vueltas a otra idea, que además minimizaría los cambios en tu aplicación, pero necesito saber un par de detalles...

-¿Qué forma tienen los resultados que sacas de la base de datos SQL local?
-¿Qué haces con ellos? ... ¿los troceas/separas por las comas o algo así?
-¿Al final todo termina en una serie de arrays de Tasker?

Rsc
22/09/17, 20:04:38
Perdona WillyWeb, hoy casi no he podido mirar el móvil, y aún me queda lío. Los resultados de la DB la obtengo con una acción SQL Query, normaente con la sentencia que me facilito Dando9695, y la estructura es:

Goles, jugador, usuario.

Una vez que tengo el contenido de la tabla, lo muestro en un elemento menú de una escena. Cada fila es un array.

Cómo digo, normalmente muestro toda la tabla, pero opcionalmente nuestro solo los jugadores relativos a un usuario, para facilitar el manejo de la tabla, cuando ya tiene muchas filas.

WillyWeb
22/09/17, 21:42:01
Una vez que tengo el contenido de la tabla, lo muestro en un elemento menú de una escena. Cada fila es un array.

Cómo digo, normalmente muestro toda la tabla, pero opcionalmente nuestro solo los jugadores relativos a un usuario, para facilitar el manejo de la tabla, cuando ya tiene muchas filas.

La estructura de la tabla ya la tenía medio clara. De lo que necesito más detalles es de esos arrays y de cómo llegas a ellos desde el resultado de la consulta SQL. Por cierto, también me ayudaría ver el contenido de una de ellas.

Mi idea es convertir el JSON que devuelve el WebService en algo igual a lo que te proporcionaba esa consulta. De esa forma podrías reutilizar casi todo el código de tu aplicación.

:silbando:

Rsc
22/09/17, 23:45:48
Perdona de nuevo por no contestar antes, ha sido un día complicado...

Los arrays los proporciona la propia acción SQL Query, únicamente hay que indicar el nombre que le queramos asignar en la etiqueta "Matriz de variable (array)" y cada una de las filas del resultado de la consulta, se almacenan en el array especificado.

Copio la descripción de la tarea;

Consulta Sql (126)
A1: Consulta SQL [ Modo:Raw Archivo:Promunio/promunio.sqlite Table: Columns: Consulta:SELECT SUBSTR(" ",1,2-LENGTH(SUBSTR(goles,1,2))) || SUBSTR(goles,1,2) || " " ||

SUBSTR(player,1,15) || substr(" ",1,15-LENGTH(SUBSTR(player,1,15))) || " " ||

SUBSTR(usuario,1,10) || substr(" ",1,10-LENGTH(SUBSTR(usuario,1,10)))

AS "%%" FROM goles

ORDER BY goles DESC, player Selection Parameters: Order By: Output Column Divider: Matriz de Variables (array):%ProTabla Usar Root:Apagado ]

Rsc
22/09/17, 23:58:57
Por cierto, también me ayudaría ver el contenido de una de ellas.

Si te fijas en los vídeos que subí a este hilo, que figuran en la primera página, verás el contenido de los arrays. Y si te facilitara algo que te pasara el proyecto, me lo dices que no tengo ningún problema.

WillyWeb
24/09/17, 15:28:27
Veo que ya has creado el hilo que habías comentado...

Crear un WebService con PHP - Iteractuar con una DB SQL en la Web (http://www.htcmania.com/showthread.php?p=27156494)

:ok:

He localizado cuatro cositas que deberías corregir. :rolleyes:

Esta línea del punto 4...

http://Nombre del subdominio/webservice.php?opcion=listaParametro&format=json.

...debería ser así...

http://Nombre del subdominio/webservice.php?opcion=nombreopción&format=json

Esta otra línea del mismo punto...

http://http://pruminio.atspace.eu/webservice.php?opcion=lista&format=json

...debería ser así...

http://pruminio.atspace.eu/webservice.php?opcion=listajugadores&format=json

En el XML también has puesto "lista" en vez de "listajugadores".

Por cierto, todas esas líneas también deberían ir entre etiquetas como el PHP el XML.

Deberías comentar que la parte de la URL con la que se selecciona el formato (&format=json) es opcional. Si no la pones el valor por defecto es "json".

Al ejemplo de resultado JSON le falta el corchete del final.

Y el código PHP queda más bonito con su propia etiqueta...

<?php
// Recoger parámetros de entrada. Se permite GET y POST
$paramOpcion = $_REQUEST['opcion'];
$paramLista = $_REQUEST['listaParametros'];
$formato = strtolower($_REQUEST['format']) == 'xml' ? 'xml' : 'json';


Ahora al tema. :D

Te había propuesto esto...

Mi idea es convertir el JSON que devuelve el WebService en algo igual a lo que te proporcionaba esa consulta. De esa forma podrías reutilizar casi todo el código de tu aplicación.

... y después de probar varias cosas creo que he dado con la manera más simple de hacerlo.

La acción "Consulta SQL" devuelve el resultado en un array. Cada elemento del array es una fila del resultado. Cada elemento/fila contiene los valores de las columnas separados por el símbolo que pongamos en el campo correspondiente de la acción.

Lo que el WebService devuelve es un JSON compuesto por un array de objetos. Cada elemento del array es una fila del resultado. Cada elemento/fila contiene los valores de las columnas en un objeto con parejas "nombre_columna : valor" separadas por comas.

En un vistazo rápido vemos que "casi" es lo mismo, pero sobra lo de los objetos y los nombres de las columnas. Pues quitamos lo que sobra y listo...

[CODE]ConvierteJSONenArrayLocal (999)
A1: HTTP Get [ Servidor:pruminio.atspace.eu Ruta:webservice.php Atributos:opcion=listajugadores ]
A2: JavaScriptlet [ Código://Convierte JSON a un array local
json=global('HTTPD');

json=json.replace(/"goles":/g,"")
json=json.replace(/"jugador":/g,"")
json=json.replace(/"usuario":/g,"")
json=json.replace(/"listado":/g,"")

json=json.replace(/"/g,"") //dos comillas dobles

json=json.replace(/{|}/g,'"') //comilla simple + doble + simple

var array=[]
array=JSON.parse(json)
A3: Flash [ Texto:%array(#) registros ]

Esta tarea lanza la consulta al WebService (A1). Procesa el JSON usando JS convirtiéndolo en un array similar al de la acción "Consulta SQL" (A2). Y finalmente muestra el tonal de filas/elementos obtenidos (A3).

Con eso debería ser más que suficiente, pero he visto que tú usas un array global para guardar el resultado de la consulta y eso es un problema porque según la documentación de Tasker no se puede crear un array global desde JS. :cry:

¿Seguro que no se puede? :idea:

Pues esta otra tarea lo hace...

ConvierteJSONenArrayGlobal (666)
A1: HTTP Get [ Servidor:pruminio.atspace.eu Ruta:webservice.php Atributos:opcion=listajugadores ]
A2: Array Clear [ Matriz de Variables (array):%MiArray ]
A3: JavaScriptlet [ Código://Convierte JSON a un array global
json=global('HTTPD');

json=json.replace(/"goles":/g,"")
json=json.replace(/"jugador":/g,"")
json=json.replace(/"usuario":/g,"")
json=json.replace(/"listado":/g,"")

json=json.replace(/"/g,"") //dos comillas dobles

json=json.replace(/{|}/g,'"') //comilla simple + doble + simple

json=JSON.parse(json)

for(ind=0;ind<json.length;ind++)
{
nom="MiArray"+(ind+1)
setGlobal(nom,json[ind])
}
A4: Flash [ Texto:%MiArray(#) registros ]

En la versión para array local el nombre del array se define en estas dos líneas del JavaScriptlet...

var array=[]
array=JSON.parse(json)

En la versión para array global el nombre se define en esta otra línea...

nom="MiArray"+(ind+1)

*Ten en cuenta que ese nombre es el mismo que tienes que poner en la acción "Array Clear" que va justo antes de la acción JavaScriptlet.

Prueba y me cuentas. :palomitas:

PD: Doy por supuesto que el código JS se entiende sin problema pero si no es así lo cuento paso a paso.

Rsc
25/09/17, 00:32:53
He corregido los errores que me has comentado en el otro hilo, a excepción de:

Deberías comentar que la parte de la URL con la que se selecciona el formato (&format=json) es opcional. Si no la pones el valor por defecto es "json".

Porque no lo entiendo. He probado con y sin &format=json y obtengo el mismo resultado. Tendré que leer un poco más sobre json para entenderlo.

En el XML también has puesto "lista" en vez de "listajugadores".

Esto lo había hecho a posta, porque me he dado cuenta de que cualquiera puede acceder a la DB. En ese caso <nombre>listajugadores</nombre> únicamente muestra la lista de jugadores, pero he creado algunas sentencias de INSERT TO, UPDATE, DELETE etc que si finalmente utilizo esta DB para la aplicación, y alguien hace pruebas con esa misma URL, nos podría joder la estadística. No obstante lo he puesto bien, para no llevar a confusión.

Con eso debería ser más que suficiente, pero he visto que tú usas un array global

Creo que puedo sustituir ese array global por uno local. Pensaba que era necesario que sea global para llenar las etiquetas del elemento menú, pero acabo de comprobar que no es necesario, y supongo que teniendo una tabla sql con todos los datos, no necesito tener también los datos almacenados en arrays globales.

Además, el código que has puesto para convertir JSON a un array global no me ha funcionado y el que has puesto para convertirlo a un array local, después de poner los correspondientes (punto y coma), sí.

Cuando he probado con el código que has indicado para convertirlo en un array global, obtenía todos los elementos arrays globales (%MyArray) vacíos, menos el último que su valor era undefined

Literalmente la acción Flash: %MiArray() muestra lo siguiente (la tabla actualmente tiene 8 filas):

%MiArray1,%MiArray2,%MiArray3,%MiArray4,%MiArray5, %MiArray6,%MiArray7,%MiArray8,undefined

Y la acción Flash: %MiArrai(#) muestra 1

En cambio convirtiendo convirtiéndolo a array local, cada elemento asume de forma correcta cada una de las filas de la tabla, tal y como si hiciera la consulta con la acción SQL Query de Tasker.

Doy por supuesto que el código JS se entiende sin problema.

Mal hecho. Pero no voy a ser yo el que te pida que te molestes más aún en detallarlo, es posible que lo acabe comprendiendo más o menos con la ayuda de google.

PD: Ahora si que puedo hacer todos los cambios necesarios en el proyecto para trabajar con la DB almacenada en la web, en vez de con la DB almacenada en el teléfono y en la nube. Si jugaras al Pro Evolution, serías invitado de honor en la liga :sisi1:

WillyWeb
25/09/17, 08:43:03
He corregido los errores que me has comentado en el otro hilo...

Te sigue sobrando un http:// en esta línea...

http://http://pruminio.atspace.eu/webservice.php?opcion=listajugadores&format=json

... no lo entiendo. He probado con y sin &format=json y obtengo el mismo resultado. Tendré que leer un poco más sobre json para entenderlo.

No es cuestión de saber sobre JSON, es cuestión de saber cómo funciona este WebService. Y en este caso si no quieres seleccionar un formato de salida el formato por defecto es JSON, como ya has podido comprobar.

Esto lo había hecho a posta, porque me he dado cuenta de que cualquiera puede acceder a la DB.

Para evitar esos accesos no deseados tienes tres alternativas...

-Cambiar el nombre de las opciones
-Cambiar el nombre del PHP
-Cambiar el nombre del subdominio

La más sencilla es la segunda. Usa un nombre poco evidente y tema resuelto.

Creo que puedo sustituir ese array global por uno local. Pensaba que era necesario que sea global para llenar las etiquetas del elemento menú, pero acabo de comprobar que no es necesario, y supongo que teniendo una tabla sql con todos los datos, no necesito tener también los datos almacenados en arrays globales.

En general es mejor usar variables locales. Evitas posibles interferencias entre tareas/proyectos y mejoras ligeramente el rendimiento/velocidad de las tareas que las manejan.

Además, el código que has puesto para convertir JSON a un array global no me ha funcionado y el que has puesto para convertirlo a un array local, después de poner los correspondientes (punto y coma), sí.

-¿Qué parte no te ha funcionado?
-¿Qué punto y coma? ¿Dónde los has puesto?

:rolleyes:

Cuando he probado con el código que has indicado para convertirlo en un array global, obtenía todos los elementos arrays globales (%MyArray) vacíos, menos el último que su valor era undefined

Es que no era %MyArray :oh:

¿Seguro que has escrito bien todas las sentencias? :silbando:

...no voy a ser yo el que te pida que te molestes más aún en detallarlo, es posible que lo acabe comprendiendo más o menos con la ayuda de google.

Pues mal hecho. Si no se sabe algo se pregunta, que para eso estamos. ;-)

Ahora si que puedo hacer todos los cambios necesarios en el proyecto para trabajar con la DB almacenada en la web, en vez de con la DB almacenada en el teléfono y en la nube.

De eso se trataba, ¿no? ;-)

Si jugaras al Pro Evolution, serías invitado de honor en la liga :sisi1:

Gracias hombre. Lamentablemente los juegos no son una de mis pasiones. :-)

WillyWeb
25/09/17, 09:45:29
Vamos a ver el funcionamiento de este JavaScriptlet paso a paso...

//Convierte JSON a un array global
json=global('HTTPD')

json=json.replace(/"goles":/g,"")
json=json.replace(/"jugador":/g,"")
json=json.replace(/"usuario":/g,"")
json=json.replace(/"listado":/g,"")

json=json.replace(/"/g,"") //dos comillas dobles

json=json.replace(/{|}/g,'"') //comilla simple + doble + simple

json=JSON.parse(json)

for(ind=0;ind<json.length;ind++)
{
nom="MiArray"+(ind+1)
setGlobal(nom,json[ind])
}

El JSON que devuelte el WebService tiene esta pinta...

[{"goles":"7","jugador":"RONALDO","usuario":"SANDRO "},{"goles":"8","jugador":"MORATA","usuario":"BIFU "},
{"goles":"9","jugador":"LUIS SUAREZ","usuario":"RICHY"},{"goles":"15","jugador" :"MESSI","usuario":"RAUL"}]

Y ya hemos quedado en que tenemos que convertirlo en algo similar a lo que devuelve la acción "Consulta SQL", es decir, una array de elementos (filas) con valores (columnas) separados por comas (o lo que queramos).

Esta línea...

json=global('HTTPD')

...pasa la variable global %HTTPD a JS usando la función global(), que es un añadido de Tasker. El valor queda almacenado en la variable "json".

Este bloque...

json=json.replace(/"goles":/g,"")
json=json.replace(/"jugador":/g,"")
json=json.replace(/"usuario":/g,"")
json=json.replace(/"listado":/g,"")

...quita los nombres de los campos. Puedes añadir tantas líneas como necesites.

Esta línea...

json=json.replace(/"/g,"") //dos comillas dobles

...quita todas las comillas dobles.

Esta línea...

json=json.replace(/{|}/g,'"') //comilla simple + doble + simple

...cambia las llaves (abrir y cerrar) por una comilla doble.

Después de pasar por esas líneas el JSON inicial debería tener esta pinta...

["7,RONALDO,SANDRO","8,MORATA,BIFU","9,LUIS SUAREZ,RICHY","15,MESSI,RAUL"]

Ahora tenemos que decidir si queremos el resultado en un array local o global.

Si queremos el resultado en un array global pondremos esta línea...

json=JSON.parse(json)

...con la que convertimos ese JSON "modificado" en un array haciendo uso del "parser" JSON de JavaScript.

Y luego pondremos este bucle...

for(ind=0;ind<json.length;ind++)
{
nom="MiArray"+(ind+1)
setGlobal(nom,json[ind])
}

...que hace lo que se supone que no se puede hacer, pasar un array global de JS a Tasker. El bucle recorre cada elemento del array "json", crea un nombre para cada elemento del array global de Tasker con su número de índice corregido (uno más que en JS) y pasa el valor del array a esa variable de Tasker usando su función añadida setGlobal().

Si quisieramos el resultado en un array local deberíamos poner esto otro...

var array=[]
array=JSON.parse(json)

El matíz está en esa línea "var array=[]" que define la variable "array" como un array local para la tarea Tasker que contiene el JavaScriptlet.

Y eso es todo. :rolleyes:

Rsc
25/09/17, 09:51:13
Por lo pronto que no dispongo de PC, voy a contestar lo relativo a las dos tareas que he creado. En una uso el código JS que has indicado para convertirlo a un array global, y en la otra tarea uso el código para convertirlo en array local.

Respecto a lo de %MyArray en las tareas lo tenía puesto de forma correcta, %MiArray.

5 Webservice Procesado Global (114)
<Lista jugadores>
A1: HTTP Get [ Servidor:Puerto:http://pruminio.atspace.eu Ruta:webservice.php Atributos:opcion=listajugadores Cookies: User Agent: Cuenta atrás:10 Tipo Mime: Archivo de salida: Confiar en cualquier Certificado:Apagado ]
A2: Array Clear [ Matriz de Variables (array):%MiArray ]
A3: JavaScriptlet [ Código:json=global('HTTPD'); json=json.replace(/"goles":/g,""); json=json.replace(/"jugador":/g,""); json=json.replace(/"usuario":/g,""); json=json.replace(/"listado":/g,""); json=json.replace(/"/g,"");
json=json.replace(/{|}/g,'"');
json=JSON.parse(json); for(ind=0;ind<json.length;ind++);
{
nom="MiArray"+(ind+1)
setGlobal(nom,json[ind])
} Librerías: Salida Automática:Encendido Cuenta atrás (segundos):45 ]
A4: Flash [ Texto:%MiArray() Largo:Encendido ]


5 Webservice Procesado Local (4)
<Lista jugadores>
A1: HTTP Get [ Servidor:Puerto:http://pruminio.atspace.eu Ruta:webservice.php Atributos:opcion=listajugadores Cookies: User Agent: Cuenta atrás:10 Tipo Mime: Archivo de salida: Confiar en cualquier Certificado:Apagado ]
A2: Array Clear [ Matriz de Variables (array):%array ]
A3: JavaScriptlet [ Código:json=global('HTTPD'); json=json.replace(/"goles":/g,""); json=json.replace(/"jugador":/g,""); json=json.replace(/"usuario":/g,""); json=json.replace(/"listado":/g,""); json=json.replace(/"/g,"");
json=json.replace(/{|}/g,'"');
var array=[];
array=JSON.parse(json); Librerías: Salida Automática:Encendido Cuenta atrás (segundos):45 ]
A4: Flash [ Texto:%array1
%array2
%array3

%array() Largo:Encendido ]


Sin los punto y coma que he añadido, me daba error de sintaxis, lo cual me resulta extraño porque en muchas ocasiones no los he usado y no me ha dado errores.

WillyWeb
25/09/17, 10:03:28
Sin los punto y coma que he añadido, me daba error de sintaxis, lo cual me resulta extraño porque en muchas ocasiones no los he usado y no me ha dado errores.

¿Esos eran los puntos y coma? :rolleyes:

Es que lo has escrito todo seguido. Si pones cada sentencia en una línea no los necesitas. Aunque lo suyo es ponerlos siempre.

Rsc
26/09/17, 00:15:06
¿Esos eran los puntos y coma?

Si.

Es que lo has escrito todo seguido. Si pones cada sentencia en una línea no los necesitas.

Es extraño que en la descripción de la tarea se muestre todo seguido. En Tasker he utilizado una línea para cada sentencia.

Empiezo a dudar si ha sido buena idea crear un hilo con toda la información relativa al webservice. Quizás hubiera sido más sensato haber cambiado el título de este hilo, y haber creado otro nuevo para la otra cuestión "comunicarse con otro dispositivo sin plugin"

Bueno, si finalmente se ve muy desordenado y creéis que debería ser así, que alguno de los que os encargáis de organizar el foro, me lo diga y lo arreglo como me indiquéis.

Respecto a la la modificación del proyecto, ya esta en marcha, y lo mejor es que voy a tener que modificar poca cosa.

Lo que me ocurre a veces es que falla la acción HTTP Get, normalmente ocurre la primera vez que ejecuto la acción. No es problema porque, puedo comprobación del resultado, y si falla ejecutarla de nuevo, porque por lo pronto nunca ha fallado dos veces seguidas.

WillyWeb
26/09/17, 07:55:20
Pues sí que es extraño que se vea así. En mi caso se ven líneas separadas (tal como lo he puesto). :oh:

Sobre la organización de los post, Caravantes es la autoridad competente y su criterio siempre ha sido bueno. :silbando:

Yo también he visto que la conexión falla algunas veces. Si ves que ese servidor es poco estable (algo normal en servidores gratuitos) es cosa de probar con otro. Ahora que ya sabes lo que tienes que hacer el cambio de alojamiento debería ser cosa de poco. ;-)

Rsc
26/09/17, 23:35:34
Además, el código que has puesto para convertir JSON a un array global no me ha funcionado y el que has puesto para convertirlo a un array local, después de poner los correspondientes (punto y coma), sí.

Cuando he probado con el código que has indicado para convertirlo en un array global, obtenía todos los elementos arrays globales (%MyArray) vacíos, menos el último que su valor era undefined

Finalmente he conseguido que funcione la conversión a array global. Como comenté, no se que ocurre que cuando copio y pego el texto en Tasker o cualquier otro editor de texto, se descoloca un poco el código, de tal manera que da error de sintaxis.

Y me ha venido bien porque es posible que tenga que continuar usando el array global... desde que empecé con Tasker, me acostumbré a usar excesivamente las variables globales, y ahora me cuesta editar proyectos medio complejos con variables locales.

Rsc
27/09/17, 02:05:49
Si esa sentencia tiene un parámetro que pueda ser variable (como el nombre del jugador) debes poner '#PARAMETRO_1#' en su lugar (mira la línea 9 del XML de ejemplo). Si la sentencia tiene más de un parámetro de ese tipo pones '#PARAMETRO_1#' y '#PARAMETRO_2#'.

Estoy teniendo problemas con esto.

Si utilizo la sentencia...

<SQL>UPDATE goleadores SET goles = (goles+1) WHERE jugador LIKE "#PARAMETRO_1#"</SQL>

Servidor:Puerto = htt://pruminio.atspace.eu/webservice.php?opc=insertargol&parm=%tap_label2 (Como ves al final te he hecho caso y he abreviado las palabras clave)

%tap_label2 = MESSI

Funciona perfectamente, pero si utilizo la sentencia...

<SQL>UPDATE goleadores SET goles = (goles+1) WHERE jugador LIKE "#PARAMETRO_1#" AND usuario LIKE "#PARAMETRO_2#"</SQL>

Servidor:Puerto = htt://pruminio.atspace.eu/webservice.php?opc=insertargol&parm=%tap_label2#%tap_label3

%tap_label2 = MESSI
%tap_label3 = RAUL

No funciona

WillyWeb
27/09/17, 17:42:25
http://pruminio.atspace.eu/webservice.php?opc=insertargol&parm=%tap_label2#%tap_label3

No funciona

Efectivamente, al poner dos parámetros no funciona. :oh:

He revisado paso a paso el PHP y he visto que la culpa es del separador de parámetros. Parece que la almohadilla (#) tiene un significado especial dentro de una URL y todo lo que pongas después se pierde. :oh:

He probado con dos puntos (:), punto y coma (;), coma (,) y la socorrida pleca (|), y los cuatro funcionan correctamente. Elige uno de ellos y lo pones en la línea 43 para que quede así ...

$arrParam = explode(':',$listaPametros);

Recuerda que el símbolo que pongas en esa línea será el que tendrás que usar como separador de parámetros en la URL.

:palomitas:

Rsc
27/09/17, 18:59:15
He sustituido en el código PHP así como en la URL "#" por ";" y ya funcionan todas las sentencias perfectamente. :gracias:

Rsc
29/09/17, 00:27:45
He comprobado que al usar la sentencia;

<SQL>SELECT CONCAT_WS(SPACE(2), LPAD(goles,2," "), RPAD(jugador,15," "), RPAD(usuario,10," ")) AS listado FROM goleadores ORDER BY goles DESC, jugador</SQL>

Las caracteres acentuados son interpretados como si se tratase de dos caracteres en vez de uno y ocupan dos espacios. No se si tiene relación con la sentencia, o es problema de la estructura de la tabla.

Por ejemplo en la cadena de texto "RAUL", RPAD(jugador,15," ") rellena 11 espacios a la derecha y en la cadena de texto "RAÚL", rellena 10 espacios a la derecha.

El problema que me genera esto, es que rompe la alineación de las columnas.

He probado ha modificar la cadena en la estructura de la tabla, he modificado el cotejamiento "latin1_swedish_ci" por latin1_spanish_ci y varios parámetros de la estructura de la tabla, pero no consigo nada.

EDITO: He intentado incluir esto json=json.replace(/Ú/g,"U") en el código JS, pero no permite reemplazar caracteres acentuados. Con cualquier otro carácter si funciona perfectamente.

WillyWeb
29/09/17, 10:05:25
Ese tipo de sustitución que estás intentando no funcionará. Yo diría que el problema está en que el webservice lee una base de datos con texto codificado en UTF y lo envía como texto plano. :rolleyes:

Prueba cambiando las líneas que definen el "header" del PHP para que queden así...

header('Content-Type: xxxx; charset=utf-8');

*En las xxxx deja lo que tengan puesto ahora, no pongas esas xxxx :silbando:

Rsc
29/09/17, 12:50:34
He cambiado las dos líneas que definen el "header" del php tal y como has indicado, y continua igual. Al referir lo de charser=utf-8 me he acordado que es una de las opciones que me deja elegir en la pestaña de cotejamiento de la estructura de la tabla.

No obstante he probado también así y continua igual.

Caravantes
29/09/17, 18:11:45
Empiezo a dudar si ha sido buena idea crear un hilo con toda la información relativa al webservice. Quizás hubiera sido más sensato haber cambiado el título de este hilo, y haber creado otro nuevo para la otra cuestión "comunicarse con otro dispositivo sin plugin"

Hola.
Aunque solo he participado al principio, he seguido el hilo con interés y creo que ha sido una buena experiencia con aprendizaje final. Gracias especiales para los dos protagonistas: WillyWeb y Rsc. Os lo habéis currado bien.

A estas alturas yo creo que lo más oportuno es... Los títulos admiten muchas palabras. Creo que sería buena idea cambiar el título del hilo a algo como...
- Comunicarse con otro dispositivo sin plugin -> Crear un WebService con PHP para una DB SQL en la Web

Además, en el primer post de este hilo yo insertaría un primer párrafo de introducción, explicando el cambio de temática y añadiendo un enlace al otro hilo que has creado (muy bien hecho, gracias).

- Crear un WebService con PHP - Iteractuar con una DB SQL en la Web
http://www.htcmania.com/showthread.php?p=27156494

Creo que de esa forma queda bastante aclarado.

Sobre la organización de los post, Caravantes es la autoridad competente y su criterio siempre ha sido bueno.

Vayaaaa. Gracias pero prefiero pensar que mi opinión tiene tanto valor como la de cualquier otro y está bien que no haya jerarquía.

WillyWeb
29/09/17, 21:30:00
He cambiado las dos líneas que definen el "header" ... la pestaña de cotejamiento de la estructura de la tabla.... y continua igual.

Siguiendo las recomendaciones de los expertos en MySQL y PHP he cambiado el cotejamiento de la tabla a "utf8_unicode_ci" y el de los campos de texto a "utf8_spanish_ci" y en lo que aparece un valor con acento o una "ñ" falla. :cry:

He podido comprobar que el fallo ya aparece en el array que genera la función getArrayDatos() del PHP con lo que sale directamente de la consulta MySQL, así que supongo que el fallo está en que a la consulta le falta algo o que los datos salen mal codificados la tabla.

Estoy en ello. :silbando:

Rsc
29/09/17, 22:34:25
Caravantes así lo haré. Además iré completando el hilo concreto de "Crear un WebService con PHP para una DB SQL en la Web" con todo lo que se ha ido progresando.

prefiero pensar que mi opinión tiene tanto valor como la de cualquier otro y está bien que no haya jerarquía.

Bueno, por lo pronto tanto tu como el resto del equipo de Ataskerados habéis hecho un gran trabajo con este foro, así que seguiremos depositando nuestra confianza en vosotros mientras sigáis con ganas de continuar.

he cambiado el cotejamiento de la tabla a "utf8_unicode_ci" y el de los campos de texto a "utf8_spanish_ci" y en lo que aparece un valor con acento o una "ñ" falla.

Yo he probado también con muchas de las opciones que ofrece la pestaña de cotejamiento, pero o bien se mantiene igual,o se pierde parte del texto,o las palabras acentuadas se convierten en ? etc, en definitiva no he hallado ninguna opción que funcione.

No se si tendrá algo que ver o no, pero me he dado cuenta que al visualizar la tabla desde phpMyAdmin lo que deberían ser acentos, son diéresis, por lo menos mientras el cotejamiento es "latin1_spanish_ci"

WillyWeb
30/09/17, 14:11:17
Veamos si esto funciona...

-Cambia todos los cotejamientos a "utf8_spanish_ci" (no es el único que vale)
-Cambia la línea 57 del PHP (que ahora mismo no hace nada) por esta otra...
mysqli_set_charset($db,"utf8");
-Aunque no parece imprescindible, deja las líneas...
header('Content-Type: xxxx; charset=utf-8');

No te asustes al ver el resultado de una consulta en el navegador. En lugar de acentos y eñes verás otra cosa, pero en la tarea se verá bien porque la función JSON.parse() de JavaScript lo deja todo como debe.

:palomitas:

Rsc
30/09/17, 15:18:47
Como te comenté, probé a cambiar el cotajamiento de la estructura, pero nunca hubiera averiguado que debía añadir al archivo PHP. Ahora se vuelve a ver todo alineado, muchas gracias de nuevo.

Respecto al metodo de usar el WebService, cada día me gusta más. He añadido 15 sentencias SQL al archivo xml, y es lo más cómodo del mundo.

Lo único que me ha ocurrido, es que en dos teléfonos que tengo con android 6, falla la sentencia UPDATE SQL, que tengo para sumar/restar goles y tarjetas. No me preocupa, porque por lo pronto los que vamos a usar la app tenemos android 7 y funciona sin problemas, pero es muy extraño. Todas las demás sentencias funcionan perfectamente...

WillyWeb
30/09/17, 16:46:50
Como te comenté, probé a cambiar el cotajamiento de la estructura, pero nunca hubiera averiguado que debía añadir al archivo PHP. Ahora se vuelve a ver todo alineado, muchas gracias de nuevo.

Genial. :platano:

Respecto al metodo de usar el WebService, cada día me gusta más. He añadido 15 sentencias SQL al archivo xml, y es lo más cómodo del mundo.

Una vez salvada la dificultad inicial de ponerlo en marcha está claro que es una de las mejores formas de compartir una base de datos.

Lo único que me ha ocurrido, es que en dos teléfonos que tengo con android 6, falla la sentencia UPDATE SQL, que tengo para sumar/restar goles y tarjetas...

Ten en cuenta que con el sistema del webservice las sentencias SQL no se ejecutan en el móvil, lo hacen en el servidor. Si falla algo será otra cosa, pero eso no puede ser. :loco:

¿Queda algo más por solucionar? :rolleyes:

Rsc
30/09/17, 22:27:24
Ten en cuenta que con el sistema del webservice las sentencias SQL no se ejecutan en el móvil, lo hacen en el servidor.

Tendré que mirarlo con detenimiento, pero hasta lo he probado con Tasker en vez de con la app, y falla concretamente esa acción. Incluso he establecido las variables de forma manual, en vez de obtenerlas de las etiquetas del elemento menú (%taplabel) y continua fallando... En el registro de ejecución me indica Errignore, realmente es muy extraño...

¿Queda algo más por solucionar?

Nada, la aplicación ya hace su función perfectamente. Además es más rápido de lo que esperaba, cada sentencia que mando a la base de datos tarda entre 1000 y 15000 ms aproximadamente, teniendo en cuenta que cada tarea está complementada con otras cuantas acciones, además del HTTP Get, está muy bien.

Lo mejor de todo, es que me queda muy buen sabor de boca, ya que a excepción del código PHP, todo lo demás lo he comprendido de tal forma que lo puedo extrapolar a cualquier otro proyecto, y al principio lo vi misión imposible...

WillyWeb
01/10/17, 10:08:34
Tendré que mirarlo con detenimiento, pero hasta lo he probado con Tasker en vez de con la app, y falla concretamente esa acción.

Dame la sentencia completa y la pruebo.

Nada, la aplicación ya hace su función perfectamente. Además es más rápido de lo que esperaba, cada sentencia que mando a la base de datos tarda entre 1000 y 1500 ms ...

No está mal teniendo en cuenta que el servidor no es una maravilla.

Lo mejor de todo, es que me queda muy buen sabor de boca, ya que a excepción del código PHP, todo lo demás lo he comprendido...

Pues no te quedes con dudas. Desmenuzamos el PHP hasta que lo entiendas todo. Otra cosa que había pensado es simplificarlo (quitando la parte de XML que no se usa) y añadir comentarios para cada línea.

Rsc
01/10/17, 20:28:05
Perdona, llevo fuera todo el día y cada día me das más pereza escribir desde el móvil, más aún en foros que no puedo ni hacer "quote" de parte del texto.

Dame la sentencia completa y la pruebo.

<opcion>
<nombre>sumargol</nombre>
<SQL>UPDATE goleadores SET goles = (goles+1) WHERE jugador LIKE "#PARAMETRO_1#" AND usuario LIKE "#PARAMETRO_2#" OR jugador LIKE "#PARAMETRO_3#" AND usuario LIKE "#PARAMETRO_4#"</SQL>
</opcion>
<opcion>
<nombre>restargol</nombre>
<SQL>UPDATE goleadores SET goles = (goles-1) WHERE jugador LIKE "#PARAMETRO_1#" AND usuario LIKE "#PARAMETRO_2#" OR jugador LIKE "#PARAMETRO_3#" AND usuario LIKE "#PARAMETRO_4#"</SQL>
</opcion>



Ahí tienes las dos sentencias, pero como te comenté, en móviles con Android 7 funciona perfectamente. Es más en los móviles que me falla, si en vez de usar la acción HTTP Get, uso la acción "navegar a" si que funciona la sentencia UPDATE. Para hacer pruebas, un jugador de la tabla es MESSI y un usuario RAUL sin acento. El OR lo pongo porque algunos jugadores tienen nombre compuesto y &taplabel(#) vale 4 en vez de 3. (Lo primero que hago es separar %taplabel utilizando los espacios como separador)

No obstante, si te es más comodo te paso el nombre de usuario y la contraseña por si te es más cómodo hacer pruebas. Puedes hacer las modificaciones que quieras en las tablas, porque hasta finales de este mes no empezaremos la liga.

Pues no te quedes con dudas. Desmenuzamos el PHP hasta que lo entiendas todo

Eso creo que se me escapa un poco de las manos aunque me lo explicaras, no entiendo ningún lenguaje de programación. Empece con Java y también con JS, pero lo acabé dejando con intención de retomarlo cuando tenga más tiempo...

Otra cosa que había pensado es simplificarlo (quitando la parte de XML que no se usa) y añadir comentarios para cada línea.

Entiendo que te refieres a quitar las referencias al archivo XML que aparecen el el código PHP no? Porque en XML si que lo tengo limpio, únicamente con las sentencias que utilizo.

WillyWeb
02/10/17, 14:38:29
Ahí tienes las dos sentencias, pero como te comenté, en móviles con Android 7 funciona perfectamente...

Lo probaré, pero sigo diciendo que eso no tiene sentido. La versión de Android no debe afectar en nada porque la sentencia SQL no se ejecuta en el móvil. :rolleyes:

Pon aquí la acción HTTP Get para ver exactamente cómo es esa llamada al WebService.

El OR lo pongo porque algunos jugadores tienen nombre compuesto y %taplabel(#) vale 4 en vez de 3. (Lo primero que hago es separar %taplabel utilizando los espacios como separador)

:oh: ¿Y eso no lo puedes hacer de otra forma?

Eso creo que se me escapa un poco de las manos aunque me lo explicaras, no entiendo ningún lenguaje de programación. Empece con Java y también con JS, pero lo acabé dejando con intención de retomarlo cuando tenga más tiempo...

Entonces no te meto en más jardines. :silbando:

Entiendo que te refieres a quitar las referencias al archivo XML que aparecen el el código PHP no?

Sí, claro.

Rsc
02/10/17, 21:33:48
Pon aquí la acción HTTP Get para ver exactamente cómo es esa llamada al WebService.

EDITO: He añadido las tareas de establecer variable, porque la acción HTTP Get esta preparada para usarla al pulsar en la etiqueta de un elemento menú.
UPDATE Gol Messi
A1: Establecer variable [ Nombre:%tap_label2 A:MESSI Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A2: Establecer variable [ Nombre:%tap_label3 A:RAUL Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
<sumargol>
A3: HTTP Get [ Servidor:Puerto:http://pruminio.atspace.eu/webservice.php?opc=sumargol&parm=%tap_label2;%tap_label3;%compuesto;%tap_label 4 Ruta: Atributos: Cookies: User Agent: Cuenta atrás:10 Tipo Mime: Archivo de salida: Confiar en cualquier Certificado:Apagado Continuar Tarea Tras Error:Encendido ]

¿Y eso no lo puedes hacer de otra forma?

Es la forma más efectiva que he encontrado. Se podría hacer más fácil sin nunca se repitiera el nombre de un jugador, pero no es así. Es posible que yo tenga a MESSI y luego lo venda, pero queremos mantener ese registro de goles que yo he marcado con MESSI. Por eso, necesito que la sentencia UPDATE, tenga en cuenta el jugador y el usuario.

Entonces no te meto en más jardines.

Yo te lo agradezco, pero no te quiero hacer perder el tiempo. Si lo desglosas, se que voy a intentar comprenderlo, pero dudo mucho que lo consiga. Cuando tenga un poco de más tiempo quiero seguir de nuevo aprendiendo JAVA. Estuve siguiendo unos videos en youtube de un tal "Jesús Conde" que parece ser que es profesor, y se explica muy bien. Según comentan que cuando aprendes un lenguaje es más fácil aprender el resto.

GraphicAdventure
05/10/17, 20:08:51
Willy se comunica igual de bien con las personas que con las máquinas. ¡Está en todo!
¿Hay algo que no sepas hacer?
¿Cocinar y planchar? :risitas:

Rsc
06/10/17, 16:50:23
WillyWeb, tú también te registraste un atspace, o ha usado otra web?

Yo estoy intentando entrar y no puedo, y tampoco puedo entrar a mi DB desde phpmyadmin.

El caso es que puedo interactuar con la DB desde Tasker...

EDITO: Al poco de escribir ese comentario, se ha arreglado.

Rsc
18/10/17, 10:24:07
--EDITO--

Ahora que lo pienso, creo que la parte del "AS listado" se podría quitar. A fin de cuentas lo que esa sentencia SQL retorna a PHP es la línea formateada que necesitas y no es necesario darle un nombre concreto.

--EDITO--

Confirmado. Es mejor dejar la parte "AS listado".

--EDITO--

He dado con otra forma de hacerlo todavía más simple ...
SELECT CONCAT_WS(SPACE(2), LPAD(goles,2," "), RPAD(jugador,15," "), RPAD(usuario,10," ")) AS listado FROM goleadores ORDER BY goles DESC, jugador

Buenas de nuevo WillyWeb, estaba revisando el contenido del hilo para continuar con el resumen que tengo pendiente de terminar, y me he dado cuenta de que se me pasó hacerte una consulta.

Me podrías explicar cual es la función de "listado" en la sentencia SQL.

Un saludo.

WillyWeb
18/10/17, 10:45:35
Con ese "AS" defines un alias para la columna/campo a la que se lo asignas. En este caso la "columna" es el resultado de esa concatenación.

https://www.w3schools.com/sql/sql_alias.asp

Rsc
23/10/18, 19:00:30
Buenas, llevo mucho tiempo sin participar en este foro, aunque lo sigo visitando frecuentemente.

Este último año, me propuse aprender Java y Android Studio, y aunque sigo muy verde, ya he ido haciendo algunas cosillas.

Lo cuento por aquí, porque fue justo donde comencé este proyecto, y quería compartir con vosotros el resultado final.

Un saludo!

https://youtu.be/t6QF2LJsEOA

Mx WaR HaBiB
06/03/19, 23:09:41
Buenas, llevo mucho tiempo sin participar en este foro, aunque lo sigo visitando frecuentemente.

Este último año, me propuse aprender Java y Android Studio, y aunque sigo muy verde, ya he ido haciendo algunas cosillas.

Lo cuento por aquí, porque fue justo donde comencé este proyecto, y quería compartir con vosotros el resultado final.

Un saludo!

https://youtu.be/t6QF2LJsEOA

buenas tardes

despues de años... veo terminado el trabajo por lo que entiendo al final mas que tasker y una base de datos... lo subiste a un Webhost aparte de Android Studio... es algo que no se puede dominar solo con tasker :( yo queria hacer algo similar pero lo veo con mucho enrollo. :cry:

Tonyedented
20/04/22, 21:30:44
Con ese "AS" defines un alias para la columna/campo a la que se lo asignas. En este caso la "columna" es el resultado de esa concatenación.

https://www.scaler.com/topics/alias-in-sql/