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)

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 00:01:03.

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