php parst schon bei file-Operationen?
romy
- php
Hi,
ich versuche eine PHP-Datei einzulesen und zu bearbeiten.
Ich hatte angenommen, dass wenn ich dies ausführe
$file = "http://iregndwas/testapp.php";
$string = implode("",@file($file));
dass dann in dem $string noch die php-tags drinstehen, ich musste jedoch feststellen, dass die Datei wohl schon geparst wird und demzufolge ich schon die Browserversion habe (die ich nicht will)
Versucht habe ich es, indem ich den $string in eine Datei geschrieben habe.
Testapp.php enthält sowas wie $test = 3;
in der neuen Datei steht jetzt 3 anstatt der gesamte Quellcode. Wieso?
Oder bin ich einer irrigen Meinung aufgesessen?
ciao
romy
Hi!
dass dann in dem $string noch die php-tags drinstehen, ich musste jedoch feststellen, dass die Datei wohl schon geparst wird und demzufolge ich schon die Browserversion habe (die ich nicht will)
Wieso?
Hast Du mal in den wirklichen Quellcode der HTML-Datei gesehen? Denn normalerweise zeigen Browser das was zw. <> steht nicht an egal ob sie es verstehen oder nicht.
Im Quelltext der HTML-Datei sollte dann auch der PHP-Teil sein, sonst stimmt da was nicht.
Grüße
Andreas
Hi,
Wieso?
weil ich gern noch einige Variablen, die auf dieser Seite von Relevanz sind, hineinschreiben möchte, da ist es sehr schlecht, wenn die Datei vorher schon geparst wird.
Hast Du mal in den wirklichen Quellcode der HTML-Datei gesehen? Denn normalerweise zeigen Browser das was zw. <> steht nicht an egal ob sie es verstehen oder nicht.
das stimmt, in diesem konkreten Fall zeigt er es trotzdem an, ich mach gleich mal ein Beispiel.
Im Quelltext der HTML-Datei sollte dann auch der PHP-Teil sein, sonst stimmt da was nicht.
eben, da stimmt was nicht, denn es steht der php-teil nicht mehr in der Seite:
Beispiel:
seitea.php
---------------------------------------------------------------------
<?
// Funktion, die die neuen Variablen reinschreibt
function putGetPostVars($arr, $string) {
$arr_string = " ";
foreach($arr as $key => $value){
$arr_string .= "$".$key."="".$value.""\n";
}
$string = "<? ".$arr_string." ?> ".$string;
return $string;
}
$file = "http://blabla/testapp.php";
$string = implode("",@file($file));
$arr = array();
$arr["test"] = dirname($file); // neue Variable
echo putGetPostVars($arr,$string); // Ausgabe an den Browser 1)
$test = putGetPostVars($arr,$string);
$fp = fopen("test.php","w+"); // Ausgabe in die Datei "2)
fwrite($fp, $string);
fclose($fp);
?>
---------------------------------------------------------------------
testapp.php
---------------------------------------------------------------------
<?
echo $test;
echo "hallo";
?>
<html>
<body>
hallo guys
</body>
</html>
---------------------------------------------------------------------
Ausgabe Browser: (Quellcode über Ansicht Quellcode anzeigen)
---------------------------------------------------------------------
<? $test="http://blabla/testapp.php"
?> hallo<html>
<body>
hallo guys
</body>
</html>
---------------------------------------------------------------------
Ausgabe Datei
---------------------------------------------------------------------
hallo<html>
<body>
hallo guys
</body>
</html>
---------------------------------------------------------------------
Ich finde diese Ergebnisse sehr komisch.
zur Info: testapp.php liegt auf einem anderen Server, kann es daran liegen?
ciao
romy
Hi,
hier hatt ich einen Fehler es muss so lauten
- Ausgabe Datei
<? $test="http://blabla/"
?> hallo<html>
<body>
hallo guys
</body>
</html>
ciao
romy
Hi!
$file = "http://blabla/testapp.php";
zur Info: testapp.php liegt auf einem anderen Server, kann es daran liegen?
Ja, hätte ich auch eher drauf kommen können, wie da oben steht handelt es sich um einen Zugriff über das HTTP-Protokoll, und darüber kannst Du genauso wie mit einem gewöhnlichem Browser an den Quelltext einer PHP-Datei kommen - nämlich (nach Möglichkeit) überhaupt nicht.
Wenn Du an den Quelltext willst dann z.B. über FTP, oder schreibe auf dem fremden Server ein Script welches den Quelltext auch über HTTP ausgibt, könnte nur eine nette Sicherheitslücke sein, ich weiß ja nicht was Du genau vorhast.
Grüße
Andreas
Hi,
Wenn Du an den Quelltext willst dann z.B. über FTP, oder schreibe auf dem fremden Server ein Script welches den Quelltext auch über HTTP ausgibt, könnte nur eine nette Sicherheitslücke sein, ich weiß ja nicht was Du genau vorhast.
Das Problem besteht darin, dass ich 2 Server habe auf denen jeweils Dateien liegen. Nun braucht aber Server2 von Server1 Daten, die jetzt nicht mehr über sessions oder sowas gespeichert werden können (wie noch, als es auf dem gleichen lag)
Gibt es überhaupt eine Möglichkeiten die Daten dorthin zu bekommen?
automatisch ein formular abschicken zum Beispiel, oder selbst DAten per Post versenden. Ich möchte nicht alles im Querystring haben (dass diese Variante geht, weiss ich schon)
Ich habe aber keinen Button oder sowas.
Ich sollte wahrscheinlich einfach versuchen die Daten nicht zwischen den Servern hin und her zu schicken...
vielen Dank
ciao
romy
Hi!
Das Problem besteht darin, dass ich 2 Server habe auf denen jeweils Dateien liegen. Nun braucht aber Server2 von Server1 Daten, die jetzt nicht mehr über sessions oder sowas gespeichert werden können (wie noch, als es auf dem gleichen lag)
Was willst Du für Daten übergeben? Wozu brauchst Du denn das PHP-Script vom anderen Server?
Gibt es überhaupt eine Möglichkeiten die Daten dorthin zu bekommen?
Wie gesagt, HTTP, FTP und weitere...
automatisch ein formular abschicken zum Beispiel, oder selbst DAten per Post versenden. Ich möchte nicht alles im Querystring haben (dass diese Variante geht, weiss ich schon)
Ich habe aber keinen Button oder sowas.
Wodurch wird denn dann die Übergabe der Daten initiiert? Irgendwomit musst Du den Prozess anstoßen, wenn Du dann Daten von A nach B senden willst könntest Du von einem Script auf Server A per fsockopen einen POST-Request senden mit allen Daten die Du übertragen willst, und diesen POST-Request sendest Du an ein Script auf Server B, welches diese Daten dann direkt in $_POST auslesen kann und machen was Du willst.
siehe Beispiel und Kommentare(!) unter: http://php.net/fsockopen
http://www.dclp-faq.de/q/q-code-post.html
Ich sollte wahrscheinlich einfach versuchen die Daten nicht zwischen den Servern hin und her zu schicken...
Tja, das musst Du wissen... entweder man braucht es oder nicht.
Grüße
Andreas
Hi,
Was willst Du für Daten übergeben? Wozu brauchst Du denn das PHP-Script vom anderen Server?
server1 beinhaltet ein Script, welches verschiedene DAteien includiert
server2 hat jetzt solche Dateien
wenn auf Server2 jetzt per Post ein Formular abgesendet wird landen diue Daten auf server1, weil dieser ja die Dateien includiert, aber dort sind sie ja falsch
Bisher (auf einem server hatt ich mir alle Daten ijn einer session gemerkt)
siehe Beispiel und Kommentare(!) unter: http://php.net/fsockopen
http://www.dclp-faq.de/q/q-code-post.html
hier werde ich mich jetzt mal einlesen, hab auf Anhieb nicht verstanden, wie ich syntaktisch dort die Post-Variabeln einbaue (bei fsocketopen() meine ich)
ich nehme an, dies ist meine Zeile
fputs($fp, "POST $path HTTP/1.1\n");
heisst die jetzt, dass auf dem server2, der der geöffnet wurde, jetzt eine Vraiable $path mit ihrem Inhalt zur Verfügung steht?
Tja, das musst Du wissen... entweder man braucht es oder nicht.
habe gerdae feststellen müssen, dass ich es auf jeden Fall brauche
ciao
romy
Hi,
ich bin ein bisschen vorwärts gekommen, aber noch nicht ganz
if(preg_match('/http:///',$include_text1_)) {
$path = substr($include_text1_,18);
$domain = "http://meinserver2.com";
$data_to_send = implode("&",$all_data_);
$fp = fsockopen($domain, 80);
fputs($fp, "POST $path HTTP/1.1");
fputs($fp, "$data_to_send\n");
fclose($fp);
}
$path enthält sowas: /Bla/bla/bla.php
ich kann nicht erkennen, dass die Daten jetzt angekommen wären
Ich habe es so verstanden, dass ich mit diesem POST $path auf das Dokument verweise, welches beansprucht wird, also die Daten braucht?
ciao
romy
Hi!
if(preg_match('/http:///',$include_text1_)) {
$path = substr($include_text1_,18);
$domain = "http://meinserver2.com";
$data_to_send = implode("&",$all_data_);
$fp = fsockopen($domain, 80);
fputs($fp, "POST $path HTTP/1.1");
fputs($fp, "$data_to_send\n");
fclose($fp);
}
Ja, Du kommst der ganzen Sache schon näher, es fehlen aber noch ne ganze Menge Header wie in den Beispielen genannt. Viele Beispiele findest Du wie gesagt auch in den Kommentaren zu fsockopen, lies das mal in Ruhe durch...
Verwende doch einfach die Funktion von http://www.dclp-faq.de/q/q-code-post.html, das einzige was Du nicht bruachst ist der Referer, also kannst Du die Zeiule mit dem Referer rausnehmen, als auch den Parameter
// das sind dann Deine Daten(Inhalte ggfs. mit urlencode behandeln)
$data = "pid=14&poll_vote_number=2";
// das ist der Funktionsaufruf
$x = PostToHost(
"www.linux.com", // Host
"/polls/index.phtml", // Path
"http://www.linux.com/polls/index.phtml?pid=14", //Referer (brauchst Du nicht)
$data //Daten
);
Um zu verstehen was Du da machst hilft Dir vielleicht auch: http://forum.de.selfhtml.org/cgi-bin/http_trace.pl
$path enthält sowas: /Bla/bla/bla.php
ich kann nicht erkennen, dass die Daten jetzt angekommen wären
Ich habe es so verstanden, dass ich mit diesem POST $path auf das Dokument verweise, welches beansprucht wird, also die Daten braucht?
Ja, da gibst Du genau den Pfad von Document-Root des empfangenden Servers aus an, unter der das Script zu erreichen ist welches den POST-Request entgegennehmen soll, um dann $_POST weiterzuverarbeiten.
Grüße
Andreas
Hi,
Ja, Du kommst der ganzen Sache schon näher, es fehlen aber noch ne ganze Menge Header wie in den Beispielen genannt. Viele Beispiele findest Du wie gesagt auch in den Kommentaren zu fsockopen, lies das mal in Ruhe durch...
jetzt sieht es so aus: Aber es will sich kein Erfolg einstellen
if(preg_match('/http:///',$include_text1_)) {
$path = substr($include_text1_,18);
$domain = "62.40.13.69";
$data_to_send = implode("&",$all_data_);
$fp = fsockopen($domain, 80);
printf("Open!\n");
fputs($fp, "Host: $domain\n");
fputs($fp, "POST $path HTTP/1.1");
fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
fputs($fp, "Content-length: ". strlen($data_to_send) ."\n");
fputs($fp, "Connection: close\n\n");
fputs($fp, "$data_to_send\n");
printf("Sent!\n");
fclose($fp);
}
ich versuche die Daten mittels $HTTP_POST_VARS anzuzeigen (hab auch Get versucht) auf dem script ($path) da erscheint aber nichts, bzw. die variablen sind leer...
woran könnte es noch liegen?
ciao
romy
Hi,
ich hab mir mal, wie in den Beispielen, das was geschrieben wird wieder uasgeben lassen:
HTTP/1.1 200 OK Date: Wed, 14 May 2003 14:43:06 GMT Server: Apache/1.3.14 (Unix) (SuSE/Linux) mod_throttle/3.0 mod_layout/1.0 mod_fastcgi/2.2.2 mod_ssl/2.8.0 OpenSSL/0.9.6 balanced_by_mod_backhand/1.1.0 mod_perl/1.24 PHP/4.0.4pl1 X-Powered-By: PHP/4.0.4pl1 Set-Cookie: PHPSESSID=bee62a16afd841327c46fb2e50c30412; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Connection: close Transfer-Encoding: chunked Content-Type: text/html 4b http://bla/SUBS/bla/http://bla/SUBS/bla/ 0
was sagt mir dies jetzt?
Kann ich daran erkennen was schiefläuft?
ciao
romy
Hi!
ich hab mir mal, wie in den Beispielen, das was geschrieben wird wieder uasgeben lassen:
sehr gut!
HTTP/1.1 200 OK
HTTP-Statuscode: 200 OK heißt eben ales OK ;-) Daten wurden wie gewünscht gesendet, siehe auch: <http://selfhtml.teamone.de/diverses/httpstatuscodes.htm#uebersicht9
Die anderen Header sagen halt nochwas zum Caching, verwendete Sofware, Cookies setzen, Contend-Type...
was sagt mir dies jetzt?
Das ist der HTTP-Header. Wenn Du auf das Script auf das der POST-Request eien Verbindung herstellst, wenn DUZ in diesem Script was ausgibst, wird dir das unter dem HEader angezeigt. Dein Browser empfängt auch jedesmal wenn er eine Internetseite empfängt diesen Header, das sind Metainformationen mit denen er z.B. Cachen kann, den Richtigen Zeichnensatz wählen... der eigentliche Contend kommt dahinter, und das ist z.B. dann der eigentliche HTML-Quellcode.
Wie gesagt, um das beser zu verstehen spiele mal ein bisschen mit [link:http://schroepl.net/cgi-bin/http_trace.pl?url=http%3A%2F%2Fwww.schroepl.net%2F&method=GET&version=HTTP%2F1.0> rum ;-)
Kann ich daran erkennen was schiefläuft?
Du kannst prüfen gucken ob in der ersten Zeile 200 OK vorkommt!
Grüße
Andreas
Hi,
Wie gesagt, um das beser zu verstehen spiele mal ein bisschen mit http://schroepl.net/cgi-bin/http_trace.pl?url=http%3A%2F%2Fwww.schroepl.net%2F&method=GET&version=HTTP%2F1.0 rum ;-)
habe herumgespielt und festgestellt, dass bei Post-anfragen immer ein error (not allowed) kommt, gut dachte ich mir, versuche ich Get, da erschien normal 200Ok. Warum passeirt sowas, kann ein Server gewisse Anfragen sperren?
Nun ja, die Daten kommen nicht, zumindest nicht so wie sie sollen, an. Kurios ist aber, das meine foreach-Schleife mit allen getvars keinen Fehler ausgibt, weil sie keine Einträge hat, sondern den einen EIntrag nicht anzeigt, bzw. scheint da nichts drinzustehen.
der status ist aber weiterhin okay, was mache ich nun? Manchmal erscheint auch eine bestimmte Zeile beim ANzeigen des header die ich nicht verstehe... ich kann sie gerade nicht reproduzieren
aber am ENde steht
http://meinserver/ordner/http://meinserver/ordner/kryptischeZahlen -> läuft da irgendwas schief?
Und das letzte ARgument ist immer eine Null (auch nicht sehr aufbauend)
Mir fehlt irgendwie der Ansatz wie ich noch was testen könnte, iregndwo muss der HUnd ja begraben liegen!?
Es wäre sehr nett wenn Du mir nochmals helfen könntest, vielen Dank
ciao
romy
Hi!
habe herumgespielt und festgestellt, dass bei Post-anfragen immer ein error (not allowed) kommt, gut dachte ich mir, versuche ich Get, da erschien normal 200Ok. Warum passeirt sowas, kann ein Server gewisse Anfragen sperren?
Ja, aber gerade hast Du Doch bei Deinem Script bei einem POSt.Request einen 200er Statuscode bekommen, also wo bekommst Du denn den Fehler?
Nun ja, die Daten kommen nicht, zumindest nicht so wie sie sollen, an. Kurios ist aber, das meine foreach-Schleife mit allen getvars keinen Fehler ausgibt, weil sie keine Einträge hat, sondern den einen EIntrag nicht anzeigt, bzw. scheint da nichts drinzustehen.
Wenn Du einen Post-Request an ein Script sendest, dann schreibe in das Script nur sowas:
<?php
echo "<pre>";
print_r($_POST);
?>
Das was dieses Script ausgibt sollte Dir das sendende Script ausgeben, wenn Du die Daten wie Du es bereits gemacht hast mit fgets oder sowas wieder vom Socket liest.
der status ist aber weiterhin okay, was mache ich nun? Manchmal erscheint auch eine bestimmte Zeile beim ANzeigen des header die ich nicht verstehe... ich kann sie gerade nicht reproduzieren
Welche Zeile? Wo denn genau? Poste mal den komletten Header den Du nicht verstehst. Das Script von Michale Schroepl empfängt einen Request von Deinem Browser, und erzeugt einen eigenen Request auf den angegebenen Server, udn sendet dabei die Header die Dein Browser zuvor gesendet hat. Dann wird die Antwort angezeigt. Sollte Dein Browser Contenbd-encoding: gzip oder deflate senden, und der Server das beherrschen, dan wird der den (HTML)- Contend der Seite gzip-Komprimiert ausliefern, wie zum Beispiel dieses Forum. Aber Du musst den Header ja nicht mit Deinem Script senden, erstmal soll es funktionieren. Später macht es durchaus Sinn so Traffic und Zeit zu sparen.
aber am ENde steht
http://meinserver/ordner/http://meinserver/ordner/kryptischeZahlen -> läuft da irgendwas schief?
Gzip, s.o.
Und das letzte ARgument ist immer eine Null (auch nicht sehr aufbauend)
was für ein argument?
Mir fehlt irgendwie der Ansatz wie ich noch was testen könnte, iregndwo muss der HUnd ja begraben liegen!?
Es geht darum dass Du siehst was bei HTTP-Requests und Responses so für Header hin und hergeschickt werden, das kannst Du da sehr schön sehen. Danach guckst Du Dir nochmal die Beispiele bei fsockopen und den faq an, und probierst es erneut mit Deinen Scripten. Das Script mit fsockopen macht nichts anderes als Dein Browser, er sendet einen HTTP-Request, und das empfangende Script
<?php
echo "<pre>";
print_r($_POST);
?>
empfängt jetzt den POST-Request, und antwortet wieder mit dem Rersponse-Header(200 OK...)
Und hängt den Contend unten dran, in obigem Fall die Ausgabe des Array $_POST, und eben diese Ausgabe solltest Du mit Deinem 1 Script auch wieder anzeigen können. So kannst Du munter Daten hin und her übertragen, in die eine Richtung als POST-Daten, in die andere Richtung einfach die ausgegebenen Daten (echo...), wenn Du nur in die eine Richtung Daten schickst, könntest Du z.B. wenn alls OK ist :
echo "OK";
ausgeben um im sendenden Script zu sehen ob alles OK abgelaufen ist...
Ich empfehle dringend mal ein paar Beispiele aus den Kommentaren, faq... einfach auszuprobieren, so wie sie sind, und erst wenn sie funktionieren nach und nach auf dich umzubauen.
Grüße
Andreas
Hi,
wirst DU langsam ungeduldig mit mir? ;-)
Ja, aber gerade hast Du Doch bei Deinem Script bei einem POSt.Request einen 200er Statuscode bekommen, also wo bekommst Du denn den Fehler?
ich bekomme keinen Fehler, ich finde die Daten nicht
Okay ich denke hier liegt mein Verständnisproblem. Ob ich nun Beispiele oder modifizierten Quellcode verwendet habe, es läuft auf das Gleiche heraus. Ich bekomme, die Meldung, das alles geklappt hat und dann weiss ich nicht weiter. Ich dachte ich mach dann einen include der Datei und gut ist, aber dem ist nicht so.
Versuche ich das file-handle was ich habe wieder auszulesen (fgets, fread) steht dort nichts drin (so lautet zumindest die Fehlermeldung) bzw. bei den Beispielen wird ja auch immer ausgelesen, aber da stehen nur die Infos drin.
Wie kann ich jetzt meine seite anzeigen lassen, nachdem sie die Daten hat und hoffentlich auswerten kann?
Welche Zeile? Wo denn genau?
hab diese Zeile nicht reproduzieren können, war nur einmal da
Und das letzte ARgument ist immer eine Null (auch nicht sehr aufbauend)
was für ein argument?
die letzt Zeile in dem Info-Block, der durch das fgets eingelesen wird
danke!
ciao
romy
Hi!
Okay ich denke hier liegt mein Verständnisproblem. Ob ich nun Beispiele oder modifizierten Quellcode verwendet habe, es läuft auf das Gleiche heraus. Ich bekomme, die Meldung, das alles geklappt hat und dann weiss ich nicht weiter.
Wieso? Das ahbe ich doch gesagt. Wenn Du einen POST-Request auf PHP-Script sendest, dann bekommst Du erst den HTTP-HEader den der Webserver erzeugt zurück, und danach alles das was Du in diesem entfernten PHp-Script mit echo... ausgibst. Die Ausgabe ist dieselbe die der Browser erhält wenn er das Script aufruft.
Ich dachte ich mach dann einen include der Datei und gut ist, aber dem ist nicht so.
Nein. Das ist HTTP, Du verwendets das HTTP-protokoll um eine Verbinung zu einem entfernten Server herzustellen, schickst dem Server per POST Daten, dieser entfernte Server, bzw. das angespcrochene Script kann dann auf diese Daten per $_POST zugreifen, und irgendwas machen, schreib doch mal einen mail() Aufruf in das Script und Du siehst das sehr wohl was passiert. Und ich kann mich nur wiederhiolen, wenn Du in diesem Script jetzt was ausgibt, z.B. mit echo, dann wird das Script aus dem Du due Verbinding mit fsockopen() herstellst diese Daten auslesen können, die komen direkt nach dem HTTP-Header, den Du ja bisher erfolgreich ausgelesen hast.
Versuche ich das file-handle was ich habe wieder auszulesen (fgets, fread) steht dort nichts drin (so lautet zumindest die Fehlermeldung) bzw. bei den Beispielen wird ja auch immer ausgelesen, aber da stehen nur die Infos drin.
JA! Du musst auch was auf der anderen Seite ausgeben wenn Du was lesen willst. Schreibe mal eine andere Datei als Deine da rein, irgendeine HTML-Datei aus Deinen Bookmarks oder auf Deinem Server, diese wird Dir dann ausgegeben, nach dem Header.
Wie kann ich jetzt meine seite anzeigen lassen, nachdem sie die Daten hat und hoffentlich auswerten kann?
Was willst Du anzeigen lassen? Ich dachte Du wolltest Daten übertragen? Poste am besten mal beide Scrpte, das Script voin Server A der den POST-Request sendet, und das von Server B, welches den Request entgegennimmt.
Grüße
Andreas
Hi,
Wieso? Das ahbe ich doch gesagt. Wenn Du einen POST-Request auf PHP-Script sendest, dann bekommst Du erst den HTTP-HEader den der Webserver erzeugt zurück, und danach alles das was Du in diesem entfernten PHp-Script mit echo... ausgibst. Die Ausgabe ist dieselbe die der Browser erhält wenn er das Script aufruft.
ja da hast du, habe es erst falsch verstanden, aber nun gesehen, das die Daten da sind.
<blödfrag> muss ich selbst den überschüssigen header abschneiden vom String, der bleibt nämlich mit in meiner Ausgabe!?</blödfrag>
So nach vielem Hin-und Her-Probieren klappt dies nun mit zwei MEthoden.
erstens mit fsocketopen() und zweitens mit einem include, in welchem die Daten angehängt werden, was ich bisher als Lösung nicht so schön fand.
Ich bin zwar immernoch nicht fertig ;) (ausser mit den Nerven ;-)), aber jetzt muss ich mal sehen, wo noch Probleme auftauchen. Es ist alles ein grosses Zusammenspiel. Und der ganze AUfwand nur, weil unbedingt der eine Teil des Projektes auf einem anderen Server liegen muss. tststs
ich danke Dir vielmals, mir ist einiges klarer geworden. Manchmal sieht man aber auch den Wald vor Bäumen nicht. Ich hoffe Du hast ein schönes WE, bis bald ...
ciao
romy