Mais um probleminha que pode atrapalhar a vida de um programador PHP. Ao precisar enviar dados para uma página de um servidor remoto, normalmente para integrar seu sistema a algum outro sistema remoto geralmente feito em uma linguagem inferior (aka. ASP) e usando o método POST dentro do seu programa, sem poder utilizar um formulário e mandar o usuário clicar, usando apenas uma URL.
Bem, a tarefa seria simples se pudéssemos utilizar o método GET. Usando o método GET, poderíamos simplesmente acessar a url remota usando header() e depois redirecionar novamente para o nosso sitema a partir do arquivo remoto. No meu caso eu tinha que mandar 3 variáveis (assunto,e-mail e texto) para um arquivo .asp em outro servidor – e claro, o programador deste quis tirar onda comigo mandando eu enviar com método POST. Enfim, é claro que eu resolvi o problema e deixei ele chupando o Bill Gates.
Após horas de pesquisas e após ler muito no manual do PHP, descobri que poderia usar a extensão curl para tal, porém isso é complicado, pois nem sempre ela estará disponível no servidor do cliente. A solução que encontrei foi criando um contexto de stream, enviando-o em seguida ao servidor remoto usando fopen() e em seguinda, checando a resposta com stream_get_contents() pra saber se o conteúdo foi enviado corretamente ao servidor. Abaixo, a função concebida:
function POST($url, $dados, $headers = false)
{
/*parâmetros necessários para criar um
contexto de stream */
$params = array('http' => array(
'method' => 'POST',
'content' => $dados ));
//caso você precise enviar algum cabeçalho a mais
if ($headers)
$params['http']['header'] = $headers;
//cria o contexto de stream
$ctx = stream_context_create($params);
//abre o arquivo remoto
$fp = @fopen($url, 'rb', false, $ctx);
//checa se o arquivo foi aberto com sucesso
if (!$fp)
throw new Exception("Problema com $url: - $php_errormsg");
//obtém a resposta
$resp = @stream_get_contents($fp);
/*checa se os dados do arquivo remoto
foram lidos corretamente*/
if ($resp === false)
throw new Exception("Problema ao ler dados de $url: - $php_errormsg");
return $resp;
}
Exemplo de uso da função:
$url='http://seusite.com.br/arquivo.php'; $variaveis='nome=Andresa&time=palmeiras&tarefa=salvar'; POST($url, $variaveis);
32 Responses
Leave a Reply
Oi Andressa,
Eu achei esse teu artigo pesquisando no google, e acho que ele poderá me ajudar a corrigir uma falha de segurança no componente Joomla que eu mantenho…
Mas o exemplo de uso da tua função não aparece aqui, teria como tu atualizares o blog, ou mandar esse código pra mim por e-mail?
Desde já agradeço.
Antônio
Oi Andresa,
Gostaria de saber aonde é invocada essa variavel tarefa do seu codigo?
Para os usuários de Firefox:
Estou usando o Google Highlight Sintax para formatar os códigos que escrevo, e o Firefox parece ser o único navegador que não está exibindo corretamente. Segue abaixo o código com o exemplo de uso da função, e reforço a minha sugestão de começarem a usar o Opera ^^
< ?php $url='http://seusite.com.br/arquivo.php';
$variaveis='nome=Andresa&time=palmeiras&tarefa=salvar';
POST($url, $variaveis);
?>
Oi, e se eu precisar usar o POSR($url,$variaveis); dentro de uma tag <a> como procedo?
Obrigado!
Olha… eu acho que você não entendeu pra quê serve essa função. Tem como você explicar o quê exatamente está tentando fazer? Eu posso te ajudar ^^
sim realmente não tinha entendido, infelizmente a função não serve pra o que eu precisava..
e Nossa que velocidade de resposta huahuah , obrigado pela atenção.
no caso preciso gerar um link que passe uma variavel e mandar para um cliente x via email , um email de confirmaçao…seria mais facil com o get, mas da margem a hackers para derrubar o sistema, visto que a variavel aparece, por isso precisava fazer com post…
obrigado mais uma vez
Você vai ter que ser um pouquinho mais especifico. Por exemplo, se você for mandar um boleto para um cliente, você deveria clicar em cima do nome do seu cliente e mandar um link assim:
http://servidor/email_boleto.php?id_cliente=5
Daí, dentro da página email_boleto.php, você faz um SELECT e pega os dados do cliente e os dados do boleto de dentro do banco de dados. Caso você vá mandar um texto fixo para o seu cliente, você pode colocar esse texto dentro do proprio arquivo email_boleto.php. No final do arquivo, você usa:
header("Location: http://seuservidor/pagina_de_sucesso.php");
exit;
e assim já sairia de uma página para outra praticamente direto. Se você estiver usando login com sessões nesta página, não precisará se preocupar com "hackers".
Outra coisa que você poderia fazer é usar AJAX nesse link, assim não apareceria a URL.
A última opção seria você fazer um link que enviasse um formulário com a id do cliente via POST.
Creio que este post resolva o seu problema:
http://blog.andresa.net/2009/05/20/envio-de-dados...
Gostei muito do código
Você pode me falar qual seria o melhor método para envio de arquivos grandes para o servidor ?
Qualquer método que você utilizar está certo, mas o interessante seria que você exibisse uma barra de status para o usuário saber que o upload dele não parou, já que se trata de arquivos grandes. Esse post no link abaixo faz exatamente isso:
http://blog.oinam.com/2005/flash-8-file-upload-do...
Se você não puder usar Flash, faça com AJAX usando o Lightloader:
http://seemysites.net/projFolder/uploader/
Andresams imagine que eu tenho 2 sistemas web cada um em um servidor digamos que eu faça login no sistema X porem tenho um link para ir para o sistema Y mas como eu ja realizei login no sistema X é possivel utilizar sua função enviando os dados de login (usuário/senha) para o servidor Y… assim eu faço login num sistema e fico logado nos 2 ?
fiz um teste mas não deu certo… a ideia é tipo como o Google utiliza em seus sistemas vc faz login no orkut e quando acessa gmail já esta logado… mas se nao me engano o google utiliza Single Sign On (SSO)
Eu vou dar uma pesquisada sobre isso e amanhã te posto uma resposta mais completa, mas há várias formas de você fazer isso. Com relação à função acima, isso não é possível se você não estiver controlando a sessão do usuário pelo banco de dados, porque no momento em que o PHP cria uma sessão, ele também cria o cookie de sessão na máquina do usuário e esse cookie é necessário para o PHP associar o usuário com a sessão dele.
Pra dizer a verdade, estou planejando fazer algo parecido, então eu vou dar uma estudada esta noite e amanhã antes deste horário eu te respondo, OK!
Obrigada por prestigiar o meu blog!
ola !!! queria saber como eu faço pra enviar de um programa para o site um arquivo .txt e depois enviar para um email ? sendo que no programa ele ja cria o .txt so nao estou conseguindo enviar para o site e depois para um email . minha dificuldade seria so na parte do php etc…
obrigado .
Esse arquivo .TXT vai conter o quê? Somente um texto para enviar para um endereço de e-mail pré-definido ou vai ter o endereço de email pra onde a mensagem será mandada também?
E mais uma coisa: você já sabe como fazer para o programa enviar o .txt para uma URL? Tipo http://seuservidor.com/envia_email.php ?
Olá !!! obrigado por responder …. no .TXT nao vai conter o email de destino, meu programa esta pre-configurado com o meu email ,… no caso ele ira usar o site para autenticar o envio do email com o .txt
em ralaçao a enviar o .txt para URL , eu acho que sim … mas se vc poder me da uma luz eu agradeço rsrs….. so para lembrar , meu programa cria o arquivo ( .TXT) mas nao consigo enviar para o meu email via URL ,
entao tive a ideia que seria a configuraçao da url o erro ,…
"no caso ele ira usar o site para autenticar o envio do email com o .txt"
O PHP não pode "autenticar" o envio do e-mail, quem autentica o envio do email é o servidor SMTP. O que o PHP pode fazer são duas coisasa:
1. Enviar um e-mail através de um servidor SMTP
2. Enviar um email usando a sua função mail(), mas só funciona se o PHP estiver em um servidor Linux.
Você não me falou qual linguagem de programação está usando, mas para enviar um arquivo ao PHP é necessário enviar um formulário usando o método POST. Descubra como se faz isso na linguagem do seu programa. No PHP, o código do arquivo deve ser o seguinte:
<?php
//Pega o conteúdo do seu TXT
$conteudo_txt=file_get_contents($_FILES['arquivo']['tmp_name']);
//Envia o e-mail
mail("seu_email@email.com","assunto", $conteudo_txt) ;
?>
"entao tive a ideia que seria a configuraçao da url o erro" << Como assim?
Mas ao invés de fazer isso usando o PHP, talvez fosse muito mais simples você ver na linguagem que está programando como se faz isso e se tem algum plugin/componente para fazer isso, porque todas as linguagens tem.
Muito bom
CyberDownload 2_A REVOLUÇÃO DOS MÉTODOS DE DOWNLOADS!!!
No meu caso esta dando o seguinte erro.
Fatal error: Call to undefined function post() in /home/hnetsistemas/public_html/catalogo/layouts/pers_decorvelas/descricao.php on line 313
O que pode ser?
Obrigado
Pelo erro, parece que você não copiou o código da função para seu arquivo descricao.php. Você deve copiar todo o código antes de chamar a função:
function POST($url, $dados, $headers = false)
{
/*parâmetros necessários para criar um
contexto de stream */
$params = array('http' => array(
'method' => 'POST',
'content' => $dados ));
//caso você precise enviar algum cabeçalho a mais
if ($headers)
$params['http']['header'] = $headers;
//cria o contexto de stream
$ctx = stream_context_create($params);
//abre o arquivo remoto
$fp = @fopen($url, 'rb', false, $ctx);
//checa se o arquivo foi aberto com sucesso
if (!$fp)
throw new Exception("Problema com $url: – $php_errormsg");
//obtém a resposta
$resp = @stream_get_contents($fp);
/*checa se os dados do arquivo remoto
foram lidos corretamente*/
if ($resp === false)
throw new Exception("Problema ao ler dados de $url: – $php_errormsg");
return $resp;
}
Obrigado
Obrigado
Obrigado
Obrigado
Obrigado
Obrigado
Obrigado
Obrigado
Obrigado
Obrigado
esse post é bom d+++++.
Tua função ajudou muito obg msm !
como faço para passar os valores no GET mas eles estando dentro de variáveris exemplo:
$variaveis=’nome=$nome&email=$mail&vip=$vip’;
eu tento mas os valores não vão =/
Já resolvi bastava trocar ‘ por ”
$variaveis=”nome=$nome&email=$mail&vip=$vip”;
=]
Como faço para enviar dados (curriculo) para um email , sem que o usuario visualize o endereço. Por exemplo, no site da Catho, clica-se num link e envia-se o curriculo, sem visualizar para qual email que esta sendo enviado. Alguem sabe como fazer??
Oie… Andresa, eh eu estou com um probleminha, talvez vc possa me ajudar…, tipo eu gostaria de enviar uma variável em formato post, utilizando a função header(), pois necessito encaminhar o usuário até a pagina com essa função header(Location:”pagina?variavel”), eu preciso fazer desta forma por causa do uso de meus templates…, não posso fazer via Get no header, por causa do limite de caracteres dos browsers , então tem alguma forma de se fazer isso???? Obrigado!!!!