Antworten auf deine Fragen:
Neues Thema erstellen

SQL-Abfrage-Parameter einem Link mitgeben

strichcode

Nicht mehr ganz neu hier

Guten Tag zusammen.
Ich möchte von einer php Seite heraus Links aufrufen können, die Parameter für eine SQL-Abfrage mit bringen.

Beispiel: auf der Seite ausgabe.php befinden sich sehr viele Artikel und ich möchte dem Besucher eine Art "Sortierfunktion" anbieten.
Das Einfachste wäre ja die Seite mehrfach zu kopieren und in jeder dieser Kopie die Sql-Abfrage zu ändern. Das möchte ich irgendwie verhindern, da das gesamte Projekt aus zu vielen Seiten besteht.

Meine herangehensweise funktioniert aber nicht richtig.
In die Datei ausgabe.php habe ich geschrieben:

$sortkrit = $_GET['Sortkrit'];
$abfrage = "SELECT * datenbank WHERE datenbankfeld LIKE 'on' ORDER BY '$sortkrit'";

weiter unten

<a href="ausgabe.php?Sortkrit=PLZ">sortiert rauf</a>
<a href="ausgabe.php?Sortkrit=PLZ DESC">sortiert runter</a>
(Die Ergebnisse auf der Seite sollen z.B. nach Postleitzahl sortiert werden.)

Es passiert genau nichts. Beim Klick auf einen Link wird die Seite neu aufgerufen und in der URL steht: ausgabe.php?Sortkrit=PLZ (oder PLZ DESC) aber der Inhalt der Seite hat sich nicht verändert. error_reporting ist an.
Was kann ich tun? Entschuldigt bitte die Formulierungen, ich benutze vlt. nicht die richtigen Fachbegriffe, meine php-Kenntnisse beschränken sich darauf, bis genau hier hin gekommen zu sein.
Könnt Ihr mir mal auf die Sprünge helfen und beim Denken helfen?

Lieben Dank.
Heike
PS. Wo ist der Button hin, mit dem man den Code besser darstellen kann?
 

strichcode

Nicht mehr ganz neu hier

Daaanke fürs Mithelfen.
Wenn ich ORDER BY '".$sortkrit."'"; mit den beiden Punkten schreibe, dann ist es wie vorher. Die URL wird brav geschrieben, aber es passiert nichts.

Wenn ich alle Hochkomma schreibe, also exakt genau, wie Du es vorschlägst, dann steigt es mit einer Fehlermeldung.... Syntax-Error aus.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''datenbank.......
 

MJayFux

MJayFux

Ja, weil du bei deinem alten SQL-Code das "FROM" vergessen hast. Wo soll er denn das * hernehmen? > FROM `datenbank`, und das FROM hat bisher gefehlt.
 

strichcode

Nicht mehr ganz neu hier

oh, nein.
Sorry.
Bei mir steht ganz brav ein "FROM".
Das es oben fehlt, liegt daran, daß ich nach copy&paste aus meinem eigentlichem Datenbanknamen einen unverfänglichen für hier gemacht habe.Da hab ich die Brille nicht aufgehabt.
Bei mir steht ganz ordentlich SELECT * FROM datenbank WHERE.....

Er stellt die Seite ja auch ordentlich dar. Alle Inhalte kommen wie gewünscht. Nur von meinem Link auf die Seite ausgabe.php?Sortkrit=PLZ, sortiert er eben die Inhalte NICHT nach PLZ. Also er ignoriert das was hinter dem ? steht. Vielleicht macht man das gar nicht so?
 

owieortho

Aktives Mitglied

In solchen Fällen schaue ich mir an, :
  • was (in Deinem Beispiel) rauskommt, wenn per
    PHP:
    echo $sortkrit;
    die Übergabe der Variablen angezeigt wird
  • den Quelltext der resultierenden Seite, in Deinem Fall reicht eine Inspektion der fraglichen Links
  • prüfe, ob der Aufruf funktioniert, wenn Du die Ziel-URL manuell eingibst
  • wertet das empfangende Skript die Variable auch aus (Schreibweise beachten)? Auch hier prüfen, was in welcher Form in das SQL-statement übergeben wird. Lass gegebenenfalls auch das resultierende SQL per echo anzeigen
auf diesem Weg lassen sich einige Fehler entdecken.
Viel Erfolg
O.
 

MJayFux

MJayFux

Hmm ... noch einen Schreibfehler habe ich entdeckt, und zwar in der SQL-Abfrage schreibst du die Variable $sortkrit mit kleinem "s", aber bei den Parametern in der URL übergibst du "?Sortkrit=PLZ" mit großen "S". Liegt es vielleicht daran?

Sorry, habe übersehen dass die $_GET auch mit großen "Sortkrit" ausgelesen wird, also vergiss was ich sagen wollte.
 
Zuletzt bearbeitet:

m_c

Nicht mehr ganz neu hier

Gibt es eine Ausgabe, wenn ORDER BY weg ist?
Das ORDER BY sollte `Spaltenname` heißen. Die Reihenfolge muss außerhalb der Bezeichnung sein, also `Spaltenname` DESC. Probieren kann man auch Spaltenname.

Außerdem ist die Abfrage so, wie sie jetzt, extrem anfällig für "Hacking".
 

strichcode

Nicht mehr ganz neu hier

Ganz lieben Dank an alle! Es funktioniert.
Eigentlich sogar genauso, wie ich es oben geschrieben habe. Ich habe noch einiges rumprobiert, heute morgen dann ging es. Möglicherweise hat mich der Browser veräppelt, oder ich hab irgendwo ein ' nicht richtig gehabt.
Sich das ganze mit echo anzeigen zu lassen ist ein extrem hilfreicher Tipp. Danke.

Erfreulich fand ich auch, daß man sogar nach Datenbankfeldern sortieren kann, in denen z.B. ein 'on' steht. Mit dem Zusatz DESC erscheinen die Datensätze zuerst, die die Anforderungen erfüllen. Sehr nützlich für mich. (Und vielleicht auch für andere.)
Außerdem ist die Abfrage so, wie sie jetzt, extrem anfällig für "Hacking".
Warum das? Und was kann ich da besser machen?
 

owieortho

Aktives Mitglied

Warum das? Und was kann ich da besser machen?
Wer Deinen Quelltext liest - und das würde jede/r tun, der/die was im Schilde führen - kann so Informationen über Deine Datenbankstruktur erlangen. Bspw., dass Du deutsche Begriffe für Datenbankobjekte verwendest. Dann brauch man schon mal nicht mehr mit `user` rumprobieren sondern gleich mit den deutschen Begriffen.
Benenne Deine Formularelemente bzw. Deine URL-Codierungen (die Variablennamen-Werte-Pärchen hinter dem ? in der URL) unverfänglich und vergebe erst serverseitig im php-Skript die tatsächlichen Namen. Security by obscurity nennt sich sowas.
Was niemand sieht, ist auch, welche anderen Maßnahmen Du skriptseitig triffst, um zum Beispiel SQL-injections zu unterbinden.
Schau Dir mal als Beispiel die Live-Hacks von Sebastian Schreiber an: bspw.
, sehr lehrreich.
Weiter viel Erfolg und - trotz allem - Spaß
O.
 

Dagobert68

Nicht mehr ganz neu hier

Moin ;)

Danke @owieortho , dass du das Thema Sicherheit hier angesprochen hast! Superwichtig!

@strichcode : Hier auch noch ein paar Links zum Einlesen in die Thematik:

https://www.php-einfach.de/experte/php-sicherheit/

https://wiki.selfhtml.org/wiki/Programmiertechnik/Kontextwechsel

Und wenn du gut mit Büchern lernen kannst, empfehle ich dieses Buch von Florence Maurice:
PHP 7 und MySQL
Ihr praktischer Einstieg in die Programmierung dynamischer Websites
dpunkt.verlag GmbH
ISBN-10: 3864906016
ISBN-13: 978-3864906015

Sie schreibt sehr schön verständlich und anschaulich, nicht zu technisch und sehr praxisorientiert, finde ich :)

Viel Spaß beim Erkunden von PHP und MySQL! Bleib dran, es macht Spaß, auch wenn die Thematik hin und wieder etwas trocken erscheint, wie z.B. im Falle von Sicherheit...

Liebe Grüße,
Tina
 

strichcode

Nicht mehr ganz neu hier

Uiuiui! Nach dem Video und den Links hab ich Angst. Danke auch für den Buchtipp.

Aaalso. Wenn ich nun die Links
<a href="ausgabe.php?wasauchimmer=lilalaune">sortiert nach PLZ</a>
<a href="ausgabe.php?wasauchimmer=wurstwasser">sortiert nach Ort</a> nenne.
Und
$sortikrit = $_GET['wasauchimmer'];

$abfrage = "SELECT * FROM datenbank WHERE datenbankfeld LIKE 'on'ORDER BY ".$sortkrit."";

oder besser noch
$sortkrit = mysql_real_escape_string( $_POST['wasauchimmer'] );

Bin ich damit erstmal auf einem sichereren Weg unterwegs?

Diese Prepared Statements fand ich a. etwas kompliziert und b. vielleicht übertrieben für meinen Fall, denn ich brauche GET nur für ORDER BY. Wenn ich das richtig verstehe, wären um den sql-befehl schadhaft zu verändern Hochkomma und Anführungszeichen gefährlich....
Oder bin ich da auf dem falschen Pferd?

danke übrigens für die interessante Diskussion.
 

owieortho

Aktives Mitglied

Tipp für hier;
Wenn Du hier Code-Abschnitte postest, dann hilft es, diesen eben als solchen hier im Texteditor einzufügen. Dazu nutzt Du die Schaltfläche "Einfügen" (links neben dem Diskettensymbol). Dann kannst Du, nachdem Du anfangs "Code" auswählst, auswählen, ob Dein einzufügender Code:
  • Allgemeiner Code
  • PHP
  • HTML
  • Javascript
  • CSS
ist.
HTML:
<a href="ausgabe.php?wasauchimmer=lilalaune">sortiert nach PLZ</a>
<a href="ausgabe.php?wasauchimmer=wurstwasser">sortiert nach Ort</a> nenne.
PHP:
$sortkrit = $_GET['wasauchimmer'];
$abfrage = "SELECT * FROM datenbank WHERE datenbankfeld LIKE 'on'ORDER BY ".$sortkrit."";
$sortkrit = mysql_real_escape_string( $_POST['wasauchimmer'] );
Sieht schon besser aus mit der Farbcodierung, oder?!
Wenn Du einer Variable einen alphanumerischen Wert zuweist, dann muss dieser Wert entweder in Hochkommata oder in doppelten Anführungszeichen stehen. Da beißt die Maus keinen Faden ab.
Dein lilalaune Wurstwasser-Beispiel macht es richtig. Ich mache das gerne so, dass meine URL-Codierung "kryptisch" ist:
HTML:
<a href="datei.php?aktion=qwert>Mach dies</a><br />
<a href="datei.php?aktion=asdf>Mach jenes</a><br />
<a href="datei.php?aktion=yxcv>Mach was anderes</a><br />
um es dann so auszuwerten:
PHP:
$wasgeht = $_GET['aktion'];

switch ($wasgeht) {
    case qwert:
        $sql = SELECT foo FROM tabelle_x WHERE .....;
        break;
    case asdf:
        $sql = UPDATE tabelle_y SET spalte=wert WHERE ....;
        break;
    case yxcv:
        $sql = INSERT INTO tabelle_z (spalte, ...) VALUES (wert1, ...);
        break;
   default:
        echo "Das Nichtstun dauert wieder so lange...";
        break;
}
Das ist einfach und übersichtlich erweiterbar und wie Deine Datenbank, Deine Tabellen und die Spalten dort heißen weiß niemand außer Dir.

O.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.616
Beiträge
1.538.358
Mitglieder
67.536
Neuestes Mitglied
QuestionMark
Oben