Spanish Realizar consultas e insertar datos a una base de datos mysql

joseIsaac123

Member
Licensed User
Hola a todos, no se mucho sobre el tema sobre conectarme a una base de datos o realizar consultas y guardar datos a una base de datos externa, he trabajado en c# & mysql pero veo que es totalmente distindo en Android.
Alguien podria orientarme un poco porfavor?
tengo B4A version 7.30 y XAMPP version 3.2.2
 

kelevra1602

Member
Licensed User
Longtime User
Podrías utilizar OkHttputils 2

tu código PHP del lado del servidor algo así:
B4X:
<?php

$databasehost = "xxxx";
$databasename = "xxxx";
$databaseusername ="xxxx";
$databasepassword = "xxxx";

$con = mysqli_connect($databasehost,$databaseusername,$databasepassword, $databasename) or die(mysqli_error($con));
mysqli_set_charset ($con , "utf8");
$query = file_get_contents("php://input");
$sth = mysqli_query($con, $query);

if (mysqli_errno($con)) {
   header("HTTP/1.1 500 Internal Server Error");
   echo $query.'\n';
   echo mysqli_error($con);
}
else
{
   $rows = array();
   while($r = mysqli_fetch_assoc($sth)) {
     $rows[] = $r;
   }
   $res = json_encode($rows);
    echo $res;
    mysqli_free_result($sth);
}
mysqli_close($con);
?>


y en tu app
B4X:
Sub Process_Globals
    Private DESCARGAS = "Descargas" As String
End Sub

Sub Activity_Create(FirstTime As Boolean)
ExecuteRemoteQuery("SELECT * FROM tablasql WHERE", DESCARGAS)
End Sub

Sub ExecuteRemoteQuery(Query As String, JobName As String)
    Dim job As HttpJob
    job.Initialize(JobName, Me)
    job.PostString("www.ladireciondelarchivophp.com/miarchivo.php", Query)
End Sub

Sub JobDone (Job As HttpJob)
    If Job.Success Then
        Dim action As String
        Dim res As String
        res = Job.GetString
        Log("Response from server: " & res)
        Dim parser As JSONParser
        parser.Initialize(res)
      
            Select Job.JobName

                Case DESCARGAS
                     ' Acá recibirá la respuesta del servidor
              
            End Select

    Else
        Log(Job.ErrorMessage)
    End If
    Job.Release
End Sub


Te aconsejo visitar estos dos ejemplos
https://www.b4x.com/android/forum/threads/connect-android-to-mysql-database-tutorial.8339/#content
https://www.b4x.com/android/forum/threads/b4x-okhttputils2-with-wait-for.79345/#content
 
Last edited:

studio4

Member
Licensed User
Longtime User
Podrías utilizar OkHttputils 2

tu código PHP del lado del servidor algo así:
B4X:
<?php

$databasehost = "xxxx";
$databasename = "xxxx";
$databaseusername ="xxxx";
$databasepassword = "xxxx";

$con = mysqli_connect($databasehost,$databaseusername,$databasepassword, $databasename) or die(mysqli_error($con));
mysqli_set_charset ($con , "utf8");
$query = file_get_contents("php://input");
$sth = mysqli_query($con, $query);

if (mysqli_errno($con)) {
   header("HTTP/1.1 500 Internal Server Error");
   echo $query.'\n';
   echo mysqli_error($con);
}
else
{
   $rows = array();
   while($r = mysqli_fetch_assoc($sth)) {
     $rows[] = $r;
   }
   $res = json_encode($rows);
    echo $res;
    mysqli_free_result($sth);
}
mysqli_close($con);
?>


y en tu app
B4X:
Sub Process_Globals
    Private DESCARGAS = "Descargas" As String
End Sub

Sub Activity_Create(FirstTime As Boolean)
ExecuteRemoteQuery("SELECT * FROM tablasql WHERE", DESCARGAS)
End Sub

Sub ExecuteRemoteQuery(Query As String, JobName As String)
    Dim job As HttpJob
    job.Initialize(JobName, Me)
    job.PostString("www.ladireciondelarchivophp.com/miarchivo.php", Query)
End Sub

Sub JobDone (Job As HttpJob)
    If Job.Success Then
        Dim action As String
        Dim res As String
        res = Job.GetString
        Log("Response from server: " & res)
        Dim parser As JSONParser
        parser.Initialize(res)
  
            Select Job.JobName

                Case DESCARGAS
                     ' Acá recibirá la respuesta del servidor
          
            End Select

    Else
        Log(Job.ErrorMessage)
    End If
    Job.Release
End Sub


Te aconsejo visitar estos dos ejemplos
https://www.b4x.com/android/forum/threads/connect-android-to-mysql-database-tutorial.8339/#content
https://www.b4x.com/android/forum/threads/b4x-okhttputils2-with-wait-for.79345/#content


Buenas tardes,
Estoy igual que el compañero. Uso el código que has facilitado en el foro (mil gracias), pero recibo un mensaje de error que no llego a entender. He de decir que ni mucho menos soy un experto, pero en su día con httputils si que conseguí conectar bien. En cambio ahora con las nuevas librerías no paro de recibir fallos y no puedo hacer una simple consulta a una base de datos de prueba muy sencilla. Si alguien fuese tan amable de echarme un cable estaría infinitamente agradecido. A continuación cuelgo el mensaje de error y el código implementado en la app. Siemplemente quiero hacer una consulta sencilla de lo que tiene una tabla de mi base de datos. El error me da en la línea 64.
P.D.: He consultado un montón de hilos y nada.
 

Attachments

  • error.png
    error.png
    20 KB · Views: 245
Last edited:

josejad

Expert
Licensed User
Longtime User
Hola studio4.
Es difícil ayudarte si no pones tu código, sería bueno que lo pegaras como texto con los tags [ code ] ... [/code] y que crearas un hilo nuevo. Veo que lo has creado en el foro general y te daría el mismo consejo para que sea más fácil ayudarte. O bien subir un proyecto (exportando como zip) o bien pegaras tu código como texto.

saludos,
 

studio4

Member
Licensed User
Longtime User
Ok, subo el archivo. Muchísimas gracias por tu rápida respuesta.
 

Attachments

  • sample.zip
    8.5 KB · Views: 330

josejad

Expert
Licensed User
Longtime User
Bueno, no he usado nunca esta forma de recibir datos de una base de datos, pero a ver, si ves el log que te devuelve:
B4X:
Log("Response from server: " & res)
Verás que no es un JSON, sino HTML. Buscando en el foro el error: "JSON Array expected" hay muchas respuestas.
Lo primero que se me ocurre es que pruebes en un navegador a llamar a tu php (deberías poner el código) hasta que veas que la salida es un JSON.
De las respuestas del foro, quizás la que tiene más pinta de ser lo que te está pasando es lo que comenta el compañero @Descartex en este hilo, al tratarse de un hosting gratuito. Puedes probar en local con XAMPP a ver si te ocurre lo mismo.
https://www.b4x.com/android/forum/threads/json-array-expected-solucionado.74042/#post-470539

Aunque no veo en el log nada entre [ ], pero puede ser porque está truncado.

saludos,
 

studio4

Member
Licensed User
Longtime User
En primer lugar, gracias por la respuesta.
Llevo toda la mañana intentando. He pasado por el hilo que me indicas y tampoco he conseguido echarle a andar. He incluso me he abierto otra cuenta en otro proveedor de hosting gratuito, pero tampoco lo consigo solucionar.
El caso es que con la librería antigua de httputils... si que conectaba sin problema y usando los mismos archivos .php (cambiando las credenciales y el nombre de la base de datos), eso sí, en un hosting de pago.
Según me ponen en el foro general, parece ser que cuando apunto al fichero .php, la página me debe estar redireccionado a la web general de la empresa del hosting, pero no lo tengo claro del todo, puesto que ni mis conocimientos de inglés ni mi manejo del tema es muy elevado.
No se si contratar un servicio de hosting de pago para salir de dudas, pero me parece una pasada para nada que voy a hacer.
Muchas gracias de nuevo y si se te ocurre algo más, aquí estoy dispuesto a escuchar de mil amores.
 

josejad

Expert
Licensed User
Longtime User
Hola:

Efectivamente como te dice DonManfred, anoche cuando intenté conectar a tu dirección, me reenviaba a la página principal del hosting.
Se me ocurre que instales XAMPP en tu ordenador, y hagas las pruebas en local hasta comprobar que todo funciona, y luego te complicas con el hosting.
A ver, no soy un experto, pero hasta donde sé, tu php debería devolverte un jSON incluso si lo pones en el navegador. Es decir, si pones en tu navegador algo como:
http://www.yourdomain.com/myscript.php?action=getPersons
el navegador debería devolverte algo como:
B4X:
[{"name":"Klaus","age":"30"},{"name":"Michael","age":"40"},{"name":"test","age":"23"},{"name":"Peter","age":"59"},{"name":"Thomas","age":"54"}]
Deberías echarle un ojo a este tutorial.
https://www.b4x.com/android/forum/t...using-httputils2-part-3-php-mysql-json.42663/

Pon también tu script php en el foro para probarlo y ver qué devuelve
 

studio4

Member
Licensed User
Longtime User
Buenas de nuevo.
He revisado el hilo, pero no consigo adaptarlo. De hecho, mi ejemplo es mucho menos ambicioso.
Al final he optado por reservar un dominio y probar un hosting de pago de un mes. No es mucho desembolso y me quito la posibilidad de que se debiese a que fuese gratuito, pero sigo igual.
La verdad es que lo que pretendo es muy sencillo, pero nada.
Adjunto de nuevo el ejemplo modificado con la nueva ubicación del archivo .php y el proyecto junto con una imagen en la que aparece el error. El dominio es www.jrh2.tech y conecto a él perfectamente con un cliente ftp y he comprobado que funciona en el buscador.

Pongo el php (es el que usaba hace años, con otro hosting y funcionaba bien):

<?php

$databasehost = "localhost";
$databasename = "test1";
$databaseusername ="user1";
$databasepassword = "pwduser1";

$con = mysqli_connect($databasehost,$databaseusername,$databasepassword, $databasename) or die(mysqli_error($con));
mysqli_set_charset ($con , "utf8");
$query = file_get_contents("php://input");
$sth = mysqli_query($con, $query);

if (mysqli_errno($con)) {
header("HTTP/1.1 500 Internal Server Error");
echo $query.'\n';
echo mysqli_error($con);
}
else
{
$rows = array();
while($r = mysqli_fetch_assoc($sth)) {
$rows[] = $r;
}
$res = json_encode($rows);
echo $res;
mysqli_free_result($sth);
}
mysqli_close($con);
?>

Agradezco enormemente la ayuda que me prestas.
 

Attachments

  • error.png
    error.png
    22.7 KB · Views: 228
  • test.zip
    8.6 KB · Views: 243

josejad

Expert
Licensed User
Longtime User
Hola Studio:

Volvemos a lo mismo, en el log de B4A, tu consulta no devuelve nada y debe recibir un jSON
Mira, prueba este script en tu servidor, lo he modificado un poco del ejemplo que te puse, te dejo cosas dentro del "switch" por si luego quieres añadir cosas
B4X:
<?php
$host = "localhost";
$db = "test1";
$user = "user1";
$pw = "pwduser1";

$con = mysql_connect($host,$user,$pw) or die(mysql_error());
mysql_select_db($db) or die(mysql_error());
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET NAMES 'utf8'");

$action = $_GET["action"];
switch ($action)

{
    case "CountPersons":
        $q = mysql_query("SELECT * FROM Persons");
        $count = mysql_num_rows($q);
        print json_encode($count);
    break;
  
    Case "GetData":
        $q = mysql_query("SELECT campo1, campo2 FROM tabla1");
        $rows = array();
        while($r = mysql_fetch_assoc($q))
        {
            $rows[] = $r;
        }
        print json_encode($rows);
    break;
  
    case "InsertNewPerson":
        $name = $_GET["name"];
        $age = $_GET["age"];
        $q = mysql_query("INSERT INTO Persons (name, age) VALUES ('$name', $age)");
        print json_encode("Inserted");
    break;
  
}

?>

Súbelo a tu host, y pon en tu navegador:
http://www.jrh2.tech/php/conexion3.php?action=GetData

Tu navegador te debe devolver algo como
upload_2019-11-20_17-11-11.png

Cuando tu script devuelva eso, prueba la app de nuevo, tu línea
B4X:
Log("Response from server: " & res)

Debe ser algo como:
Response from server: [{"dni_operario":"74623608Q","proyecto":"M5022276"},{"dni_operario":"74...
 
Last edited:

f0raster0

Well-Known Member
Licensed User
Longtime User
lo que yo hago:

1) Instalar Xamp
https://www.apachefriends.org/es/index.html
(no usar claves, ni usuarios, test para probar simple)

2) Iniciar Xamp, iniciar Apacha e iniciar MySQL
3) ir a MySQL al dar click en Admin

1.jpg


4) Crear una base de datos llamada: test
Crear tabla: tabla1
Crea los campos: id, campo1, campo2
Ingresar algunos datos en id, campo1, campo2

2.jpg

3.jpg

5) Crear dos php:
settings.php
ObtieneDatos.php

settings.php
B4X:
<?php
  $link=mysqli_connect("localhost","root","","test")
  or die(mysql_error());
?>

ObtieneDatos.php
B4X:
<?php
    header('Content-type: application/json; charset=utf-8');
    error_reporting(-1);
    ini_set('display_error','1');
    include 'settings.php' ;
    $acentos = $link->query("SET NAMES 'utf8'");

    $query = "SELECT * FROM tabla1 order by id;"
    or die ('Error'.mysqli_error($query));

    $result=$link->query($query);
    
    $cursos=array();
    while($row=mysqli_fetch_array($result)){
        $cursos[]=$row;
    }
    $json=json_encode($cursos);
    
    echo $json;
?>

crea un carpeta por ejemplo llamada: phptestbasic
y dentro guarda: settings.php y ObtieneDatos.php
dicha carpeta phptestbasic debe estar en C:\xampp\htdocs\
4.jpg


6) Test el php: en el navegador escribir:
http://localhost/phptestbasic/ObtieneDatos.php

debe mostrar:
[{"0":"1","id":"1","1":"test1campo1","campo1":"test1campo1","2":"test1campo2","campo2":"test1campo2"},{"0":"2","id":"2","1":"test2campo1","campo1":"test2campo1","2":"test2campo2","campo2":"test2campo2"}]

SOLO si funciona hasta aqui, ya sea utilizando Xamp o el servidor, puedes seguir con la App

Para luego seguir con el App Android necesitas saber el IP, entonces
cmd -> ENTER -> y escribir ipconfig
te entregara la ip a usar en el link de tu APP
ejemplo: "http://192.168.1.19/phptestbasic/ObtieneDatos.php/"
 

studio4

Member
Licensed User
Longtime User
lo que yo hago:

1) Instalar Xamp
https://www.apachefriends.org/es/index.html
(no usar claves, ni usuarios, test para probar simple)

2) Iniciar Xamp, iniciar Apacha e iniciar MySQL
3) ir a MySQL al dar click en Admin

View attachment 85715

4) Crear una base de datos llamada: test
Crear tabla: tabla1
Crea los campos: id, campo1, campo2
Ingresar algunos datos en id, campo1, campo2

View attachment 85716
View attachment 85717
5) Crear dos php:
settings.php
ObtieneDatos.php

settings.php
B4X:
<?php
  $link=mysqli_connect("localhost","root","","test")
  or die(mysql_error());
?>

ObtieneDatos.php
B4X:
<?php
    header('Content-type: application/json; charset=utf-8');
    error_reporting(-1);
    ini_set('display_error','1');
    include 'settings.php' ;
    $acentos = $link->query("SET NAMES 'utf8'");

    $query = "SELECT * FROM tabla1 order by id;"
    or die ('Error'.mysqli_error($query));

    $result=$link->query($query);
   
    $cursos=array();
    while($row=mysqli_fetch_array($result)){
        $cursos[]=$row;
    }
    $json=json_encode($cursos);
   
    echo $json;
?>

crea un carpeta por ejemplo llamada: phptestbasic
y dentro guarda: settings.php y ObtieneDatos.php
dicha carpeta phptestbasic debe estar en C:\xampp\htdocs\
View attachment 85718

6) Test el php: en el navegador escribir:
http://localhost/phptestbasic/ObtieneDatos.php

debe mostrar:
[{"0":"1","id":"1","1":"test1campo1","campo1":"test1campo1","2":"test1campo2","campo2":"test1campo2"},{"0":"2","id":"2","1":"test2campo1","campo1":"test2campo1","2":"test2campo2","campo2":"test2campo2"}]

SOLO si funciona hasta aqui, ya sea utilizando Xamp o el servidor, puedes seguir con la App

Para luego seguir con el App Android necesitas saber el IP, entonces
cmd -> ENTER -> y escribir ipconfig
te entregara la ip a usar en el link de tu APP
ejemplo: "http://192.168.1.19/phptestbasic/ObtieneDatos.php/"


Buahhhhh... Increíble tu trabajo. Muchas gracias por tu esfuerzo y por compartir tus conocimientos. Eternamente agradecido.
Gracias a lo que me expusiste, me decidí a contactar con el admin del hosting y hemos encontrado la solución.
Efectivamente, llevabas razón. El archivo no devolvía ningún valor y todo era causa de que este tipo de hospedaje agrega una pequeña "secuencia" a los nombres de los elementos de la bd (nombre de bd, usuario, contraseña). Ha sido ponerlo y empezar a funcionar sin modificar el código de la app. Mil gracias de nuevo. Un gran abrazo.
 
Top