Include Abfragen
Gerd
- datenbank
Guten Tag,
ich bin ziemlich neu in PHP und MySQL und habe eine Verständnisproblem.
Bis jetzt hatte ich eine PHP Seite erstellt und ganz am Anfang die Verbindung und Abfragen erstellt, dann den HTML sowie PHP Code.´
Kann ich eine Seite erstellen, wo ich nur die MYSQL Verbindung und Abfragen habe und diese dann mit include (oder besser require_once ?) in das PHP / HTML Script einbinde?
Wenn ich zum Beispiel 4 PHP Seiten, jede hat Abfrage1 und 2(sind total gleich) nur die 3. Abfrage ist in jeder Seite unterschiedlich.
So das ich insgesamt 6 Abfragen habe. Kann ich alle 6 in ein script auslagern, das dann einbinden, so das auf jeder Seite, jeweils 3 Abfragen in "leere laufen" ?
Wie gesagt das ist für mein Verständnis.
Vielen Dank
GK
Hello Gerd,
Kann ich eine Seite erstellen, wo ich nur die MYSQL Verbindung und Abfragen habe und diese dann mit include (oder besser require_once ?) in das PHP / HTML Script einbinde?
Du kannst Dein Programm in PHP vollkommen modular aufbauen, und immer nur die benötigten Teile für jede Seite dazuladen. Das lohnt sich aber erst, wenn es größer wird, oder größer werden soll.
Dabei sollten alle Daten, die nichts für Normaluser bestimmt sind (Passworte, Konfigurationen, etc) möglichst außerhalb der DOCUMENT_ROOT gespeichert werden. Je nachdem, wie Dein Webspace eingerichtet ist, kann es allerdings sein, dass er nur aus der DOCUMENT_ROOT besteht, und Du nicht auf andere Bereiche des Filesystems zugreifen kannst.
Dann kannst Du die schutzwürdigen Daten immer noch in einer .htaccess Datei ablegen, sofern diese vom System und vom Admin unterstützt werden.
Wenn das auch nicht geht, mache zumindest *.php-Dateien (üblich ist auch *.inc.php) aus deinen einzubindenen Dateien. Und richtig: require_once() ist für Passwort- und Konfigurationsdateien besser. include_once() benutzt man dann, wenn das Script auch ohne Erfolg, also wenn das Einbinden fehl schlug, weiterlaufen soll.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo Tom,
danke für die prompte Antwort.
Vielleicht findet sich noch wer für den 2 Teil meines Problems :)
Grüße zurück aus Brandenburg
echo $begrüßung;
Kann ich eine Seite erstellen, wo ich nur die MYSQL Verbindung und Abfragen habe und diese dann mit include (oder besser require_once ?) in das PHP / HTML Script einbinde?
Du möchtest keine "Seite", sondern nur eine Datei mit PHP-Code.
Ja, aber anstatt mehrere Dateien zu erstellen, die jeweils nur eine Abfrage enthalten, und diese dann nach Bedarf zu inkludieren, bietet es sich an, die Abfragen in Funktionen unterzubringen. Die Funktionen können alle in der gleichen Datei stehen, die von allen Seiten-Scripten inkludiert werden kann. Jedes Seiten-Script ruft dann die Funktionen auf, die es braucht. Die anderen bleiben unausgeführt.
Wenn ich zum Beispiel 4 PHP Seiten, jede hat Abfrage1 und 2(sind total gleich) nur die 3. Abfrage ist in jeder Seite unterschiedlich.
So das ich insgesamt 6 Abfragen habe. Kann ich alle 6 in ein script auslagern, das dann einbinden, so das auf jeder Seite, jeweils 3 Abfragen in "leere laufen" ?
Z.B. so:
datenbank.inc.php:
<?php
function abfrage1() {
...
return $ergebnis;
}
function abfrage2() {
...
return $ergebnis;
}
function abfrage3() {
...
return $ergebnis;
}
...
?>
----------
seite1.php:
<?php
echo abfrage1();
echo abfrage2();
?>
----------
seite2.php:
<?php
echo abfrage1();
echo abfrage3();
?>
echo "$verabschiedung $name";
Hallo dedlfix,
danke, genau das was ich suchte gesucht.
Gruß Gerd
Hallo dedlfix,
Sorry ist noch früh.... das mysql_free_result muss dann auch in eine Funktion ans ende der php Datei ? Kann man natürlich auch so ans ende schrieben, oder?
danke, genau das was ich suchte.
Gruß Gerd
Hello,
Sorry ist noch früh.... das mysql_free_result muss dann auch in eine Funktion ans ende der php Datei ? Kann man natürlich auch so ans ende schrieben, oder?
Das Resultset wieder freigeben sollte man immer dann, wenn man es nicht mehr benötigt. So früh wie möglich.
Und wenn Du es innerhalb einer Funktion aufbaust, musst Du es auch i.d.R. innerhalb der Funktion wieder freigeben. Wenn Dir nämlich das Handle verlorengeht, weil Du es nicht aus der Funktion mit herausgenommen hast, hast Du ein sogenanntes "Lost Handle" (-->Google) und kannst den Speicher nicht mehr freigeben. Gilt für Dateien, die man öffnet, genauso.
Am Ende eines Scriptes gibt PHP das dann automatisch wieder frei, aber soweit kommt man bei größeren Aufgaben dann eventuell gar nicht, weil der Speicher schon vorher verbraucht ist.
In der Praxis kommt sowas eigentlich meistens nur bei Selects (und fopen() ) vor, die man in Schleifen abarbeiten lässt.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo,
jetzt klappt es:
Funktionsseite:
<?php
function abfrage() {
$verbindung =mysql_connect("localhost", "root","");
mysql_select_db('duva_online_db_pdm' ,$verbindung);
$sqlabfrage = @mysql_query("SELECT * FROM sb");
if (!$sqlabfrage){
echo ("Fehler bei der Ausführung der Abfrage Sachbearbeiter ");
exit();
}
return $sqlabfrage ;
}
?>
Ausgabeseite:
<?php
$ausgabe =abfrage() ;
$anzahl = mysql_num_rows($ausgabe);
echo '<br>'.$anzahl;
while($row_abfrage = mysql_fetch_assoc($ausgabe)) {
echo '<br>'.$row_abfrage['name'].' '.$row_abfrage['vorname'];
}
?>
Ich hoffe das ist korrekt, funktioniert aber.
Danke und Grüße der Gerd
echo $begrüßung;
Sorry ist noch früh.... das mysql_free_result muss dann auch in eine Funktion ans ende der php Datei ? Kann man natürlich auch so ans ende schrieben, oder?
Meine Empfehlung ist, den Datenzugriff komplett zu kapseln, inklusive Aufbau der Verbindung zur Datenbank und Abschluss derselben. Dabei kommt es sicherlich zu Dopplungen. Die einzelnen Funktionen werden sich mehr oder weniger nur durch den Zusammenbau des SQL-Statements unterscheiden. Hier wäre es sinnvoll, für den Datenbankzugriff noch eine generelle Funktion zu erstellen, die ein SQL-Statement entgegennimmt und ein abgefragtes Ergebnis zurückgibt. Die kümmert sich dann auch um mysql_free_result() und andere Aufräumarbeiten. Die anderen Funktionen bauen das SQL-Statement zusammen, rufen damit die generelle SQL-Funktion auf und bearbeiten gegebenenfalls noch das Ergebnis nach.
Aber mal abgesehen von dieser Arbeitsverteilung: Es ist natürlich löblich, wenn du dich um das Aufräumen nicht mehr genutzter Ressourcen kümmerst, doch ganz so wichtig ist das bei eher kleinen Scripten und kleinen Datenmengen nicht, da PHP beim Beenden des Scripts sowieso aufräumt. Wichtiger ist, dass du die Datenbankverbindung nicht ständig auf- und wieder abbaust, das kostet nur unnötig Ressourcen auf beiden Seiten, MySQL und PHP. Hier schlage ich vor, dass die generelle SQL-Funktion sich die einmal geöffnete Verbindung merkt. Dafür eignet sich eine statische Variable.
function sql($sql) {
static $connection = null;
if (!is_ressource($connection)) {
$connection = initialisierung;
if (! $connection)
fehlerreaktion;
}
$result = query_und_fetchen($sql);
// am ende kein mysql_close();
// mysql_free_result() ist aber ok.
return $result;
}
echo "$verabschiedung $name";
Hallo, (auch zwei die früh unterwegs sind)
ich werde die Ratschläge beherzigen und habe das auch schin mal getestet. Aber zwei Punkte sind mir noch unklar.
Funktionsseite:
<?php
function abfrage1() {
$verbindung =mysql_connect("localhost", "root","");
mysql_select_db('dodp' ,$verbindung);
$abfrage = @mysql_query("SELECT * FROM sb");
$row_abfrage = mysql_fetch_assoc($abfrage);
$totalRows_abfrage = mysql_num_rows($abfrage);
if (!$abfrage){
echo ("Fehler bei der Ausführung der Abfrage Sachbearbeiter ");
exit();
}
while($row_abfrage = mysql_fetch_assoc($abfrage)) {
echo $row_abfrage['vorname'].' '.$row_abfrage['name'];;
echo ' <br>';
}
return $ergebnis;
}
?>
Ausgabe Seite:
<?php require_once('abfrage.php'); ?>
<?php
$abfrage1 =abfrage1() ;
echo $abfrage1;
?>
Das klappt
Wenn ich aber die Ausgabesiete um das while erweitere (und aus der Funktionsseite enferne)
<?php
$abfrage1 =abfrage1() ;
echo $abfrage1;
while($row_abfrage = mysql_fetch_assoc($abfrage)) {
echo $row_abfrage['vorname'].' '.$row_abfrage['name'];;
echo ' <br>';
}
?>
bekomme ich folgende Fehlermeldung:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in
Ich hatte angenommen ich rufe die funktion einmal auf und kann dann (zum Beispiel) $row_abfrage['vorname'] sooft und an jeder stelle meiner php Datei nutzen wie ich will.
Was mach ich da nicht richtig?
Eine 2. Frage , wenn ich jetzt weitere Abfragen erstellen möchte, kan ich mir doch
$verbindung =mysql_connect("localhost", "root","");
mysql_select_db('dodp' ,$verbindung);
sparen?
Sorry, aber in den Buch was ich habe- PHP und My SQL Schritt für Schritt zur Datenbank gestützen Webseite ist das ein bisschen schwer verständlich.
Grüße der Gerd
echo $begrüßung;
ich werde die Ratschläge beherzigen und habe das auch schin mal getestet. Aber zwei Punkte sind mir noch unklar.
Funktionsseite:
<?php
function abfrage1() {
$verbindung =mysql_connect("localhost", "root","");
mysql_select_db('dodp' ,$verbindung);
$abfrage = @mysql_query("SELECT * FROM sb");
$row_abfrage = mysql_fetch_assoc($abfrage);
$totalRows_abfrage = mysql_num_rows($abfrage);
if (!$abfrage){
echo ("Fehler bei der Ausführung der Abfrage Sachbearbeiter ");
exit();
}
while($row_abfrage = mysql_fetch_assoc($abfrage)) {
echo $row_abfrage['vorname'].' '.$row_abfrage['name'];;
echo ' <br>';
}
return $ergebnis;
}
Wo kommt denn $ergebnis her? Du musst nur dann ein Ergebnis zurückgeben, wenn du eins erzeugst. Wenn du die Ausgabe (echo) gleich in der Funktion vornimmst, dann ist ja alles schon erledigt und es gibt nichts mehr zum zurückgeben. Ob es allerdings klug ist, dass die Funktion gleich die abgefragten Daten ausgibt steht auf einem anderen Blatt. Meiner Meinung nach sollte es die Aufgabe der Funktion sein, die Datenbank abzufragen, und das Abfrageergebnis zurückzuliefern. Die Ausgabe sollte nicht mehr ihre Aufgabe sein. Wenn du später dein Projekt erweiterst, und die gleich Daten in einem anderen Zusammenhang brauchst, wie realisierst du das dann? Kopierst du dir die Funktion und änderst die echo-Befehle? Damit hast du die Funktion wieder doppelt rumliegen. Oder rufst du sie in dem neuen Script einfach wie schon bisher auf und lässt du nur dem zurückgegebenen Ergebnis eine andere Behandlung angedeihen? (Diese Fragen solltest du nur mal für dich beantworten.)
$abfrage1 =abfrage1() ;
echo $abfrage1;
Da in $ergebnis nichts zum Zurückgeben steht, kann es hier auch keine Ausgabe erfolgen. Das fällt aber nicht weiter auf, weil die Ausgabe ja schon innerhalb der Funktion per echo erfolgte.
Wenn ich aber die Ausgabesiete um das while erweitere (und aus der Funktionsseite enferne)
<?php
$abfrage1 =abfrage1() ;
echo $abfrage1;
while($row_abfrage = mysql_fetch_assoc($abfrage)) {
$abfrage ist eine Variable, die nur innerhalb der Funktion zur Verfügung steht. Außerhalb sind Variablen, die in einer Funktion definiert wurden nicht vorhanden. Die einzigen Schnittstellen von Funktionen sind im Idealfall die übergebenen Parameter in die Funktion hinein und das Rückgabeergebnis aus der Funktion heraus. Andere Möglichkeiten wie Referenzen und das Schlüsselwort global sollte man nach Möglichkeit ignorieren.
Wenn du einmal das Ergebnis gefetcht hast, musst du erst den "Fetch-Zeiger" wieder zurücksetzen, um die Daten erneut abfragen zu können, doch das ist keine gute Idee, weil du damit den Datenbankzugriff über mehrere Quelltext-Teile verteilst. Anstatt die Daten beim Fetchen gleich auszugeben kannst du sie erstmal in einem Array sammeln, welches du beliebig oft durchlaufen kannst.
Eine 2. Frage , wenn ich jetzt weitere Abfragen erstellen möchte, kan ich mir doch
$verbindung =mysql_connect("localhost", "root","");
mysql_select_db('dodp' ,$verbindung);
sparen?
Ja, dafür gab ich dir gestern schon den Hinweis auf die statische Variable.
echo "$verabschiedung $name";