fwrite();

Status
Not open for further replies.

anton201

New Member
Hallo,

hier erstmal das Script:

Code:
<?php
$domain = $_GET["domain"];
$fp = fopen("test.html", "w+");
fwrite($fp, '<html><a href="http://$domain">LINK');
fclose($fp);
?>

Habe nun folgendes Problem:
Das Script soll die oben angegebenen Daten in eine HTML Datei schreiben was ja auch funktioniert, jedoch will ich die Stelle "$domain" durch die in der Url eingegebene Domain ersetzen was aber nicht funktioniert. Gibt es einen Weg es so hinein zu schreiben? Habe schon befehle wie echo versucht aber es will nicht. Sorry bin halt nen PHP anfänger.

Bin über jede Antwort dankbar.
 
Code:
<?php
$domain = $_GET["domain"];
file_put_contents("test.html",'<html><a href="http://'.$domain.'">LINK');
?>

Und wenn du den Code an die entsprechende Datei anhängen willst, machst du folgendes:

Code:
<?php
$domain = $_GET["domain"];
file_put_contents("test.html",'<html><a href="http://'.$domain.'">LINK', FILE_APPEND);
?>
 
und wofür initailisierst du eine Variable, wenn sie danach eh beschrieben wird?

Davon abgesehen war das mehr ein Denkanstoß - wenn er absolut 0 Ahnung hätte, dann würde er wahrscheinlich andere Fragen stellen :)
 
und wofür initailisierst du eine Variable, wenn sie danach eh beschrieben wird?
Weil man das "saubere Programmierung" nennt.
Jede nicht initialisierte Variable ist eine potenzielle (und vor allem überflüssige) Fehlerquelle.

Abgesehen davon ist in diesem Code nicht sicher gestellt dass $domain tatsächlich in der nächsten Zeile beschrieben wird.

huschi.
 
Richtig, aber wenn $domain nicht beschrieben wird, rufst du ja auch nicht die Funktion zum schreiben auf.

Von daher - warum $domain dann initialisieren?
Wir arbeiten hier nicht in C, wo du jede Variable erstmal Anfangs deklarieren musst - da tut initialisieren Not. In PHP brauchst du das aber nicht machen - das ist ja das schöne.

Wenn du natürlich nachher irgendwann einen Vergleich auf den Inhalt von $domain machst sieht das anders aus.
Da er das in dem Script aber nicht gemacht hat, ist das eine überflüssige Zeile Code.

Im übrigen ist es genauso ein schlechter Stil alles in eine Zeile zu klatschen, davon mal ganz abgesehen :P
 
Wir arbeiten hier nicht in C, wo du jede Variable erstmal Anfangs deklarieren musst
Nö, auch in C reicht ein "char[] domain;".
Und ich rede auch nicht von einer bestimmten Programmiersprache sondern vom "sauberen Programmieren". Es handelt sich hierbei um ein Pragma.

Wenn du natürlich nachher irgendwann einen Vergleich auf den Inhalt von $domain machst sieht das anders aus.
Wenn ich das oben richtig lese, soll $domain später in einem Output-Context verwendet werden. Ergo sollte sie auch einen Wert zugewiesen bekommen haben.
Und es ist nie früh genug saubere Programmierung zu lernen!

Im übrigen ist es genauso ein schlechter Stil alles in eine Zeile zu klatschen
Ja, da hast Du recht. Der Code stammt ja auch nicht von mir, sondern nur die Erklärung auf Deine Nachfrage. Aber nach dem Pragma für "lesbaren Code" hast Du auch nicht gefragt. ;)

huschi.
 
Ich habe geschrieben "deklarieren", nicht "initialisieren" ... das sind 2 Paar Schuhe.

Deklarieren ist das, was du im Ansatz bei deinem C-Vergleich richtig gemeint hast. Initialisieren ist deklarieren und die Variable mit einem Anfangswert belegen.

Im übrigen ist in C ein "char[] domain;" komplett falsch.
1. muss es heißen "char domain[];",
2. musst du entweder eine Array-Size angeben (bsp. domain[50]) oder du musst es via einem Pointer erledigen (char *domain;)

Wenn ich das oben richtig lese, soll $domain später in einem Output-Context verwendet werden. Ergo sollte sie auch einen Wert zugewiesen bekommen haben.
Und es ist nie früh genug saubere Programmierung zu lernen!
Mag sein, dass $domain später in einem Output-Context verwendet wird.
In fliptows Beispiel aber ist es so, dass wenn $_GET["domain"] gar nicht belegt ist, dass dann entsprechend auch gar kein output folgt.
Wofür also eine Variable deklarieren, die nie benötigt wird?

Und wenn er später doch irgendwo $domain verwenden will, egal ob voll oder leer, dann wird er einfach schreiben:

Code:
if (isset($_GET["domain"]))
  $domain = htmlentities($_GET["domain"]);
else
  $domain = "";
 
In PHP brauchst du das aber nicht machen - das ist ja das schöne.
Was daran schön ist, würde ich gerne mal wissen. Durch diese "schöne" Eingenart von PHP ist es leider nicht möglich, den Scope von Variablen genau zu bestimmen. Es ist dadurch z.B. nicht möglich, eine Variable ausschließlich innerhalb des Codeblocks eines forach-Konstrukts zu definieren wie es z.B. bei Perl möglich ist:
Code:
foreach my $scalar (@array) {
  print '$scalar ist definiert' if defined $scalar;
}
print '$scalar nicht definiert' unless defined $scalar;


Code:
if (isset($_GET["domain"]))
  $domain = htmlentities($_GET["domain"]);
else
  $domain = "";
Wie wäre es damit?:
Code:
$domain = htmlentities(@$_GET['domain']);
 
Last edited by a moderator:
Korrekt, ändert nix daran, dass er ja trotzdem in der If-Verzweigung wahrscheinlich gern Daten in seine HTML-Datei schreiben möchte, oder etwa nicht ?!

Dafür sollte $domain schon belegt sein ...

Und warum sollte ich eine Variable erzeugen, die nur in einer Schleife gültig ist? Dort drinnen belegt wird und außerhalb der schleife existiert eine Variable mit dem selben Namen und anderem Inhalt?

Dann lieber ne Funktion dafür geschrieben, die man in der Schleife aufruft.
 
Last edited by a moderator:
Ich habe geschrieben "deklarieren", nicht "initialisieren" ... das sind 2 Paar Schuhe.
Für eine Compiler-Sprache schon. Für eine Interpreter-Sprache wie PHP nicht.
Durch das erste Auftauchen einer Variable wird diese auch deklariert.
Durch das "" weiß PHP auch, daß es sich erstmal um einen String handelt.
Und nur weil PHP implizite Deklarationen (und eine Menge anderen Sch***) kann, heißt es nicht, daß man dies nutzten sollte.

Im übrigen ist in C ein "char[] domain;" komplett falsch.
"Komplett" sehe ich hier als übertrieben nur weil ich [] Java-like platziert habe. Aber Du bist ja so freundlich und bringst danach ebenfalls Deklarieren und Initialisieren durcheinander. :D

Wofür also eine Variable deklarieren, die nie benötigt wird?
Nochmal im Klartext:
Es geht um das Pragma "saubere Programmierung"!
Du reitest auf einer in Deinen Augen unnötigen Zeile rum, welches Du im späteren Beispiel auch noch mit einer weiteren unnötigen else-Klause ersetzten willst.
Dein Prinzip scheint es zu sein möglichst kurzen und dadurch schwer lesbaren, fehleranfälligen Code zu produzieren.
Dir steht Deine Meinung gerne zu. Aber was ist falsch daran einem PHP-Anfänger von vornherein einen guten Programmierstiel beizubringen?

Aber mal kurz zur Erinnerung:
Du hast danach gefragt warum diese Zeile dort steht.
Ich habe Dir eine Erklärung geliefert.
Wenn Dich diese Erklärung nicht befriedigt, dann kotz Dich bitte in einem PHP-Forum aus!
Denn diese Diskussion ist absolut OFF-TOPIC.

huschi.
 
Und wo habe ich deklarieren und initialisieren vertauscht?

Du hast nicht nur "Java Like" platziert, du hast auch die Array-Größe vergessen anzugeben.

Nochmal im Klartext:
Es geht um das Pragma "saubere Programmierung"!
Du reitest auf einer in Deinen Augen unnötigen Zeile rum, welches Du im späteren Beispiel auch noch mit einer weiteren unnötigen else-Klause ersetzten willst.
Dein Prinzip scheint es zu sein möglichst kurzen und dadurch schwer lesbaren, fehleranfälligen Code zu produzieren.
Dir steht Deine Meinung gerne zu. Aber was ist falsch daran einem PHP-Anfänger von vornherein einen guten Programmierstiel beizubringen?
Saubere Programmierung:
Da gehört aber viel mehr dazu.

Zu allererst einmal die nötigen Kommentare, die fehlen in seinem Script komplett.
Dazu wird beim "sauberen Programmieren" direkt am Anfang des Programms zu allererst jede benutzte Variable erstmal deklariert & initialisiert.
Dazu kommt, dass die Benennung der Variablen auch durchdacht sein sollte und als Anfangsbuchstabe der Datentyp der Variable stehen sollte (bsp: iZahl, fDurchschnitt, sDomain).
Davon mal ganz abgesehen fehlen sämtliche Body-Tags, Head-Tags, ...

Um es "sauber" zu programmieren sollte das Script dann wohl in etwa so aussehen:

Code:
// Variablen deklarieren & belegen
$sDomain = htmlentities(@$_GET["domain"]);

// prüfen, ob $sDomain Inhalt enthält
if (isset($sDomain))
{
  // $sDomain enthält Inhalt - aktuelle Domain als Link an test.html anhängen
  file_put_contents("test.html",'<a href="http://'.$sDomain.'">LINK</a>', FILE_APPEND);
}
else
{
  // $sDomain enthält keinen Inhalt - Script beenden, Fehler auswerfen
  die('Fehler - $sDomain ist nicht belegt!');
}

Dazu müsste natürlich die "test.html" entsprechende Tags von Anfang an enthalten/vorweisen und beim auslesen darauf geachtet werden, dass man ein entsprechendes "</body></html>" am Ende anhängt.

Dein Prinzip scheint es zu sein möglichst kurzen und dadurch schwer lesbaren, fehleranfälligen Code zu produzieren.
Möglichst kurzen? Nein, eher performanten und kompakten.
Wer nichtmal weiß, wie man eine Verkettung diverser logischer und mathematischer Operatoren liest (z.B., dass man bei sowas von rechts nach links liest), dann sollte man sowieso überlegen, ob man beim programmieren richtig ist.
Schau dir mal den Quellcode des Linux-Kernel an ... was dich da so erwarten wird!

Du reitest auf einer in Deinen Augen unnötigen Zeile rum, welches Du im späteren Beispiel auch noch mit einer weiteren unnötigen else-Klause ersetzten willst.
Unnötige Else-Klausel? Kommt ganz auf die Struktur des Programms an, ob er später nochmal mit $domain arbeiten will, oder ob er es nicht tun will.

Davon abgesehen hat mich mein Programmieren-Dozent mal was gelehrt, nämlich dass überall nur "if"-Blöcke, ohne "else"-Zweig ganz furchtbarer Stil sind.

Davon mal ganz abgesehen:
Code:
if (isset($_GET["domain"]))
  $domain = htmlentities($_GET["domain"]);
else
  $domain = "";

Schau dir den Block mal etwas genauer an.
Du wirst sehen, dass man im IF-Teil direkt doch glatt das Schreiben in die Datei gelöst werden könnte - im else-Block könnte man doch glatt eine Fehlerausgabe hineinschreiben, oder?

Ob ich nun direkt zu Anfang prüfe, ob die Variable befüllt ist und entsprechend reagiere, oder ob ich sie erst initalisiere, dann befülle und dann prüfe ... oder ob ich gleich checke, ob im $_GET überhaupt was drinsteht und dann entsprechend die Operation ausführe - das ist doch Wurst, oder?

Nur in deinem Fall muss erstmal $domain initialisiert werden, danach muss eine Abfrage Richtung Get kommen, was drin steht - danach die If-Abfrage, ob $domain belegt ist (wo ja zwischendrin nochmal das Get nach $domain geschrieben werden musste). Danach wird geschrieben.

Bei mir ist das so: If-abfrage - ja im get steht was drin, Daten direkt in die Datei schreiben, alternativ vorher in eine Variable einfügen.
Im Else-Zweig kommt ne Fehlerausschrift, falls der If-Kontext nicht zutrifft und fertig.

Das initialisieren der Variable ist an der Stelle einfach nur überflüssig.
Da kannst du mit noch so einem tollen, sauberen Programmierstil kommen - entweder richtig, oder gar nicht.

Und wenn du schon erzählen willst, wie in C Variablen deklariert werden, dann mach es bitte auch richtig und komm nicht mit ner Ausrede vonwegen Java un so ...
In Java kann man nämlich genauso schreiben:
char cName[] = new char[20];
 
Darf ich daran erinnern, dass es schon deshalb sinn macht eine Variable in PHP zu initalisieren, weil manche auf ihren Webservern immer noch mit der Direktive
Code:
register_globals on
arbeiten. Setze ich also eine Variable vor dem Gebraucht, so kann ich danach ausschließen, dass mir ein Wert der durch oben genannte Direktive entstanden ist, keine Probleme macht.
 
@voodoo24
Um es abzukürzen:
Ja, Du hast in allen Belangen recht!

@Mordor
Nein, kann nicht sein, weil voodoo24 hat recht.

@fliptow
Bitte ändere augenblicklich die angemakelte Zeile!

@all
Jetzt haben wir hoffentlich wieder Ruhe.

huschi.
 
Man man man!!!

@Voodoo
Das man jede x-beliebige GET-Variable setzen kann ist dir klar oder???

@ Huschi
Du hast recht ;-)
 
Natürlich ist mir das klar, Mordor.

Deshalb kam ja auch die Antwort:
register_globals = off - und wahrscheinlich wird auch aus dem genannten Grund von vielen Providern und Usern empfohne, register_globals auf off zu stellen - oder sehe ich das falsch?

@voodoo24
Um es abzukürzen:
Ja, Du hast in allen Belangen recht!

@Mordor
Nein, kann nicht sein, weil voodoo24 hat recht.

@fliptow
Bitte ändere augenblicklich die angemakelte Zeile!

Eingeschnappt? Anders kann ich mir das jetzt gar nicht erklären.
Da fehlen jemandem eindeutig C und Java-Kenntnisse :D
 
Eingeschnappt?
Nein, Moderator.
Und als solches muß ich mich an gewisse Regeln halten.
Du anscheinend weder an Regeln noch an Zügeln. Sonst würdest Du jetzt nicht beleidigend werden.

PS: Genau aus diesem Grunde wird jetzt geclosed!

huschi.
 
Status
Not open for further replies.
Back
Top