jochem
Goto Top

Verständnisfrage mit PHP auf eine MySQL-Datenbank zugreifen und Parameter an PHP-Scripte übergeben

Moin zusammen,

ich bastel gerade an einer privaten HP, bei der ich Daten aus einer MySQL-Datenbank auslesen und anzeigen möchte. Dabei blick ich im Augenblick nicht so richtig durch, was wo hin muß. Mal im Einzelnen:

- Laut einiger Tutorials soll man sich häufig wiederholende Aktionen in eine Datei schreiben und diese Datei dann per include-Befehl in die Seite einbinden. Eine dieser sich wiederholenden Aktionen ist das Zugreifen auf eine Datenbank. Vorgeschlagen wird das Erstellen einer dbconnect.php, in welcher der Server, der zugriffsberechtigte User sowei das Passwort stehen.

<?php
mysql_connect("localhost", "MyDBUser","MyDBPass") or die ("Keine Verbindung zur Teilenummern-DB moeglich");  
mysql_select_db("MyDB") or die ("Die Datenbank 'Teilenummern' existiert nicht.");  
?>

Soweit kein Problem, die Datei wurde nach Mustervorgabe erstellt. Nur steht in der Datei ja der Benutzername und das Passwort in Klartetext drin. Also kann Jeder, der irgendwie Zugriff auf den Webspace bekomt, diese Datei auch auslesen. Ok, also werde ich einen DB-User anlegen, der nur über Leserechte verfügt. Trotzdem macht es mich nicht gerade glücklich, daß dort Klartext-Informationen gespeichert sind. Nun kann ich ja das Verzeichnis, in welchem sich doe PHP-Schnipsel befinden, per .htaccess-Datei mit einem Paßwortschutz belegen. Nur ist nicht so toll, daß jetzt auch jedesmal eine Benutzerabfrage kommt, wenn die Seite mit der include-Datei aufgerufen wird. Hmmm, Denkfehler, oder wie habt ihr das Problem (falls es sich als solches darstellt) gelöst?

- Ich gehe mal davon aus, daß der "Servername" in der dbconnect.php den Server aus Sicht des Servers meint (also "localhost") und nicht aus der Sicht des Client (also "wwww.meinehp.de"). Ist das so korrekt?
Wenn JA, wo werden dann die Fehlermeldungen angezeigt? Derzeit erhalte ich weder Fehlermeldungen beim Zugriff, noch werden mir irgendwelche Daten angezeigt, wenn ich die DB per SQL-Statement abfrage:

<?php

include "../../../../../../php_includes/dbconnect.php"  

$hgrp = $_POST["hgrp"];  
$ugrp = $_POST["ugrp"];  

# $abfrage = "SELECT * FROM tnr_01 WHERE hgrp == $hgrp AND ugrp == $ugrp"; 
$abfrage = "SELECT * FROM tnr_01;  
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
   {
   echo "$row->tafel, $row->bild, $row->pos, $row->erg, $row->typ, $row->grp, $row->art, $row->erw, $row->col, $row->bez, $row->bem, $row->mdl, $row->pic <br>";  
   }
?>

Die Tabelle in der DB heißt "tnr_01" und ist auch mit sechs Datensätzen gefüllt. Also sollte schon etwas angezeigt werden.

- Die Variablen "$hgrp" und "$ugrp" will ich in einem weiteren Schritt bei der Übergabe an diesen PHP-Schnipsel füllen. Dazu soll über das Feld "Hauptgruppe" alle zugehörigen Untergruppen aufgelistet werden, um dann gezielt je Untergruppe die Teilenummern auszugeben. Da die Datenbank relativ statisch sein wird, könnte ich die Abfragen hier auch "fest verdrahten", aber so Gruppenwechsel-Lösungen sind halt schicker.
Im Prinzip soll es also später so aussehen:
- DB lesen und alle Hauptgruppen ausgeben
- Aufgrund getroffener Auswahl zu der Hauptgruppe alle Untergruppen lesen und anzeigen
- Wenn eine Untergruppe gewählt wurde, die Teilenummern der Untergruppe lesen und ausgeben
Wo es noch gedanklich klemmt, ist, wie ich eine getroffene Auswahl an eine PHP-Datei übergebe. Kann ich die So einfach mit ? an den Aufruf der include-Seite dranhängen?
Beispiel:
Es wurde die Dritte Hauptgruppe ausgewählt. Also soll "3" und "0" an das PHP-Script übergeben werden, welches jetzt die Untergruppen zur Hauptgruppe 3 auflistet.
include "meinPHPScript.php?3,0  
Wenn wiederum aus den Untergruppen die sechste Untergruppe ausgewählt wurde, soll das Script mit "3" und "6" aufgerufen werden.
include "meinPHPScript.php?3,6  

Ich weiß, das ist alles noch sehr holperig und sieht vielleicht auch nicht so toll aus, aber ich bin noch ziemlich unbedarft, was PHP und MySQL angeht. Nur stoße ich mittlerweile mit meinen HTML-Fähigkeiten an Grenzen, so daß ich mich mit dem Thema "Datenbanken" befassen muß (und will). Habt ihr ein paar Ideen für mich, damit es mit der Seite weitergeht?

Gruß J face-smile chem

Content-ID: 194471

Url: https://administrator.de/contentid/194471

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

aqui
aqui 19.11.2012 um 10:56:15 Uhr
Goto Top
Bist du sicher das du damit hier in der richtigen Rubrik bist ??
Normalerweise gehört das doch unter "Entwicklung - PHP" (wohin du es mit einem Klick auf "Bearbeiten" auch selber verschieben kannst...!!)
SlainteMhath
SlainteMhath 19.11.2012 um 10:59:09 Uhr
Goto Top
Moin,

recht ausführliche Frage face-smile

Nur steht in der Datei ja der Benutzername und das Passwort in Klartetext drin. Also kann Jeder, der irgendwie
Zugriff auf den Webspace bekomt, diese Datei auch auslesen
damit musst Du bei PHP leben. Und richtig, jeder der auf Dateisystemebene zugriff hat kann die Datei lesen. Über den Webserver ist dich aber nicht möglich, da hier das PHP Script ja interpretiert wird.

Ich gehe mal davon aus, daß der "Servername" in der dbconnect.php den Server aus Sicht des Servers meint
Richtig. Das Script wird ja am Server ausgeführt und nicht im Browser.

Standard-Belehrung:
$ugrp = $_POST["ugrp"];
$abfrage = "SELECT * FROM tnr_01 WHERE hgrp == $hgrp AND ugrp == $ugrp";
So ein Code ist anfällig für SQL-Injections. Was, wenn $hgrp den Wert
'); drop table tnr_01; --  
annimmt? Daher variablem immer "escapen" z.b. mit mysql_realescape().

include "meinPHPScript.php?3,0  

Das klappt so nicht.
Wenn die PHP-Datei per HTML-Form aufgerufen wird, dann stehen die Formularvariablen im $_POST-Array.
Wenn du die PHP Datei per Link aufrufst, muss der etwa so "datei.php?hgrp=1&ugrp=0" aussehen. Die Werte stehen dann im $_GET-Array.
Wenn die Datei include'd wird, dann kannst Du die bereits deklarierten Variablen, sofern im gleichen Scope, benutzen.

lg,
Slainte
bytecounter
bytecounter 19.11.2012 um 11:06:15 Uhr
Goto Top
Moin,

Du kannst die Zugangsdaten für die DB auch verschlüsselt speichern; dann musst Du sie eben vor der Übergabe entschlüsseln. Da aber jeder, der Deine Zugangsdaten im Klartext auch den gesamten Code sehen kann, hast Du eh ein anderes Problem...Die DB sollte auch diesen Benutzer nur von diesem speziellen Host zulassen.

Bei mir liegen diese PHP-Dateien außerhalb des Webspace, damit sind sie definitiv nicht über den Apache zu erreichen. Includen kann man sie recht einfach, dazu reicht es, den relativen Pfadnamen anzugeben. Da die DB aber in deinem Fall wohl zwingend erforderlich ist, solltest Du mit require bzw. require_once arbeiten (s. require()).

Des Weiteren solltest Du die POST-Variablen nicht ungefiltert übernehmen. Das wäre ein Einfallstor.

Bezüglich Übergabe brauchst Du kein include sondern da sind Funktionen die richtige Wahl: Funktionen in PHP

Das soll für's erste genügen und ich warte auf die nächsten Fragen ;)

vg
Jochem
Jochem 19.11.2012 um 11:09:37 Uhr
Goto Top
Moin,

@aqui,
OK, gemacht.

Gruß J face-smile chem
AB-Sys
AB-Sys 19.11.2012 um 11:11:08 Uhr
Goto Top
Hi Jochem,

das sind ziemlich viele Fragen. Ich empfehle dir, dir ein Buch zu kaufen und dir den Umgang mit PHP und MySQL damit beizubringen, da das erfahrungsgemäß mehr bringt, als sich einzelne Informationen aus dem Internet zusammenzusuchen.

Nichts desto trotz:

Soweit kein Problem, die Datei wurde nach Mustervorgabe erstellt. Nur steht in der Datei ja der Benutzername und das Passwort in
Klartetext drin. Also kann Jeder, der irgendwie Zugriff auf den Webspace bekomt, diese Datei auch auslesen. Ok, also werde ich
einen DB-User anlegen, der nur über Leserechte verfügt. Trotzdem macht es mich nicht gerade glücklich, daß
dort Klartext-Informationen gespeichert sind. Nun kann ich ja das Verzeichnis, in welchem sich doe PHP-Schnipsel befinden, per
.htaccess-Datei mit einem Paßwortschutz belegen. Nur ist nicht so toll, daß jetzt auch jedesmal eine Benutzerabfrage
kommt, wenn die Seite mit der include-Datei aufgerufen wird. Hmmm, Denkfehler, oder wie habt ihr das Problem (falls es sich als
solches darstellt) gelöst?

Du kannst das Passwort in eine Datei auslagern, die nicht über den Webserver erreichbar ist.
Beispiel: Dein Document-Root liegt auf /var/www/meineSeite
Leg das Passwort in /var/www/meinePasswoerter/datenbank.txt
Du kannst dann in PHP darauf zugreifen, den Inhalt auslesen und es als Passwort verwenden, allerdings ist der Zugriff über das Web darauf nicht möglich.


- Ich gehe mal davon aus, daß der "Servername" in der dbconnect.php den Server aus Sicht des Servers meint (also
"localhost") und nicht aus der Sicht des Client (also "wwww.meinehp.de"). Ist das so korrekt?
Wenn JA, wo werden dann die Fehlermeldungen angezeigt? Derzeit erhalte ich weder Fehlermeldungen beim Zugriff, noch werden mir
irgendwelche Daten angezeigt, wenn ich die DB per SQL-Statement abfrage:

Ja, das stimmt. Die Fehlermeldungen werden dir standardmäßig im Browserfenster aufgerufen, sprich am Client.
Füge am Anfang deines Codes ein:
error_reporting(E_ALL);
Dann werden alle Fehler ausgegeben.

Im Prinzip soll es also später so aussehen:

back-to-topDB lesen und alle Hauptgruppen ausgeben

back-to-topAufgrund getroffener Auswahl zu der Hauptgruppe alle Untergruppen lesen und anzeigen

back-to-topWenn eine Untergruppe gewählt wurde, die Teilenummern der Untergruppe lesen und ausgeben

Wo es noch gedanklich klemmt, ist, wie ich eine getroffene Auswahl an eine PHP-Datei übergebe. Kann ich die So einfach mit ?
an den Aufruf der include-Seite dranhängen?
Beispiel:
Es wurde die Dritte Hauptgruppe ausgewählt. Also soll "3" und "0" an das PHP-Script übergeben
werden, welches jetzt die Untergruppen zur Hauptgruppe 3 auflistet.
> include "meinPHPScript.php?3,0  
> 
Wenn wiederum aus den Untergruppen die sechste Untergruppe ausgewählt wurde, soll das Script mit "3" und
"6" aufgerufen werden.
> include "meinPHPScript.php?3,6  
> 

Ja, du kannst sowas machen, allerdings nicht in der Form wie du das angibst.
Du kannst grundsätzlich im Browser an die URL Variablen im Format ?variable1=wert1&variable2=wert2
anhängen.
Der Zugriff im PHP-Code findet dann über $_GET['variable1'], etc. statt.

Allerdings verhält sich das mit Includes anders.
Stell dir Includes vor, als würdest du den Inhalt deiner zu inkludierenden Datei in den Quellcode einfügen.
D.h., du kannst die Variablen, die du in "meinPHPScript.php" nutzt, vor dem Include schon definieren und mit Werten belegen.
Diese kannst du dann in dem Script weiterverwenden.

Bitte schau dir auch mal das Thema SQL-Injections an.
http://de.wikipedia.org/wiki/SQL-Injection

Gruß
Jochem
Jochem 19.11.2012 um 11:26:20 Uhr
Goto Top
Moin,

@SlainteMhath

Ok, die Code-Schnipsel waren für mich zunächst mal nur zur Grundlagendiskussion. SQL-Injection ist mir bekannt und werde ich dementsprechend im Echtbetrieb dann auch umsetzen.
Die Parameterübergabe hat sich dann dank Deiner Erläuterung auch geklärt.

Danke bis hierher.

Gruß J face-smile chem
Jochem
Jochem 19.11.2012 um 11:39:21 Uhr
Goto Top
Moin,

@bytecounter,

werde mir das mit require() und den Funktionen mal zu Gemütze führen.

Wegen Webspace: meine HP liegt auf dem Server des ISP im Verzeichnis, das wie die Homepage heißt. Dies ist quasi mein Root-Verzeichnis für die HP. Darunter gibt es ein Verzeichnis "Forum", um das es hier geht. Wenn ich Dich richtig interpretiere, dann soll ich die dbconnect.php auf die gleiche Ebene wie die Homepage legen und darauf dann per "../../../" usw. verweisen?

Jetzt fehlt mir noch der Weg, wie ich an die Auswahl drankomme.
Ich habe in einer Unordered List der Hauptgruppen Einträge stehen, die ich per "a href=Seitenname#Name" auf die zugehörige Liste der Untergruppen verlinke.
Hier wiederum geht es nach demselben Prinzip weiter in die Liste der Teilenummern.
Also muß ich irgendwie erfahren, welcher Eintrag aus der Liste der hauptgruppen gewählt wurde und welcher aus der Liste der Untergruppen. Mit den Werten will ich dann in die Leseroutine der DB starten und gemäß den Vorgaben diese Ausgaben dann anzeigen. Irgendeine Idee?
Ich könnte das jetzt über einen Event-Handler abfragen, aber ich kann nicht garantieren, daß der Anwender Javascript aktiviert hat.

Keine Angst, es werden weitere Fragen kommen, je nachdem, wie ich mit der Umsetzung und der zur Verfügung stehenden Zeit auskomme.

Gruß J face-smile chem
Jochem
Jochem 19.11.2012 um 11:43:51 Uhr
Goto Top
Moin,

@AB-Sys,

Bookware ist nicht falsch, habe ich auch zu Hause liegen, nur muß ich erstmal damit klarkommen, was der Autor so meint, an Erklärungen abgeben zu müssen. Und das deckt sich nicht immer mit meinem Wissensstand.

Bzgl. SQL-Injection habe ich schon weiter oben geschrieben, geht klar. Ebenso die Parameterübergabe. Ob ich das so realisiere, weiß ich jetzt noch nicht. Ich möchte zunächst nur mal wissen, ob der Weg dorthin so möglich ist, oder ob ich mich anderweitig umsehen muß.

Gruß J face-smile chem
nxclass
nxclass 20.11.2012 um 08:26:38 Uhr
Goto Top
Hallo,
schau dir doch mal PDO an. ( http://php.net/manual/de/book.pdo.php ) ... da hast Du das gleich in OPP und das Problem der SQL-Injections wird dir auch abgenommen wenn du die Platzhalter verwendest.

... zu deinem Include-Unfall steht ja schon genug hier.
bytecounter
bytecounter 20.11.2012 um 08:53:31 Uhr
Goto Top
Moin,

da ich das Paket von Deinem Anbieter nicht kenne, kann ich da nichts zur Verzeichnisstruktir sagen. Bei den meisten mir bekannten Providern kann man aber das Webroot verändern. Wenn das bei Dir allerdings nicht möglich ist, müssen die Dateien eben im Webverzeichnis bleiben. Wie bereits von SlainteMhath bereits geschrieben, werden die PHP-Dateien aber ja vom Apache geparst ausgegeben. Auf Grund einer Fehlkonfiguration kann es trotzdem dazu kommen, dass die Dateien 1:1 ausgegeben werden; dann hilft eine .htaccess in dem Verzeichnis - allerdings auch nur, solange diese vom Webserver auch korrekt interpretiert wird (ebenfalls Konfigurationssache). Aus diesem Grund legt man (bzw. zumindest ich face-wink ) wichtige Dateien ausserhalb des Webroots ab. Für eine HP könnte das z. B. so ausschauen:
./public
./config
...

"public" ist hier das Webroot. In "config" stehen die Konfigurationsdateien.

In Deinem Fall liegt das Forum z. B. unter
/public/forum

vg
Bytecounter
Jochem
Jochem 20.11.2012 aktualisiert um 10:28:49 Uhr
Goto Top
Moin,

@nxclass

Include-Unfall ist gut. Dazu mal meine Sicht der Dinge:
Es geht mir hierbei darum, das Prinzip zu verstehen, wie Parameter übergeben werden können. Und dabei ist die von mir aufgezeigte Möglichkeit eine. Daß es dabei zu SQL-Injektionen kommen kann, ist grundsätzlich möglich. Nur in dem hier zur Diskussion stehenden Umfeld halte ich das für unmöglich.
Mein Verständnis dazu: SQL-Injektionen können dann passieren, wenn der Benutzer über ein Eingabefeld Eintragungen vornehmen kann, die dann in der Verarbeitung quasi ungeprüft/unmaskiert weitergegeben werden.
In dem geplanten Ablauf wird aber kein Eingabefeld zur Verfügung gestellt, welches dann entgsprechend verändert werden kann. Insofern sehe ich die "Bedrohung" nicht. Nichts desto trotz, und da gebe ich Dir und den Vorrednern Recht, sollten Eingabefelder auf mögliche SQL-Injektionen untersucht und entsprechend behandelt werden.
Wie ich schon schrieb, soll aus einer Auswahlliste (Hauptgruppen) ein Eintrag selektiert werden. Aufgrund dieses Eintrags wird eine Folgeseite (Untergruppen) angezeigt. Auf dieser Seite kann nun wiederum ein Eintrag ausgewählt werden, was dann zu einer weiteren Seite (Teilenummern) führt. Auf dem Weg von der Hauptgruppe zur Teilenummer ist also nirgendwo eine manuelle Eingabe vonnöten.
Damit stellen sich mir im Augenblick zwei Probleme:
- Wie kann ich feststellen, welche Auswahl jeweils getroffen wurde?
- Wie verzweige ich innerhalb des Forums (Woltlab Burning Board Lite) auf eine Seite, die es im Forum noch nicht gibt? (Gilt derzeit nur für die "Hand am Arm"-Lösung)

Ich habe das Ganze mal "mit der Hand am Arm" auf der Seite www.urquattroforum.de/Forum im Bereich Teilenummern eingestellt.
Was jetzt noch als eigener Bereich dargestellt ist (Hauptgruppe 1 usw.) soll später durch die Datenbank-Auswertung in einem eigenen Frame erscheinen. Sobald dort eine Auswahl getroffen wurde, soll ein weiterer Frame eröffnet werden, in dem die Ergebnisse dargestellt werden. Schlußendlich soll die Seite so aussehen, daß ich oben die Hauptgruppen zur Auswahl habe, darunter öffnet sich bei Auswahl der Hauptgruppe ein Frame mit der Auswahl der zugehörigen Untergruppe. Wurde in der Untergruppe eine Auswahl getroffen, öffnet sich auf der Hauptseite wieder ein Frame, in dem die einzelnen Teilenummern angezeigt werden.
Soweit meine Vorstellungen dazu. ich hoffe, das läßt sich auch so realisieren, oder gibt es alternative Vorschläge für eine Lösung?

Gruß J face-smile chem
Jochem
Jochem 20.11.2012 um 10:32:53 Uhr
Goto Top
Moin,

@bytecounter,

ich werde mal mit meinem Anbieter darüber rden, inwiefern ich das Root-Verzeichnis ändern kann bzw. ob ich die Include-Dateien an einen anderen Ort speichern kann.
Wie ich schon schrieb, ist ab dem Moment, wo die .htaccess-Datei im Verzeichnis der Include-Dateien liegt, auch die DB-Abfrage mit einem Paßwort versehen und läuft nicht.

Gruß J face-smile chem
bytecounter
bytecounter 20.11.2012 um 14:37:50 Uhr
Goto Top
das dürfte aber eigentlich nicht sein, da PHP die Dateien direkt über das Dateisystem lädt.
nxclass
nxclass 26.11.2012 um 14:48:09 Uhr
Goto Top
... versucht du die PHP Dateien über eine Externe URL ein zu binden ? - zB. weil der DB Server wo anders liegt ? - das würde so einiges erklären.

Dann würde ich dir aber empfehlen eine API zu programmieren (für XML o. JSON Datentransfer) und nicht mir include zu arbeiten.
Jochem
Jochem 27.11.2012 um 12:05:16 Uhr
Goto Top
Moin,

nöö, die DB liegt auf demselben Server wie die Scripte.

Aber so langsam glaube ich, daß die von mir genutzte Forensoftware da nicht so arbeitet, wie ich es mir denke. jedenfalls ist wohl PHP-Code im Beitrag selbst nicht erlaubt, so daß die Anweisungen nicht ausgeführt werden. Dann klappt natürlich auch kein include-Befehl oder die Ausgabe von Daten per MySQL-Statements.

Gruß J face-smile chem
bytecounter
bytecounter 27.11.2012 um 12:19:24 Uhr
Goto Top
Im Beitrag selbst darf schon alleine aus Sicherheitsgründen kein PHP-Code gestattet sein! Selbst HTML ist mit Vorsicht zu geniessen. Daher haben die meisten Foren eigene Formatierungstags.

vg
Bytecounter