Anfängerfrage zu $_post $_get
Jonas
- php
Hallo,
nachdem mein Modem am Wochenende abgeraucht ist, kann ich es leider nicht einfahc ausprobieren, würde aber gerne an meinem Script weiterarbeiten - daher hier meine Frage ob ich das mit den Variablen richtig verstanden habe:
Php 5 MySQL 4 (wenn ich richtig informiert bin)...
Wenn ich Variablen mittels eine URL übergebe muß ich wie folgt schreiben:
Link:
naechste_seite.php?a=1&b=2
$a=$_GET['a'];
$b=$_GET['b'];
echo $a<br>;
echo $b<br>;
-----
Wenn ich Variablen aus einer Datenbank abfrage erhalte dann wie folgt:
$sql="select a, b from tabelle where irgendwas='irgendwas'";
$erg=mysql_query($sql);
$ausgabe=mysql_fetch_array($erg);
while($ausgabe)
{
$a=$_POST['a'];
$b=$_POST['b'];
echo $a<br>;
echo $b<br>;
}
-------
Das $_Post gilt auch für Variablen die über ein Formular übergeben werden.
Ist das soweit richtig? Wäre dankbar über eine Antwort!
Zusatzfrage:
In wie weit kann ich aber darüber "bösen Code" vermeiden? Was muß ich da noch zusätzlich beachten, bzw. wie sollte ich die übergebenen Variablen prüfen.
Thanks,
Jonas
Hallo,
$sql="select a, b from tabelle where irgendwas='irgendwas'";
$erg=mysql_query($sql);$ausgabe=mysql_fetch_array($erg);
while($ausgabe)
{
...
}
fast. Ich würde schreiben WHERE irgendwas LIKE 'irgendwas'.
Und dann geht das auch so
$sql = mysql_query("SELECT ... WHERE irgendwas LIKE "'.mysql_real_escape_string(irgendwas).'")
while($ausgabe = mysql_fetch_array($sql)){
...
}
durch die Funktion mysql_real_escape_string() verhinderst du Codeeinschleusungen bei der Kommunikation mit der Datenbank.
Das $_Post gilt auch für Variablen die über ein Formular übergeben werden.
POST gilt _nur_ für Formulare, GET geht per URL oder Formular.
Zusatzfrage:
In wie weit kann ich aber darüber "bösen Code" vermeiden? Was muß ich da noch zusätzlich beachten, bzw. wie sollte ich die übergebenen Variablen prüfen.
Prüf ob sie den erwarteten Inhalt haben und verwende sie später kontextspezifisch. mysql_real_escape_string() bei DB-Statements, htmlspecialchars() bei HTML-Ausgabe.
Grüße, Matze
echo $begrüßung;
$sql="select a, b from tabelle where irgendwas='irgendwas'";
fast. Ich würde schreiben WHERE irgendwas LIKE 'irgendwas'.
Warum würdest du das so schreiben? Warum willst du einen genauen Vergleich mit einem Mustervergleich austauschen, ohne dass ein Grund zu erkennen ist?
echo "$verabschiedung $name";
Hallo,
$sql="select a, b from tabelle where irgendwas='irgendwas'";
fast. Ich würde schreiben WHERE irgendwas LIKE 'irgendwas'.Warum würdest du das so schreiben? Warum willst du einen genauen Vergleich mit einem Mustervergleich austauschen, ohne dass ein Grund zu erkennen ist?
gewohnheit^^
Ich wüsste jetzt auch keinen genauen Unterschied ausser, dass man mit LIKE "Wildcards" per % oder _ anhängen kann.
Könnte man vielleicht später mal gebrauchen.
Grüße, Matze
echo $begrüßung;
Ich wüsste jetzt auch keinen genauen Unterschied ausser, dass man mit LIKE "Wildcards" per % oder _ anhängen kann.
Könnte man vielleicht später mal gebrauchen.
Das halte ich für einen falschen Ansatz. Anwendungsabhängig sollte die Entscheidung für das eine oder das andere sein. Will ich eine Suche mit variablen Anteilen, dann LIKE. Will ich aber beispielsweise einen einzigen Benutzernamen abfragen, dann ist LIKE ziemlich unsinnig, und kann auch "später vielleicht" nicht gebraucht werden.
echo "$verabschiedung $name";
Hallo,
Ich wüsste jetzt auch keinen genauen Unterschied ausser, dass man mit LIKE "Wildcards" per % oder _ anhängen kann.
Könnte man vielleicht später mal gebrauchen.Das halte ich für einen falschen Ansatz. Anwendungsabhängig sollte die Entscheidung für das eine oder das andere sein. Will ich eine Suche mit variablen Anteilen, dann LIKE. Will ich aber beispielsweise einen einzigen Benutzernamen abfragen, dann ist LIKE ziemlich unsinnig, und kann auch "später vielleicht" nicht gebraucht werden.
das ist eine einleuchtende Begründung, aber was wäre der Nachteil von LIKE?
Ich halte beides für gleichwertig performant.
Grüße, Matze
echo $begrüßung;
das ist eine einleuchtende Begründung, aber was wäre der Nachteil von LIKE?
Ich halte beides für gleichwertig performant.
= muss nicht nach Mustern Ausschau halten, LIKE schon. Wenn du keine Mustersuche gebrauchen kannst, musst du die Zeichen % und _ gesondert vorbehandeln. Beim = ist das nicht der Fall.
echo "$verabschiedung $name";
Hallo,
= muss nicht nach Mustern Ausschau halten, LIKE schon. Wenn du keine Mustersuche gebrauchen kannst, musst du die Zeichen % und _ gesondert vorbehandeln. Beim = ist das nicht der Fall.
aber wenn ich mysql_real_escape_string() verwende, werden die Zeichen doch sowieso maskiert oder? Und da dürfte es wieder egal sein oder?
Grüße, Matze
Hallo
= muss nicht nach Mustern Ausschau halten, LIKE schon. Wenn du keine Mustersuche gebrauchen kannst, musst du die Zeichen % und _ gesondert vorbehandeln. Beim = ist das nicht der Fall.
aber wenn ich mysql_real_escape_string() verwende, werden die Zeichen doch sowieso maskiert oder? Und da dürfte es wieder egal sein oder?
Nein, weder das Prozentzeichen noch der Unterstrick werden durch mysql_real_escape_string() maskiert. Warum auch?
Freundliche Grüße
Vinzenz
Hallo,
Nein, weder das Prozentzeichen noch der Unterstrick werden durch mysql_real_escape_string() maskiert.
stimmt. Hm.
Warum auch?
Damit ich das "Problem" mit den % und _ nicht habe^^
Ok, hab den Sinn des Unterschieds verstanden.
Danke!
Grüße, Matze
Hi,
Wenn ich Variablen mittels eine URL übergebe muß ich wie folgt schreiben:
Link:
naechste_seite.php?a=1&b=2$a=$_GET['a'];
$b=$_GET['b'];
echo $a<br>;
echo $b<br>;
Die Umkopiererei ist Bloedsinn.
Du kannst ueberall in deinem Script auf $_GET['a'] zugreifen - also auch echo $_GET['a'] schreiben, $a ist ueberfluessig.
Und <br> ist kein PHP bekannter Name - du willst einen Text ausgeben, also mit Hochkommata oder Anfuerhungszeichen umschliessen.
echo $_GET['a'], '<br>'; // oder
echo $_GET['a'].'<br>';
Das sind allerdings absolute Basics - vor weiteren Fragen dieser Art lese dich doch bitte etwas mehr in die Grundlagen ein.
$ausgabe=mysql_fetch_array($erg);
while($ausgabe)
Damit holst du dir nur den ersten Datensatz, und hast anschliessend eine Endlosschleife.
Das Holen des naechsten Datensatzes gehoert mit in die Bedingung im Schleifenkopf.
MfG ChrisB
Mahlzeit,
Wenn ich Variablen aus einer Datenbank abfrage erhalte dann wie folgt:
$sql="select a, b from tabelle where irgendwas='irgendwas'";
$erg=mysql_query($sql);$ausgabe=mysql_fetch_array($erg);
while($ausgabe)
{
$a=$_POST['a'];
$b=$_POST['b'];
echo $a<br>;
echo $b<br>;
}
Ich frage mich gerade, was das Holen von Daten aus einer Datenbank mit $_POST zu tun hat. Außerdem verstehe ich nicht ganz, was das Beispiel illustrieren soll - schließlich machst Du eine Datenbankabfrage, benutzt die geholten Daten anschließend aber überhaupt nicht (abgesehen davon, dass Du eine Endlosschleife produziert hast, wie ChrisB schon anmerkte).
MfG,
EKKi
Moin,
erstmal danke an alle! Wollte nur wissen ob ich das mit $POST und $GET richtig verstanden habe - habe da ein nicht ganz eindeutiges Handbuch.... und danke für den Hinweis mit der Endlosschleife - klar war falsch gepostet von mir...
$sql="select a, b from tabelle where irgendwas='irgendwas'";
$erg=mysql_query($sql);$ausgabe=mysql_fetch_array($erg);
while($ausgabe)
{
$a=$_POST['a'];
$b=$_POST['b'];
echo $a<br>;
echo $b<br>;
}Ich frage mich gerade, was das Holen von Daten aus einer Datenbank mit $_POST zu tun hat.
Genau das ist meine Frage - wenn ich Daten aus einer Datenbank auslese muß ich die dann auch mit $_GET o. $_Post holen, oder stehen die mit "einfach zur Verfügung"?
also
while($ausgabe=mysql_fetch_array($erg)
{
echo $ausgabe['a'];
echo $ausgabe['b'];
etc.
}
oder
echo $_POST['ausgabe'(a)] oder wie soll das gehen
Ich weiß das sind absolute Anfängerfragen - aber meine ersten trocken Übungen habe ich noch mit globals on gemacht und das ist schon einige Zeit her und das Handbuch das ich habe ist da nicht wirklich hilfreich..
z.B. verstehe ich folgendes Beispiel aus dem Buch nicht
----
neue_seite.php?a=1&b=2
nun stehe die Variablen wie folgt zur Verfügung
$a=$_GET['neue_seite']
----
was soll mit das sagen? Wie bekomme ich die übergebenen Variablen, wie kann ich sie ausgeben? ist $a nun ein Array, das die Variablen beinhaltet? Oder ist das schlicht und ergreifend ein Druckfehler?
Bin da als Newbee etwas überfordert und kann es leider derzeit nicht ausprobieren (hoffe ich bekomme bald mein neues Modem)...
Thanks,
Jonas
Moin
Genau das ist meine Frage - wenn ich Daten aus einer Datenbank auslese muß ich die dann auch mit $_GET o. $_Post holen, oder stehen die mit "einfach zur Verfügung"?
also
while($ausgabe=mysql_fetch_array($erg)
{
echo $ausgabe['a'];
echo $ausgabe['b'];
etc.
}
Genau so stehen dir die Daten zur Verfügung.
$_GET und $_POST wird nur verwendet wenn Daten über die Methoden GET (an die URL angehangen) oder POST (per Formular) an das aktuelle Script übergeben worden sind. Diese Arrays haben als rein gar nix mit Datenbankaufrufen zu tun!
Gruß Bobby
echo $begrüßung;
Wenn ich Variablen mittels eine URL übergebe muß ich wie folgt schreiben:
In einer URL stehen keine Variablen. PHP war früher so frei und hat den Querystring interpretiert und daraus direkt Variablen angelegt. Zusammen mit schlampiger Programmierung war und ist das eine Sicherheitslücke. Wenn man davon ausgeht, dass PHP eine Variable beim ersten Zugriff anlegt, und sich nicht um eine explizite Initialisierung kümmert, kann durch diesen register_globals genannten Mechanismus die Variable nun alles mögliche unvorhergesehene enthalten.
for ($i = 0; $i < 10; $i++)
$s = $s . $i; // alternative Schreibweise: $s .= $i;
In dieser Schleife werden die Zahlen einfach an $s angehängt. Beim ersten Durchlauf existiert $s noch nicht. Der Lesezugriff ergibt den Wert null, der durch PHPs automatische Typumwandlung in einen Leerstring umgewandelt wird. Mit eingeschaltetem register_globals könnte man
http://example.com/script.php?s=irgendwas
aufrufen und hätte $s damit vorbelegt. Deshalb sollen Variablen vor dem ersten Zugriff immer mit einem definierten Wert versehen werden.
$s = '';
for ($i = 0; $i < 10; $i++)
$s = $s . $i;
register_globals ist mittlerweile (PHP5) nicht mehr standardmäßig eingeschaltet. Trotzdem ist eine explizite Variableninitialisierung vorzuziehen. Vielleicht schaltet das irgendein Depp ja wieder ein, weil das tolle Hastenichgesehen-Script von Kennstenich sonst nicht läuft.
naechste_seite.php?a=1&b=2
$a=$_GET['a'];
$b=$_GET['b'];
PHP stellt die Werte aus dem Querystring und die Werte aus POST-Formularen in den Arrays $_GET und $_POST zur Verfügung. Das sind ganz normale Arrays, deren Elemente sich in nichts von anderen Variablen unterscheiden. Der Unterschied zu selbst erzeugten Arrays ist, dass $_GET und $_POST superglobal sind, und damit auch innerhalb von Funktionen bekannt sind, doch der ist in dem Zusammenhang nicht weiter relevant.
Da es früher, als register_globals noch eingeschaltet war, (leider) üblich war, auf die Variablen direkt zuzugreifen, und sie überall kreuz und quer im Script verteilt waren, hatte man mit dem Ausschalten nun das Problem, dass die Variablen nun plötzlich leer waren. Die einfachste Lösung sah so aus, wie du sie notiert hast. Es hieß dann, man müsse die "Werte erst abholen". Und so verbreitete sich diese Unsitte des $foo = $_GET['foo']; Das hat auch noch den Nachteil, dass an $foo nicht mehr direkt zu sehen ist, dass dessen Wert eine Benutzereingabe ist, mithin auch ungeprüftes Zeug enthalten kann. Einem $_GET['foo'] sieht man sofort seine Herkunft an.
PHP gibt Hinweismeldungen beim Zugriff auf nicht vorhandene Variablen aus, die aber standardmäßig unterdrückt werden. Damit lassen sich nicht nur uninitialisierte Variablen finden sondern auch Tippfehler. Wenn man das error_reporting auf E_ALL stellt, kann man diese Hinweise sehen. Diese Einstellung sollte man immer beim Entwickeln gesetzt haben.
echo $a<br>;
bzw. echo $_GET['a'], '<br>';
Abgesehen vom Syntax-Fehler, solltest du unbedingt folgenden Lehrsatz verinnerlichen: Wenn Werte in einem bestimmten Kontext ausgegeben werden, müssen diese zwingend dem Kontext entsprechend behandelt werden.
Du übergibst hier einen Wert in den Kontext HTML. HTML ist ein Gemisch aus Anweisungen und Daten. Für die Daten gibt es Regeln, damit diese nicht als Anweisung missinterpretiert werden können. Diese besagen, dass die HTML-eigenen Zeichen besonders zu notieren sind. PHP hilft hier mit der Funktion htmlspecialchars(). Ausgaben in Richtung HTML sollten stets mit dieser Funktion behandelt werden:
echo htmlspecialchars($_GET['a']), '<br>';
Das <br> bleibt davon ausgenommen, denn das ist ja eine Anweisung und kein Wert.
Kleines Beispiel gefällig?
http://example.com/script.php?name=<b>fett</b>
im Script:
echo 'Dein Name ist: ', $_GET['name'];
Und nun stell dir statt <b> ein <script> vor ...
Probier nun das htmlspecialchars() aus.
Dein Name ist: <b>fett</b>
Das sieht dann zwar immer noch doof aus, aber die unsinnige Eingabe wurde wenigstens nicht vom Browser ungewollt als Anweisung interpretiert.
Wenn ich Variablen aus einer Datenbank abfrage erhalte dann wie folgt:
Auch in einer Datenbank stehen keine Variablen drin, sondern einfach nur Daten bzw. Werte. Es gibt einige Funktionen, die diese Daten zurückliefern. Deren Ergebnis kann man in Variablen ablegen, muss man aber nicht zwingend.
$sql="select a, b from tabelle where irgendwas='irgendwas'";
Auch hier hast du wieder einen Kontext, in dem Anweisungen mit Daten gemischt übertragen werden. Deshalb gilt auch hier wieder obiger Lehrsatz. Allerdings ist hier der Kontext nicht HTML sondern MySQL-Statement. Und dafür stellt PHP die Funktion mysql_real_escape_string() zur Verfügung.
$sql = sprintf("SELECT a, b FROM tabelle WHERE a = '%s' AND b = '%s'",
mysql_real_escape_string($_GET['a']),
mysql_real_escape_string($_GET['b']));
So sieht das ganze auch noch etwas übersichtlicher aus, als wenn man die Funktion mysql_real_escape_string() mittels Stringverkettung einbettet.
Zum Rest sag ich nichts weiter, dafür findest du nicht nur ein Beispiel im PHP-Handbuch.
Erwähnt sei noch ein PHP-Feature namens Magic Quotes, das sich auf die Fahne geschrieben hat, gegen SQL-Injection zu sein. Jedoch arbeitet es die Maskierungen bereits in die Eingabedaten ein, ohne darauf Rücksicht zu nehmen, in welchen konkreten Ausgabekanal diese Daten mal später fließen werden, und ob der vielleicht eine ganz andere Bearbeitung benötigt. Wie man die Magic Quotes loswird, steht im velinkten Artikel.
In wie weit kann ich aber darüber "bösen Code" vermeiden?
Wichtig ist, obigen Lehrsatz konsequent anzuwenden.
Was muß ich da noch zusätzlich beachten, bzw. wie sollte ich die übergebenen Variablen prüfen.
Je nach deinen Anforderungen kannst du noch zusätzlich diverse Prüfungen einbauen. Beispielsweise Variableninhalte auf bestimmte Eigenschaften hin testen. Enthalten sie das, was du erwartest? Enthalten sie Dinge, die unbedingt ausgeschlossen werden müssen? Z.B. kommen in einer E-Mail-Adresse keine Zeilenumbruchszeichen vor. Wenn die doch dort zu finden sind, dann kann das nichts gutes bedeuten.
Insgesamt ist das ein komplexes Thema, das man nicht in ein paar Sätzen abhandeln kann. Du musst dir immer überlegen: Was für Daten will ich haben? Welche will ich nicht haben? Wenn ich ein Angreifer wäre, wie könnte ich mein System ungewollt ausnutzen? Was habe ich dagegen getan? Dazu gehört auch, dass man sein eigenes Script mit unsinnigen Werten aufruft, um so zu testen, dass es dagegen immun ist. Welche Zeichen haben im jeweiligen Kontext eine Sonderbedeutung, und wie reagiert mein Script, wenn diese als normale Daten daherkommen?
echo "$verabschiedung $name";
Wahnsinn!!
Danke für die ausführliche Antwort - hat mir super weitergeholfen.
und danke auch an die anderen, ich weiß ja wie sehr solche Anfängerfragen nerven können...
Grüße und auf bald,
Jonas