Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   ¿alguien sabe hacer esto? (conexion a mySQL desde delphi pero sin acceso...) (https://www.clubdelphi.com/foros/showthread.php?t=13593)

seccion31 24-08-2004 18:28:19

¿alguien sabe hacer esto? (conexion a mySQL desde delphi pero sin acceso...)
 
Hola !

gracias por leer este mensaje, voy a explicarte:

Tengo un espacio web que dispone de una base de datos en MySQL, el problema es que solo puedo acceder a ella via localhost, es decir (yo me entiendo asi) via programa php, asp etc... pero no via desktop o desde una aplicacion en delphi.

ahora bien:

¿podria acceder enviando las consultas como si fuera una aplicacion localhost y recuperar los resultados de alguna forma? (aunque tuviera cortar y pegar trozos de texto por ejemplo).

A mi se me habia ocurrido, crear un programa php desde delphi, copiarlo por ftp al servidor, ejecutarlo y que deje el resultado de la consulta como un archivo en el ftp. pero eso me parece muy chapuzas, a parte de que tendria que abrir el explorer (oculto si se puede) para ejecutar el php.

igual hay formas profesionales de hacer eso,
si sabes como y me lo puedes explicar claramente, me seria de ayuda.

Saludos

: )

gracias x tu interes.

Sirkius 24-08-2004 19:11:46

Podrias hacer un script en php que reciba como argumento la sentencia SQL, y que devuelva el resultado poniendo delimitadores entre los distintos campos y luego separarlos, pero es una solucion chapuzera :P

salvica 24-08-2004 21:45:16

Yo lo hago con los objetos "ZEOS" y funcionan de maravilla (Delphi-7 y Kilix) tanto en Window$ XP como en Linux.

Creo una Consulta (con el ZQuery, conectado a un ZConnection) en tiempo de ejecución y la lanzo sin problemas (ahora, que al principio las pasé "canutas" por no darme cuenta de crear los usuarios y darlos derechos y todo eso)

Esta ha sido la última, gracias a Sirkius
Código Delphi [-]
   with Query do begin
        SQL.Clear;
        SQL.Add( 'DELETE FROM '+strSqlTabla );
        SQL.Add( '      WHERE UNIX_TIMESTAMP(Fecha) < UNIX_TIMESTAMP()-6*3600 ' );
        SQL.Add( '        AND es_rueda="0"' );
        SQL.Add( '        AND es_ruta="0";' );
        if ES_DEBUG then SQL.SaveToFile( DIR_DEBUG+OS_Separador+'LIMPIAR_'+strSqlTabla+'.sql') ;
        ExecSQL;
   end;
Lo del "DEBUG" es para que me escriba la SQL al disco (por si hay problemas)
Saludos

roman 24-08-2004 21:57:54

Cita:

Empezado por salvica
Yo lo hago con los objetos "ZEOS" y funcionan de maravilla (Delphi-7 y Kilix) tanto en Window$ XP como en Linux.

Esto no le servirá. El problema es que la aplicación Delphi estará en una máquina distinta al servidor de Mysql y seccion31 sólo tiene derechos desde localhost.

// Saludos

salvica 24-08-2004 22:09:12

Cita:

Empezado por roman
Esto no le servirá. El problema es que la aplicación Delphi estará en una máquina distinta al servidor de Mysql y salvica sólo tiene derechos desde localhost.
// Saludos

Hola Román, disiento contigo, si tienes derechos en la Base de Datos, salvica puede estar donde quiera, ya que la conexión es una IP cualquiera y solo necesitas el username y el password (por lo menos así lo tengo en el currelo, la BD en Linux y el proceso en W2000, y no me falla)
Saludotes

roman 24-08-2004 22:15:29

Cita:

Empezado por salvica
si tienes derechos en la Base de Datos, salvica puede estar donde quiera, ya que la conexión es una IP cualquiera y solo necesitas el username y el password

Esto no es así. MySql te permite asignar derechos con base en el usuario, el host, la base de datos, la tabla y hasta una columna en específico.

Otra cosa es que en la definición de derechos puedes especificar comodines de manera que se pueden asignar permisos a un usuario para conectarse desde cualquier IP.

Normalmente un proveedor de servicios sólo te dará derechos desde localhost.

// Saludos

salvica 24-08-2004 22:24:50

Perdona Román, creo que no me he explicado bién.

Cuando accedo a la BD, el usuario salvica debe estar creado y tener derechos de acceso (inserción, borrado, etc.) a una BD, que es lo único que requiere la conexión de los objetos ZEOS, yo no estoy diciendo que por tener estos objetos voy a entrar por la cara a reventar una BD en la que ni me conocen ni sé como se entra.

Siento haberme explicado mal, pero el ejemplo que puse era para indicarle como se hacia una conexión a MySql con Delphi.
Chao

roman 24-08-2004 22:41:56

Cita:

Empezado por salvica
Perdona Román, creo que no me he explicado bién.

Sí te explicaste bien pero no estás en lo correcto. Tú puedes existir como usuario en un servidor MySql y tener derecho a X base de datos. Pero el administrador te puede restringir el acceso sólo a localhost. Eso significa por ejemplo, que puedes colocar un script php (suponiendo que el servidor Web está en la misma máquina que el de MySql) y hacer consultas a tal base de datos. Pero debido a la restricción, si intentas conectarte con Zeos desde tu pc, no podrás hacerlo, a pesar de existir en el servidor como usuario y con derechos a la base.

A Zeos no necesitas indicarle nada más de lo que mencionas por que no es Zeos quien se encarga de eso sino el propio servidor de MySql.

Cuando lanzas una petición al servidor de MySql, lo primero que éste hace es checar la tabla user y buscar un registro que contenga tu nombre de usuario y la ip desde la que te conectas. Si no aparece dicho registro entonces te deniega el acceso. Claro que pede aparecer una entrada del tipo:

(salvica, %)

donde % indicaría que puedes conectarte desde cualquier dirección. Pero si la entrada es

(salvica, localhost)

entonces sólo podrás conectarte desde localhost (y localhost significa la máquina donde está el servidor de MySql)

También podría ser

(salvica, 200.25.38.92)

y en tal caso sólo podrás conectarte desde la ip 200.25.38.92.

Si aún no te convenzo, mañana te creo una cuenta aquín en mi pc para que tú mismo veas la diferencia.

// Saludos

salvica 24-08-2004 23:08:38

Vale, perdona Román pero el que no habia leido bién era yo :(
Cita:

Empezado por seccion31
... solo puedo acceder a ella via localhost, es decir (yo me entiendo asi) via programa php, asp etc... pero no via desktop o desde una aplicacion en delphi.....

Supongo que como espacio web, tendrá asignada una cuenta FTP, con lo que (es una idea) podría generar una página de sentencias SQL en un archivo PHP e incustrarla en una cabecera HTML, al acabar la transacción solo tendría que ejecutar la cabecera HTML para que se actualizase la BD. (para eso las INDY funcionan muy bien)

Siento la confusión, a la proxima leere más despacio :rolleyes:
Saludos

AMO 25-08-2004 01:09:27

Me enfrente al mismo dilema, lo que opte fue, como ya se indico mediante un script php colocado en el servidor se reciben las peticiones SQL y el script construye un archivo de salida ASCII delimitado por comas (o cualquier delimitador).

La forma de operar es la siguiente: Se construyo una aplicacion en delphi con el componente NMHTTP1 este genera una solicitud GET al sitio con el script, el script procesa el comando y devuelve el resultado el cual lo obtenemos en la propiedad body del componente. La propiedad body es separada e insertada en un Tclientdataset con lo cual ya nos permite manejarlo con los componentes normales de para bases de datos.

Aunque la solucion es muy rudimentaria, el usuario final no percibe diferencia, y la velocidad es excelente.

seccion31 25-08-2004 13:16:39

Hola !

graciasa todos por vuestras respuestas.

Para AMO:

Eso es + - lo que estaba buscando, pero sobre lo que dices no tengo ni idea, podria investigar y supongo que lo conseguiria, pero si no es mucha cara, podrias enviarme un ejemplo de como se haria? (algo simple bastaria luego yo me arreglo). (desconozco si esas peticiones estan permitidas aqui).

Es para un proyecto no comercial (un hobby que tengo (con una saga televisiva)). : D www.saracosta.com

bueno, lo dicho si puedes enviarme el ejemplo te estaria muy agradecido.

(mi direccion seccion31@terra.es )

Saludos a todos.

: )

marto 25-08-2004 13:51:08

Wop!

Quería comentar dos cosas, en primer lugar, si AMO tiene a bien enviar ese ejemplo, sería de agradecer que lo hiciese aquí, y no por correo. De esta manera, si otro usuario tiene la misma duda, lo podrá ver.

Además quería completar la aportación de AMO. Yo he programado muchas veces comunicaciones entre una aplicación Windows y un servidor web, que en el fondo es lo que se quiere hacer. Despues de hacerlo de diversas maneras, creo que la más escalable y mantenible (con una pérdida de velocidad menospreciable) es la técnica expuesta por AMO pero, en lugar de enviar texto plano, enviar un documento xml. Desde Delphi te es igual de fácil de interpretar, pero las posibilidades de xml son mayores. Eso sin tener en cuenta que, por ejemplo, una inserción de un nuevo campo en la primera posición de un CSV te dará mucho más trabajo que si es en xml. ;)

seccion31 25-08-2004 16:20:18

hola !

(lo de no postear aqui el ejemplo era por si acaso estaba mal visto).
Bueno he buscado ese componente y no aparece en delphi 7, ya que parece que la empresa lo distribuyo unicamente para delphi 3, 4 y 5. (ahora lo vende a casi 200$), pero seguro que hay algun otro que lo reemplaza en delphi 7.

voy a intentar llegar a algo investigando los componentes que trae D7.

Si alguien quiere ayudarme, soy todo oidos.

gracias.

: )

marto 25-08-2004 16:50:10

Wop!

Lo puedes hacer perfectapente con un TIdHttp ;)

roman 25-08-2004 16:52:18

Cita:

Empezado por seccion31
Bueno he buscado ese componente y no aparece en delphi 7

¿Te refieres a NMHTTP? En Delphi 7 dispones de las componentes Indy. Vienen incluidas pero también puedes bajar la última versión de la página de Indy Project.

// Saludos

marto 25-08-2004 16:56:06

Cita:

Empezado por roman
¿Te refieres a NMHTTP? En Delphi 7 dispones de las componentes Indy. Vienen incluidas pero también puedes bajar la última versión de la página de Indy Project.

// Saludos

Te gané :p:p:p

roman 25-08-2004 16:59:20

Cita:

Empezado por marto
Te gané :p:p:p

Bueno, es que me retrasé un poquillo buscando el enlace a la página de Indy ;)

seccion31 25-08-2004 18:04:52

ok, gracias


de momento ya soy capaz de recuperar "una" pagina:

esto lo voy poniendo, porque luego enviare un ejemplo completo de como hacerlo ¿vale? (asi los que esten en mi caso no tendremos que ir muy lejos)

(objeto Indy IDHttp)

s:=IDHTTP1.Get('http://www.saracosta.com/logos.htm');

(casi nada) : D

cuando trato de recuperar una que no existe:

http:/1.1 404

(osea la pagina no existe) ¿no hay otra forma de detectar que no existe?

voy ahora a intentar subir dinamicamente un PHP y que lo ejecute. (eso sera para nota)

luego os cuento.

(si el moderador cree que no debo seguir asi este hilo que avise ¿eh?)

marto 25-08-2004 18:11:58

Wop!

Cita:

Empezado por seccion31
(si el moderador cree que no debo seguir asi este hilo que avise ¿eh?)

¡¡¡¡Norl!!!!! ¡¡¡ojalá todos puesiesemos las soluciones de lo que no entendemos aquí!!!

Solo una cosa, intenta poner el código delphi entre tags [delphi] y el php, [php], sino, a la que la cosa se complique no va a haber quién lo siga ;)

seccion31 25-08-2004 19:17:03

La siguiente funcion me devuelve:

http/1.0 405 method not allowed


Mi duda es, ¿debo registrarme de alguna forma? (como con un servidor ftp dando mi username y password)

¿debo generar las cabeceras http en el documento?

Aqui va la funcion que empleo

Código Delphi [-]
var
  s:string;
  o:TstringList;
begin
    o:=TstringList.create;
    o.loadFromFile('C:\phpsamle\prueba.php');
    s:=IDHTTP1.Post('http://www.saracosta.com',o);
    showmessage(s);
    o.free;
end;


(prueba.php esta OK, y devuelve una simple cadena 'hola')

Código PHP:

 
<?php
echo 'hola'
?>


AMO 26-08-2004 08:20:42

Saludos

Van los codigos

Primero el ejemplo del script de PHP: Este archivo tiene el nombre de ejemplo.php
Código PHP:

<?php
include("config.inc.php");
        
header('Content-type:application/x-msexcel'); 

$db mssql_connect ($hostname$username$password) or die ("ERROR: cannot connect to msql server");
mssql_select_db($dbname,$db) or die ("ERROR: cannot access database");

$query=$sql;
$query_result_handle mssql_query ($query) or die ("ERROR: query '$query'");
$num_of_rows mssql_num_rows ($query_result_handle) or die ("ERROR: no data returned from query '$query'");

$jmssql_num_fields($query_result_handle);

$k=0;

for (
$count 1$row mssql_fetch_row ($query_result_handle); ++$count)
{
$S="";
for (
$k=0$k $j; ++$k)
{
  
$S $S $row[$k] . "&";
}

 
$S=$S.chr(13);

 echo 
$S;
}

mssql_close ($db);

?>

Primero:
El include simplemente es un archivo donde tengo definido las variables $hostname, $username, $password.
Segundo:
El codigo sql proviene de un parametro al llamar al archivo (ejem: ejemplo.php?sql=etc...)
Tercero
El header se quedo del codigo original que creaba un formato tipo excel!
lo deje porque asi el navegador interpreta el bajar un archivo y no presenta el resultado en pantalla.
Por ultimo:
La coneccion se realiza a un SQL server pero cambiando las sentencias MSSQL_ por MYSQL_ funciona para mySQL (probado)




Pasamos a Delphi

En una forma se inserta un Tedit, un TClientdataset y el componente NMHTTP1 se coloca la propiedad outputfilemode a true (con esto lo que provenga de internet se salvara en archivos)

Se pone el nombre de archivo que se desee en las propiedades Body y Header
por ejemplo para el campo Body seria: C:\a.txt

en el tedit se escribiria la sentencia SQL

Insertamos un boton y en el evento onclick colocariamos lo siguiente:

NMHTTP1.Get('localhost\ejemplo.php?sql='+edit1.text);

En el evento NMHTTP1Success quedaria algo asi:

...
Código Delphi [-]
 if FileExists('c:\a.txt') then
 begin
    AssignFile(F, 'c:\a.txt');   { File selected in dialog box }
    reset(F);
  while not eof(f) do
  begin
    inc(i);
    Readln(F, S);
    Clientdataset1.insert;

    for j:=0 to nn do
    begin
    s1:=copy(s,1,pos('&',s)-1);
         delete(s,1,pos('&',s));
    Clientdataset1.fields[j+1].value:=s1;
    end;
....

Al terminar de leer el ascii se tiene lleno el Clientdataset

En resumen: Se escribe una sentencia sql y al presionar el boton se envia la peticion al script php, este procesa y envia un archivo de regreso con el resultado de la sentencia, este archivo es salvado en disco (c:\a.txt ). Y al indicarnos el componente que se ha terminado de bajar (NMHTTP1Success) se consulta si existe el archivo y se procesa como se desee.

Es claro que en estos codigos faltan detalles, como el obtener los nombres de los campos que integran el resultado, los tipos de datos etc.. Pero creo que es una buena pista para exponer la idea del trabajo.

Considero el archivo PHP muy pequeño y util, el resto del trabajo se realiza del lado cliente

Otra alternativa es colocar la respuesta del script a un formato excel, con lo cual ya podemos manejar nativamente este formato.


No he podido colocarles el codigo que actualmente uso, dado que esta muy enfocado a la administracion de mis BD y no resultaria sencillo el explicarlo. Tampoco pude pulir esto mas sorry... He tenido un mundo de trabajo, pero no he querido parecer egoista y tardarme mas en presentarles este codigo, espero les sirva y si tienen dudas con toda confianza.

Saludos













:(

EDITA MARTO: Añadidos tag's [delphi] y [php]

marto 26-08-2004 09:13:17

Wop!

Por favor, usad los tags [delphi] y [php]!!!! Por cierto, todos los tags tienen que cerrarse como en HTML, es decir, [TAG] .... [/TAG], sinó, el motor de los foros pasa de ellos ;).
Os he editado los mensajes para que veais lo chulos que quedan y lo fácils que es ahora seguir el código, pero no os acostumbréis :p

seccion31 27-08-2004 12:02:56

hola !


disculpas por no entender lo de [php] (sorry),

y gracias x el ejemplo, me es muy util sobre todo por el manejo de los clientdataset. ahora bien: supongo que el localhost te dejara ejecutar tu programa php (a mi no me deja: error 405), creo que es porque lo deben tener protegido para que cualquiera no pueda ejecutar un php en su servidor si el codigo no reside en el ¿no? (suena logico tambien).

no he encontrado un metodo de autorizacion que le permita creer que el codigo php que le envio en mi idhttp reside en su servidor.

asi que la unica forma de hacerlo es creando un php (que resida en mi servidor), que haga la conexion a la B.D. y ejecute un parametro que yo le envie, y ese parametro sera una sentencia SQL (supongo que se podra), ahora bien: (releyendo tu ejemplo me doy cuenta de que haces exactamente eso) ; ) (thks)

creo que el limite de los parametros era de 8mb? puede ser? (eso seria suficiente, incluso para una operacion INSERT con muchos campos).

yo sigo intentando y posteare el ejemplo completo (que x lo que veo al tuyo le falta poco para estar completo), quiza pase algunos dias pero yo vuelvo a dar la lata.

saludos.

gracias

: )

seccion31 27-08-2004 16:06:29

hola !

ya casi esta, pero me da el error:

http/1.0 400 bad request.

sigo investigando, porque el php que he copiado al server funciona Ok (desde browser), y solo falla cuando lo solicito via idhttp1.get(".....")

(lo he editado x q ya se q pasa)

hay que codificar los * & % antes de hacer la peticion, y en

select * from pruebas (aparece el *) y debe mostrarse asi:

select%20*%20from%20pruebas


cuando tenga todo Ok, lo posteo paso a paso.

saludos

: )

roman 27-08-2004 17:14:23

Por si aún no lo has visto, para codificar la cadena puedes usar el método de clase TIdUri.URLEncode de la unidad IdUri. Aplicas esta función a toda la cadena que le pasas a Get.

// Saludos


La franja horaria es GMT +2. Ahora son las 15:53:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi