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'");
$j= mssql_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');
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]