Problem mit Str_Replace auf dem Server
Hallo Leute
Ich versuche einen Updater für mein Tool zu schreiben.
Leider fehlt mir das PHP Wissen. PHP möchte ich nicht erlernen, das ist eine einmalige Sache.
Ich hoffe Ihr könnt mir ein wenig helfen damit es irgendwie läuft.
Es geht um folgendes.
Ich erfasse die Locale Version und die deklarierte Version auf dem Server ab.
Code:
Local := GetFileVersion(ParamStr(0));
Remote := GET('http://MeineAdresse.de/Serien_Downloader_Update/AU.php?' +
'datei=AutoUpdater.inf' +
'&zeile=6' , {Zeile}
'MeineAdresse.de', {Host}
''); {Refeerer}
Das funktioniert schon sehr gut. Meine PHP Datei macht das gut.
Damit habe ich die Versionen erfasst.
Nun möchte ich die Version auf dem Server die in Zeile Nr.6 gespeichert wurde mit der neuen ersetzen.
Also rufe ich noch mal meine PHP Datei auf, diesmal aber mit weiteren Parametern.
Code:
Response := GET('http:// MeineAdresse.de /Serien_Downloader_Update/AU.php?' +
'datei=AutoUpdater.inf' +
'&zeile=6' + {Zeile}
'&LocaleVersion=' + Local + {Local}
'&ServerVersion=' + Remote + {Remote}
'&update', {Befehl}
' MeineAdresse.de ', {Host}
''); {Refeerer}
Und hier ist der Hund begraben. Hier bekommen ich immer eine Fehlermeldung.
<!DOCTYPE HTML PUBLIC"-//IETF//DTD HTML ":=//EN">
Meine PHP Datei. (Habt Mitleid mit mir, das habe ich mir aus irgendwelchen Vorlagen zusammengeschustert)
PHP-Code:
<?php
define('FILE_PATH', 'data/');
$req = array('datei', 'zeile');
foreach($req as $p)
{if(!isset($_GET[$p]) || empty($_GET[$p])) { error(); }}
if(file_exists(FILE_PATH.$_GET['datei']) && is_numeric($_GET['zeile']))
{ $file = file(FILE_PATH.$_GET['datei']);
$inhalt = @$file[$_GET['zeile'] - 1];
if(!empty($inhalt))
{ echo $inhalt;
if(isset($_GET['del']))
{ unset($file[$_GET['zeile'] - 1]);
file_put_contents(FILE_PATH.$_GET['datei'], $file);}
if(isset($_GET['update']))
{ unset($file[$_GET['zeile'] - 1]);
file_put_contents(FILE_PATH.$_GET['datei'],
str_replace($_GET['ServerVersion'], $_GET['LocaleVersion'],
file_get_contents(FILE_PATH.$_GET['datei'])));}}
else
{ echo 'Zeile '.$_GET['zeile'].' in Datei '.$_GET['datei'].' nicht gefunden.';}}
else
{ echo 'Datei '.htmlentities($_GET['datei']).' nicht gefunden.';}
function error()
{ echo 'Bitte Datei und Zeile angeben.'; exit;}
Vielleicht habe ich die Sache falsch angepackt, falls es andere Wege gibt bitte auch vorschlagen.
Es geht eigentlich nur darum:
- Version auf dem Server erfragen
- Zeile Nr.6 auf dem Server umschreiben
Das sollte in einem Rutsch passieren.
Es sollte schon per PHP laufen, weil es in den meisten Fällen nur die Serverversion abgefragt wird. Das eine Mal abfragen und Update ausführen funktioniert nämlich mit meiner PHP, nur mein Upload der neuen Version noch nicht. Ich vermute es hat was mit dem Schließen der Datei zu tun, leider bin ich PHP- Niete.
Für jede Hilfe bin ich dankbar.
AW: Problem mit Str_Replace auf dem Server
Hi, BlackHook!
Ich habe mir deinen Code mal angeschaut und hätte bei der Einrückung und der Klammersetzung fast auf den Tisch gekotzt. :D Hast aber auch gesagt, dass du kein Entwickler bist und von daher spare ich mir die restlichen Kommentierungen. Hier ist von daher einmal der fertige Code:
PHP-Code:
<?php
define('FILE_PATH', 'data/');
$req = array('datei', 'zeile');
foreach($req as $p) {
if(!isset($_GET[$p]) || empty($_GET[$p])) {
error();
}
}
if(file_exists(FILE_PATH.$_GET['datei']) && is_numeric($_GET['zeile'])) {
$file = file(FILE_PATH.$_GET['datei']);
$inhalt = @$file; // <-- Changed by Barny
if(!empty($inhalt)) {
// Diesen Part hier habe ich nicht angefasst, sollte aber noch angepasst werden >>>
if(isset($_GET['del'])) {
unset($file[$_GET['zeile'] - 1]);
file_put_contents(FILE_PATH.$_GET['datei'], $file);
}
// Diesen Part hier habe ich nicht angefasst, sollte aber noch angepasst werden <<<
if(isset($_GET['update'])) {
// Added by Barny >>>
$data = '';
foreach ($inhalt as $e) {
if(strpos($e,$_GET['ServerVersion']) !== false) {
$e = str_replace($_GET['ServerVersion'], $_GET['LocaleVersion'], $e);
}
$data = $data . $e;
}
$file_handle = fopen(FILE_PATH.$_GET['datei'], 'w');
fwrite($file_handle, $data);
fclose($file_handle);
echo "Version wurde ersetzt!";
// Added by Barny <<<
}
} else {
echo 'Zeile '.$_GET['zeile'].' in Datei '.$_GET['datei'].' nicht gefunden.';
}
} else {
echo 'Datei '.htmlentities($_GET['datei']).' nicht gefunden.';
}
function error() {
echo 'Bitte Datei und Zeile angeben.';
exit;
}
?>
Ich habe alle Änderungen von mir jeweils im Code markiert und habe ihn einmal richtig formatiert damit man ihn lesen kann. Die Bedingung die auf "$_GET['del']" prüft habe ich nicht angefasst, sollte aber nochmals überarbeitet werden. Da du dir den Rest auch zusammenkopiert hast wirst du das denke ich auch mit dem Part darunter hinkriegen. ;)
Habe deinen Code einmal auseinandergepflückt, lauffähig gemacht und dann wieder soweit zurückkopiert, dass es bei dir wieder passen sollte. Hoffe, dass es so stimmt. Vergiss bitte nicht die Dateiberechtigungen anzupassen. Die Ausgeführte Datei benötigt Schreibrechte und die zu beschreibende Datei muss beschreibbar sein!
Achja... das
Code:
<!DOCTYPE HTML PUBLIC"-//IETF//DTD HTML ":=//EN">
ist keine Fehlermeldung! Siehe hierzu: https://www.ietf.org/ und https://www.w3.org/html/
Falls noch Fragen sein sollten, dann kannst du dich gerne melden! Ich persönlich würde den Code nämlich einmal gründlichst überarbeiten. Viele unnütze Else-Zweige und Bedingungen an sich befinden sich in deinem Code. Außerdem würde ich es mir überlegen, ob ich (online?) ein Script zur Verfügung stelle, womit quasi jeder meine Dateien bearbeiten kann. Ich hätte beispielsweise so die Möglichkeit eine Shell auf deinen Webserver zu pushen.
Viele Grüße,
Barny
AW: Problem mit Str_Replace auf dem Server
Erstmal vielen vielen Dank.
Bin gerade von der Arbeit gekommen, mache mich gleich an die Datei ran.
Ich berichte später noch mal wie es geklappt hat.
Danke noch Mal.
Edit:
Ich nehme den Edit zurück. Deine Datei funktioniert. Mein fehlendes Verständnis für PHP war Schuld.
Abfrage unf Ersatz funktionieren gut.
Edit: 2
Zitat:
Bedingungen an sich befinden sich in deinem Code. Außerdem würde ich es mir überlegen, ob ich (online?) ein Script zur Verfügung stelle, womit quasi jeder meine Dateien bearbeiten kann. Ich hätte beispielsweise so die Möglichkeit eine Shell auf deinen Webserver zu pushen.
Das ist natürlich ein Argument. Mal schauen ob ich es doch anders lösen kann.