Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Oraf

includes

Recommended Posts

Oraf

Boas pessoal, alguem me sabe dizer se e possivel usar includes para actualizar a base de dados?

<?php
$file = file_get_contents('http://pagina que tem uma funcao js e que quero ir buscar o valor.php');
$con = mysql_connect("localhost","root","");
mysql_select_db("koisas", $con);
mysql_query("UPDATE mensagens SET estado= "$file");

Ha alguma maneira de fazer isto?

eu tentei desta maneira mas o que e impresso é o inicio da funcao em js que tenho na pagina..

Edited by yoda

Share this post


Link to post
Share on other sites
Oraf

Boas, entao e assim esta pagina tem uma funcao em javascript que me vai buscar o valor de uma variavel que tenho em outro servidor e escreve na pagina neste servidor eu quero colocar esse valor neste update.

Basicamente da-me o ultimo ficheiro que foi inserido no outro servidor e escreve na pagina deste servidor, eu preciso do valor que e escrito para colocar no update

<script type="text/javascript">

 var isIE8 = window.XDomainRequest ? true : false;
 var invocation = createCrossDomainRequest();
 var url = 'http://outro servidor/funcaolista.php';	

 function createCrossDomainRequest(url, handler)
 {
	 var request;
	 if (isIE8)
	 {
		 request = new window.XDomainRequest();
	 }
	 else
	 {
		 request = new XMLHttpRequest();
	 }
	 return request;
 }

 function callOtherDomain()
 {
	 if (invocation)
	 {
		 if(isIE8)
		 {
			 invocation.onload = outputResult;
			 invocation.open("GET", url, true);
			 invocation.send();
		 }
		 else
		 {
			 invocation.open('GET', url, true);
			 invocation.onreadystatechange = handler;
			 invocation.send();
		 }
	 }
	 else
	 {
		 var text = "No Invocation TookPlace At All";
		 var textNode = document.createTextNode(text);
		 var textDiv = document.getElementById("textDiv");
		 textDiv.appendChild(textNode);
	 }
 }

 function handler(evtXHR)
 {
	 if (invocation.readyState == 4)
	 {
		 if (invocation.status == 200)
		 {
			 outputResult();
		 }
		 else
		 {
			 alert("Invocation Errors Occured");
		 }
	 }
 }

 function outputResult()
 {
	 var response = invocation.responseText;
	 var textDiv = document.getElementById("textDiv");
	 textDiv.innerHTML += response;


 }
</script>

 <div id="textDiv">

</div>
 <?php

echo"<script type='text/javascript'>callOtherDomain();</script>";

?>

Este é o codigo que tenho na tal pagina e eu quero colocar o valor da variavel response no meu update

E nao sei bem como o fazer...ja tentei varias coisas para passar o valor desta pagina para a outra mas sem sucesso..

desde ja obrigado pela resposta

Edited by Oraf

Share this post


Link to post
Share on other sites
malleus

Se bem me lembro não podes usar file_get_contents para abrir ficheiros remotos, que é o que depreendo por file_get_contents('http://...'). Para o efeito tens a libraria curl. Mas mesmo assim, indo buscar um ficheiro php apenas tens acesso aos dados que existem no fim do ciclo de execução desse ficheiro PHP, o que não inclui eventuais pedidos AJAX (que de qualquer modo apenas ocorrem no final do ciclo de execução do PHP).

Talvez seja melhor pensares noutra solução. Uma possibilidade é fazeres um pedido AJAX directo ao servidor remoto via JSONP. Outra possibilidade é ires buscar os dados necessários a um php remoto via curl...depende dos teus requisitos.

Share this post


Link to post
Share on other sites
Oraf

Se bem me lembro não podes usar file_get_contents para abrir ficheiros remotos, que é o que depreendo por file_get_contents('http://...'). Para o efeito tens a libraria curl. Mas mesmo assim, indo buscar um ficheiro php apenas tens acesso aos dados que existem no fim do ciclo de execução desse ficheiro PHP, o que não inclui eventuais pedidos AJAX (que de qualquer modo apenas ocorrem no final do ciclo de execução do PHP).

Talvez seja melhor pensares noutra solução. Uma possibilidade é fazeres um pedido AJAX directo ao servidor remoto via JSONP. Outra possibilidade é ires buscar os dados necessários a um php remoto via curl...depende dos teus requisitos.

Obrigado pela reposta malleus, mas se calhar expliquei-me mal eu ja tou a ir buscar o valor atraves de cross domain request para o meu servidor com a funcao de cima agora so queria usar esse valor que me e devolvido no response.

o que eu queria mesmo era passar o valor response em javascript para a outra pagina onde tenho os updates..

nao ha nenhuma maneira?

Share this post


Link to post
Share on other sites
malleus

Ah então tens

file_get_contents('file.php');

e não

file_get_contents('http://www.xxx.com/file.php');

com file.php um ficheiro local que efectua um pedido assíncrono (via javascript/ajax) a outro servidor.

Creio que se mantém parte do que disse: a partir do momento que fazes o include de um ficheiro php apenas tens acesso ao que existir no fim do ciclo de execução do script php. Eventuais scripts javascript que também façam parte desse script php apenas são corridos após o final da execução do PHP e em contexto de browser.

Tendo em conta os teus requisitos, e aqui também mantenho o que disse, trocava a chamada file_get_contens por uma chamada curl.

Share this post


Link to post
Share on other sites
Oraf

Ah então tens

file_get_contents('file.php');

e não

file_get_contents('http://www.xxx.com/file.php');

com file.php um ficheiro local que efectua um pedido assíncrono (via javascript/ajax) a outro servidor.

Creio que se mantém parte do que disse: a partir do momento que fazes o include de um ficheiro php apenas tens acesso ao que existir no fim do ciclo de execução do script php. Eventuais scripts javascript que também façam parte desse script php apenas são corridos após o final da execução do PHP e em contexto de browser.

Tendo em conta os teus requisitos, e aqui também mantenho o que disse, trocava a chamada file_get_contens por uma chamada curl.

hmm ok, vamos ver se percebi por curl da para ir buscar a outra pagina por php e colocar o valor numa string certo?

era isso que eu queria mas testei isto

<?php

// create curl resource

$ch = curl_init();

// set url

curl_setopt($ch, CURLOPT_URL, "http://dddddddd/funcaolista.php");

//return the transfer as a string

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//change the UA to spoof IE7.

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');

// $output contains the output string

$output = curl_exec($ch);

// close curl resource to free up system resources

curl_close($ch);

?>

testei este exemplo mas nao obtenho nenhum output. E necessario colocar alguma coisa na pagina que quero ir buscar? e preciso colocar alguma coisa na pagina funcaolista.php?

se me podesses ajudar agradecia eu nisto sou um bocado nabo

Share this post


Link to post
Share on other sites
malleus

Numa primeira vista, se o teu script remoto fizer um echo deveria funcionar, a menos que o php não tenha essa extensão instalada/activada.

Em runtime podes usar:

function_exists("curl_init")

para verificar se a função existe. Alternativamente deves ter essa informação no phpinfo().

Deixo-te aí um pedaço código, algo antigo, mas que funciona actualmente num site (verifica o estado de uma conta skype, através de um curl a um ficheiro de estado remoto):

$curl = curl_init("http://mystatus.skype.com/???.txt");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, ???);
$status = curl_exec($curl);

Share this post


Link to post
Share on other sites
Oraf

malleus eu tive a verificar e o curl no servidor que tou esta enable, no servidor onde vou buscar tambem esta enable.

outra coisa fazes referencia a

$curl = curl_init("http://mystatus.skype.com/???.txt");

ficheiro .txt e eu estava a fazer a pagina.php

tenho de fazer um script no servidor que tem os dados e isso?

e que eu tava a tentar chamar uma pagina..

Obrigado pela ajuda

Edited by Oraf

Share this post


Link to post
Share on other sites
malleus

Não, onde vais buscar basta que o script php imprima o valor desejado (podes visitar esse script directamente no browser e verificar se ele de facto é imprimido).

Se sim, deveria funcionar...

EDIT: podes e deves ter scripts php em ambos os lados, pelo menos foi com essa idéia que fiquei (que tinhas um script php remoto que te devolvia dados e que os ias buscar via xmlhttprequest).

Considerando script1.php como o teu script local e script2.php o script php que tem o valor que queres ir buscar (o script remoto):

-> script1.php faz curl a script2.php;

-> script2.php tem a programação que necessitares mas deve fazer echo do valor que queres devolver;

-> script1.php recebe esse valor via curl;

Edited by malleus

Share this post


Link to post
Share on other sites
Oraf

Nao percebo entao, ja testei com o google e o yahoo e funciona... mas quando coloco o endereco que quero a pagina fica em branco.. alguma sugestao?

Share this post


Link to post
Share on other sites
malleus

Verificaste, como referi atrás, se o script imprime algo? Visita o script no teu browser.

Podes partilhar aí o endereço do script remoto ou está sob "segredo de negócio"? :)

Share this post


Link to post
Share on other sites
Oraf

Mandei por msg e para um trabalho da universidade ele esta a imprimir mas nao nao vou buscar com o curl :S

Share this post


Link to post
Share on other sites
malleus

Posto isso, e com o código de cima, estou a conseguir ir buscar o valor correctamente (6-1368626768).

Para referência:

$curl = curl_init("http://...funcaolistar.php");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 555);
$status = curl_exec($curl);
echo $status;

Não te sei dizer o que se poderá estar a passar

Share this post


Link to post
Share on other sites
Oraf

Nao percebo... eu tento com o codigo que meteste e nao da nada, mas entao se tu consegues ir buscar o valor deve ser alguma coisa do servidor onde tou...

Vou ver se descubro e digo algo..

Muito obrigado pela ajuda

Share this post


Link to post
Share on other sites
malleus

No problemo, provavelmente estás aí com problemas ao nível de outgoing ports no router/firewall. Se resolveres não te esqueças de partilhar a resolução com o pessoal.

Nota que a libraria curl tem métodos de erro/debug como curl_errno, curl_error que te podem ajudar.

Share this post


Link to post
Share on other sites
Oraf

Boas, entao aqui fica a resolucao do problema ao que parece a firewall estava a bloquear como disses-te malleus..

Mas tambem mudei o url para 192.168.2.6:8080/funcaolistar.php colocando o ip da maquina em vez do link agora esta tudo a funcionar

<?php
$curl = curl_init("192.168.2.6:8080/funcaolistar.php");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 555);
$status = curl_exec($curl);
echo $status;
?>

fica aqui a solucao, ao fim disto foi so usar o status.

obrigado pela ajuda podem fechar o topico

Share this post


Link to post
Share on other sites
malleus

Ainda bem :)

Nota que no código que te dei substitui uma variável por 555...de modo a ser mais legível.

Segundo a api do curl é o timeout em segundos e como estamos a falar de php o pedido curl é bloqueante.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.