Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Parametros entre Delphi y PHP (https://www.clubdelphi.com/foros/showthread.php?t=77464)

guitarrahugo 28-01-2012 23:18:16

Parametros entre Delphi y PHP
 
Hola amigos, soy principiante en la programación y estoy tratando hacer un programa en delphi que le pase 3 parámetros a una función en php (usuario, contraseña, sentencia SQL) y este devuelva un resultado sin que nunca se habrá la pagina web donde está alojada mi función php.
Esto sería algo así: yo le paso un nombre de usuario, una contraseña y una sentencia SQL como por ejemplo: CREATE TABLE Personas(Nombre varchar(15),Apellido varchar(15),Edad int), y la función me devuelva ‘ok’ si pudo crear la tabla o ‘Error ’si hubo algún problema. Les ruego si me pueden orientar con un ejemplo básico como para ver como pasar estos 3 parámetros desde delphi y ver también de que manera debería recibirlos la función php.
Espero haber sido claro, y desde ya les agradezco su ayuda. Saludos. Hugo

Casimiro Notevi 28-01-2012 23:57:39

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración.

Recuerda poner etiquetas al código, ejemplo:


Si ya has leído la guía de estilo, verás que es conveniente que además de poner un título bien descriptivo a lo que preguntas, también es útil hacerlo en el foro adecuado, lo has puesto en "Noticias", y evidentemente esto no es una noticia, la paso a varios.

guitarrahugo 29-01-2012 23:16:19

Hola. Siento mucho haber colocado mal mi consulta, y no haber cumplido con las normas del foro, como veras es mi primera participación en él. La próxima vez pondré más atención a las normas establecidas para las publicaciones. Espero sepan disculparme. Muchas gracias.

Casimiro Notevi 29-01-2012 23:26:02

No te preocupes, estas cosas pasan al principio :)

A ver si alguien conoce sobre lo que preguntas y te echa una mano.
Saludos.

guitarrahugo 30-01-2012 01:12:17

Amigos, eh intentado empezar por algo más sencillo, para ver que funcione, y luego si desarrollar el programa completo que explico arriba. Estuve viendo algunos ejemplo de lo que hay en el foro y trate de armar un formulario delphi que mande a llamar una función en php y esta le devuelva un string con los mensajes ‘Datos Correctos’ o en su defecto ‘Datos incorrectos’. Este es el código de delphi

Código Delphi [-]
function URLEncode(Str: string): string;
var
  i: integer;
begin
  Result:= '';
  for i:= 1 to Length(Str) do
    if Str[i] in ['A'..'Z','a'..'z','0'..'9','-','_','.'] then
      Result:= Result + Str[ i ]
    else
      Result:= Result + '%' + IntToHex(Ord(Str[ i ]),2);
end;
function SendRequest(Server, Uri: string; Port: Word; Params: TStringList;
  Response: TStream): Boolean;
var
  hNet: HINTERNET;
  hCon: HINTERNET;
  hReq: HINTERNET;
  Context: DWORD;
  Buffer: array[0..10240] of Char;
  BytesRead: DWORD;
  i: integer;
  Str: String;
  Success: Boolean;
begin
  Context:= 0;
  Result := FALSE;
  hNet := InternetOpen('Agente', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hCon:= InternetConnect(hNet,PChar(Server),Port,nil,nil,
      INTERNET_SERVICE_HTTP,0,Context);
    if (hCon <> nil) then
    begin
      if Params <> nil then
        hReq:= HttpOpenRequest(hCon,'POST',PChar(Uri),nil,nil,nil,
          INTERNET_FLAG_RELOAD,Context)
      else
        hReq:= HttpOpenRequest(hCon,'GET',PChar(Uri),nil,nil,nil,
          INTERNET_FLAG_RELOAD,Context);
      if (hReq <> nil) then
      begin
        if Params <> nil then
        begin
          Str:= Emptystr;
          for i:= 0 to Params.Count - 1 do
            Str:= Str + '&' + URLEncode(Params.Names[i]) + '=' +
              URLEncode(Params.ValueFromIndex[i]);
          Delete(Str,1,1);
          Success:= HttpSendRequest(hReq,
           'Content-Type: application/x-www-form-urlencoded',Cardinal(-1),
            PChar(Str),Length(Str));
        end else
          Success:= HttpSendRequest(hReq,nil,0,nil,0);
        if Success and (Response <> nil) then
        try
          while (InternetReadFile(hReq,@Buffer,sizeof(Buffer),BytesRead)) do
          begin
            if (BytesRead = 0) then
            begin
              Result := TRUE;
              break;
            end;
            Response.Write(Buffer,BytesRead);
          end;
        except end;
        InternetCloseHandle(hReq);
      end;
      InternetCloseHandle(hCon);
    end;
    InternetCloseHandle(hNet);
  end;
end;


procedure TForm2.Button1Click(Sender: TObject);
var Campos: TStringlist;Respuesta: TStringStream;
  ReturnValue : THandle;
begin
    Respuesta:= TStringStream.Create('');
    Campos:= TStringList.Create;
    Campos.Values['User']:= txtUsuario.Text;
    SendRequest('MiWeb','/PruebaServidor.php',80,campos, Respuesta);


    if Pos('Datos Correctos',Respuesta.DataString) > 0 then ShowMessage(Respuesta.DataString + 'Ok')
    else ShowMessage(Respuesta.DataString + ' Error');

    Campos.Free;
    Respuesta.Free;
end;



Ahora bien, esta primera parte estaría funcionando bien, ya que se conecta con la pagina y me devuelve un string, pero siempre me devuelve ‘Datos incorrectos’, por lo que presumo no le está llegando bien el parámetro pasado. Mi código PHP es este.
Código PHP:

<?php

   $Usuario 
$_POST['User'];  
   
$Usuario stripslashes($Usuario);
    echo  
$Usuario;
    if (
$Usuario == 'Hugo'){
    
       echo 
"   Datos Correctos"
       Exit();     
     }
     else {
        echo  
"   Datos Incorrectos"
        Exit(); 
     }

 
?>

Espero que alguien me pueda orientar. Desde ya agradezco su tiempo y paciencia. Saludos. Hugo

Sinaloense 30-01-2012 22:35:20

Desconozco porqe te regresa ese error, pero te puedo pasar este link, que es para lo mismo

http://superuser.com/questions/14932...mand-line-tool

Se hace mediante la línea de comandos mediante el programa CURL, el resultado te lo puede guardar en un archivo de texto, delphi esta limitado en este aspecto-

guitarrahugo 31-01-2012 01:34:08

Tema Solucionado
 
Gracias Sinaloense Por tu respuesta, después de probar distintas variantes durante el fin de semana, lo que hice fue lo siguiente. Preparo las variables desde delphi y las envío a mi función php mediante el método POST, así mi función php me devuelve el resultado de una consulta, (primeramente evalúa un usuario y contraseña, para ver que tenga permiso de borrar tablas, crearlas o hacer lo que necesite), o envía ##ok## si pudo crear una tabla por ejemplo, o ##Error## si no la pudo crear. Ahí va el código delphi terminado, y la función php. Por ahí le puede ser útil a alguien. Saludos y gracias por tu tiempo. :D
Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
var
  http: TIdHttp;
  params: TStrings;
  respuesta: string;
  Usuario, Pass, SQL:String;

begin

  http := TIdHTTP.Create(Self);
  params := TStringList.Create;
  try

    Usuario:=  'variable1='+ Edit1.text;
    Pass:= 'variable2='+ Edit2.text;
    SQL := 'variable3=' +SQLText.Text;
    params.Add(Usuario);
    params.Add(Pass);
    params.Add(SQL);

    respuesta := http.Post('MiWeb/PruebaConFuncion.php', params);

    ShowMessage('Respuesta: ' + respuesta);
  finally
    http.Free;
    params.Free;

Código PHP:

?php
    $Usuario 
$_POST['variable1'];
    
$Pass $_POST['variable2'];
    
$SQL $_POST['variable3'];
        
$SQL stripslashes($SQL);// limpio el parametro de consulta para q no tenga ningun caracter extraño que trunque la consulta
    
$link mysql_connect('localhost','root',''); 
    if (!
$link)
    {
        echo 
"error conectando la base de datos";
        exit(); 
    }
    
//selecciona la base de datos
    
$Base mysql_select_db('Biodata',$link); // para conectarme abajo

    
if(!$Base)
    {
        echo 
"error seleccionando la base de datos";
        exit(); 
    }
    echo 
"conexion conseguida \n\n";

    
//Valida Usuario
    
$Query "SELECT * FROM `usuario` WHERE upper(`Usuario`) = upper('$Usuario') and UPPER(`Pass`) = UPPER('$Pass')";
    
$resultado mysql_query ($Query,$link);
    
$Cantidadregistros mysql_num_rows($resultado) ; //cuenta la cantidad de registros encontrados

    
    
if ($Cantidadregistros 0// si encontró algo ejecuta la consulta
    
{    
          
       echo 
"Usuario: ".$Usuario ."\n";
    
//   echo "Contraseña: ".$Pass."\n" ;
       
echo "SQL: ".$SQL ."\n\n";
    
     
$SentenciaSQL trim(substr($SQL,0,6)); //saca los primeros 6 caracteres del string y le saca los espacios en blanco Trim
    
       
if (strtoupper($SentenciaSQL) == strtoupper('select')) 
      {
        
$result =  mysql_query ($SQL,$link);
         if (
mysql_affected_rows() >   0)
         {    
           
$nombre_archivo "Datos.txt";  
           
FOPEN($nombre_archivo'w');    // crea el archivo       
           
            
while($row mysql_fetch_array($result)) 
            { 
                    
                       
$Resultadoprint_r$rowtrue);
                      echo 
$Resultado;
    
                
//Crea el archivo TXT en donde está corriendo la funcion
          
$Datos_A_Ingresar $Resultado;
               
$contenido $Datos_A_Ingresar
                
FOPEN($nombre_archivo'a+'); // edita el archivo

                // Me aseguro primero de que el archivo existe y puedo escribirse sobre el. 
                
if (is_writable($nombre_archivo)) // Abro $nombre_archivo en modo de adicion. El puntero se encuentra al final del archivo, asi que ahí es donde ira $contenido cuando llamemos fwrite(). 
                

                    if (!
$gestor fopen($nombre_archivo'a'))  //fopen($nombre_archivo, 'a' me permite sumar texto al final del achivo
                    

                         
$A"No se puede abrir el archivo";
                         exit(); 
                    } 

                     
// Escribir $contenido a nuestro arcivo abierto. 
                    
if (fwrite($gestor$contenido) === FALSE
                     { 
                        
$A"No se puede escribir el archivo";
                        exit(); 
                    } 
                      
                    
$A"##Ok##";    
                    
fclose($gestor); 

                }
                  else { 
$A"##Error## ";} 
            }
         } 
         else 
$A ="##Error## ";     
         Echo 
$A;
      }      
    
       
         if (
strtoupper($SentenciaSQL) == strtoupper('Delete'))
         {
            
$result =  mysql_query ($SQL,$link); 
            
// echo mysql_affected_rows().'<br>'; // devuel la cantidad de registros afectado en el alta
             
if (mysql_affected_rows() == -){$A '##Error##';}        
             if (
mysql_affected_rows() ==  0) {$A '##Error##';}        
             if (
mysql_affected_rows() >   0) {$A '##Ok##';}           
             Echo 
$A;
             exit();     
         
         
         }
    
          if (
strtoupper($SentenciaSQL) == strtoupper('CREATE') ) //Crea una tabla nueva
          
{
             
$result =  mysql_query ($SQL,$link); 
             
//echo mysql_affected_rows().'<br>'; // devuelve la cantidad de registros afectado en el alta
             
if (mysql_affected_rows() == -){$A '##Error##';}        
             if (
mysql_affected_rows() ==  0) {$A '##Ok##';}        
             Echo 
$A;
             exit();
          
          }
    
    
         if (
strtoupper($SentenciaSQL) == strtoupper('DROP T') ) //Borra una Tabla
          
{
             
$result =  mysql_query ($SQL,$link); 
        
//     echo mysql_affected_rows().'<br>'; // devuel la cantidad de registros afectado en el alta
             
if (mysql_affected_rows() == -){$A '##Error##';}        
             if (
mysql_affected_rows() ==  0) {$A '##Ok##';}        
              
             Echo 
$A;
             exit();
          
          }
          
          
           if (
strtoupper($SentenciaSQL) == strtoupper('INSERT') ) //Alta de registros
          
{
             
$result =  mysql_query ($SQL,$link);                   
            
// echo mysql_affected_rows().'<br>'; // devuel la cantidad de registros afectado en el alta
             
if (mysql_affected_rows() == -){$A '##Error##';}        
             if (
mysql_affected_rows() ==  0) {$A '##Error##';}        
             if (
mysql_affected_rows() >   0){  $A '##Ok##';}           
             Echo 
$A;
             exit();
          
          }
    
         if (
strtoupper($SentenciaSQL) == strtoupper('UPDATE') ) //Actualiza Registros
          
{
             
$result =  mysql_query ($SQL,$link); 
            
// echo mysql_affected_rows().'<br>';
             
if (mysql_affected_rows() == -){$A '##Error##';}        
             if (
mysql_affected_rows() ==  0) {$A '##Error##' ;}        
             if (
mysql_affected_rows() >   0){$A '##Ok##';}                 
             Echo 
$A;
             exit();
          
          }
        
    }      
    else 
    {
        echo 
'Usuario no válido';
        exit();
            
    }      
      
?> 



La franja horaria es GMT +2. Ahora son las 15:41:33.

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