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.
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:
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.
Wenn wiederum aus den Untergruppen die sechste Untergruppe ausgewählt wurde, soll das Script mit "3" und "6" aufgerufen werden.
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 chem
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
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 chem
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 194471
Url: https://administrator.de/contentid/194471
Ausgedruckt am: 21.11.2024 um 21:11 Uhr
16 Kommentare
Neuester Kommentar
Moin,
recht ausführliche Frage
Standard-Belehrung:
annimmt? Daher variablem immer "escapen" z.b. mit mysql_realescape().
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
recht ausführliche Frage
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.Zugriff auf den Webspace bekomt, diese Datei auch auslesen
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$abfrage = "SELECT * FROM tnr_01 WHERE hgrp == $hgrp AND ugrp == $ugrp";
'); drop table tnr_01; --
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
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
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
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:
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:
Dann werden alle Fehler ausgegeben.
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ß
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?
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);
Im Prinzip soll es also später so aussehen:
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.
Wenn wiederum aus den Untergruppen die sechste Untergruppe ausgewählt wurde, soll das Script mit "3" und
"6" aufgerufen werden.
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
>
"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ß
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.
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.
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 ) 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
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 ) 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