[PHP] Funtion auslagern

asseskiller

Lt. Junior Grade
Registriert
Sep. 2005
Beiträge
447
Hey Leute,

ich hab ma versucht folgende Funtion, die bereits funktioniert hat in eine functions datei auszulagern

PHP:
<?
function verbinden($host, $user, $passwort, $datenbank)
{
$db_link = mysql_connect($host, $user, $passwort);
if($db_link) 
	{
    $status = "<font color='green'><strong><blink>Verbindung wurde mit <strong>MySQL</strong> aufgebaut!!!</blink></strong></font><br />\n";
	if(mysql_select_db($datenbank, $db_link)) 
		{
    	$status.="Die Datenbank ".$datenbank." wurde ausgewählt";
		} 
	else 
		{
       	$status ="<font color='red'><blink>Konnte Datenbank nicht benutzen.</blink></font><br/>\n";
       	$status.="Der Grund dafür: ".mysql_error()."\n";
    	}
	// QUERYS BEGIN
	/*Reihen zählen*/
	$sql = mysql_query("SELECT COUNT(*) FROM $tabelle");
	$res = mysql_fetch_array($sql);
	if ($res[0])
		{$message = "<font color='green'>Es befinden sich ".$res[0]." Datensätze im Handysortiment</font>";}
	else
		{$message = "<font color='red'><blink>Reihen zählen Fehlgeschlagen. Erst fortfahren wenn Problem behoben.</blink></font>";}
	/*Reihen zählen ende*/
	/*Vertragsnamen auslesen*/
	$sql2 ="SELECT name FROM $tabelle ORDER BY hersteller";
	$res2 = mysql_query($sql2);
	/*Vertragsnamen auslesen ende*/
}				
// QUERYS ENDE	
}

?>

unausgelagert sah das ganze so aus:

PHP:
$db_link = mysql_connect($host, $user, $passwort);
if($db_link) 
	{
    $status = "<font color='green'><strong><blink>Verbindung wurde mit <strong>MySQL</strong> aufgebaut!!!</blink></strong></font><br />\n";
	if(mysql_select_db($datenbank, $db_link)) 
		{
    	$status.="Die Datenbank ".$datenbank." wurde ausgewählt";
		} 
	else 
		{
       	$status ="<font color='red'><blink>Konnte Datenbank nicht benutzen.</blink></font><br/>\n";
       	$status.="Der Grund dafür: ".mysql_error()."\n";
    	}
	// QUERYS BEGIN
	/*Reihen zählen*/
	$sql = mysql_query("SELECT COUNT(*) FROM $tabelle");
	$res = mysql_fetch_array($sql);
	if ($res[0])
		{$message = "<font color='green'>Es befinden sich ".$res[0]." Datensätze im Handysortiment</font>";}
	else
		{$message = "<font color='red'><blink>Reihen zählen Fehlgeschlagen. Erst fortfahren wenn Problem behoben.</blink></font>";}
	/*Reihen zählen ende*/
	/*Vertragsnamen auslesen*/
	$sql2 ="SELECT name FROM $tabelle ORDER BY hersteller";
	$res2 = mysql_query($sql2);
	/*Vertragsnamen auslesen ende*/
}				
// QUERYS ENDE

um die funtion aufzurufen hab ich das hier gemacht:

PHP:
include("functions.php");
verbinden($host, $user, $passwort, $datenbank);

aber es kommt dann immer folgender fehler:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\kombinator\functions.php on line 20

woran könnte das liegen?
 
PHP:
mysql_query("SELECT COUNT(*) FROM $tabelle");
...das schlägt fehl, weil in der Funktion $tabelle nicht bekannt bzw. die Variable leer ist. Du müsstest die Variable also mit übergeben oder mit global arbeiten.

MfG, Gobble-G


Edit: Hoppla, im funktionierenden Beispiel war es ja auch eine Funktion. Ich denke aber trotzdem, dass es damit zusammenhängt. Einen Versuch ist es wert.
 
Zuletzt bearbeitet:
doch du hattest wunderbar recht,
ehm eine frage noch
er gibt mir kein $status und kein $message aus. Das liegt sicher daran das die funktion das ganze net weitger gibt wie organisiere ich das?
 
Ganz unschön aber einfach geht das, in dem man diese Variablen ebenfalls global macht.

Schon schöner geht es, wenn man das über ein return macht. Da es zwei Werte sind, würde sich vielleicht ein Array anbieten.

Empfehlen würde ich aber, die Variablen der Funktion schon als Referenz zu übergeben. Nach Abarbeitung der Funktion sind die Variablen dann mit den neuen Inhalten gefüllt.
 
aha also 3 neue fragen

also mit return $staus und return $message hab ich es schon funzt aber net.
1. was mach ich falsch
2. wie würde ich in speziell diesem fall die variablen global machen und
3. wie würde ich in speziell diesem Fall die Variablen per referenz übergeben
 
Es kann nur ein return geben und der zurückgegebene Wert der Funktion muss einer Variablen zugewiesen werden, um ihn nutzen zu können. Beispiel:
PHP:
$status=verbinden(...);
Da du aber zwei Rückgabewerte hast, kannst du sie eigentlich nur über ein Array zurückgeben. Deswegen ist die Variante nicht wirklich schön.

So kannst du die Variablen global machen (Beispiel):
PHP:
global $status;
$status = "<font color='green'>...";
Die Lösung ist aber irgendwie unsauber und trickst das Funktionsprinzip aus.

Deswegen würde ich es wie folgt machen:
PHP:
function verbinden($host, $user, $passwort, $datenbank, &$status, &$message) 
{
 ...
}
Dann rufst du die Funktion mit $status und $message auf. Die Variablen selbst werden dadurch nicht übergeben, aber eben Referenzen auf diese. Somit werden diese (äußeren) Variablen innerhalb der Funktion zugreifbar.
Edit: Optional bietet sich fast immer ein Rückgabewert an. Ein boolean reicht dann schon, um nach dem Aufruf schnell festzustellen, ob die Funktion erfolgreich war oder nicht.
 
Danke Danke

Hab jetzt noch nen neues problem
und zwar gibt er mir den gleiche fehler bei einer anderen Funktion aus:

PHP:
function h_auslesen($host, $user, $passwort, $datenbank, $tabelle)
{

//VERBINDUNG DATENBANK

$db_link = mysql_connect($host, $user, $passwort);
if($db_link) 
	{
	global $status;
    $status = "<font color='green'><strong><blink>Verbindung wurde aufgebaut</blink></strong></font><br />\n";
	if(mysql_select_db($datenbank, $db_link)) 
		{
        $status.="Die Datenbank ".$datenbank." wurde ausgewählt";
		} 
	else 
		{
        $status ="<font color='red'><blink>Konnte Datenbank nicht benutzen.</blink></font><br/>\n";
        $status.="Der Grund dafür: ".mysql_error()."\n";
        }
	// QUERYS BEGIN
	/*Reihen zählen*/
	global $message;
	$sql = mysql_query("SELECT COUNT(*) FROM $tabelle");
	$res = mysql_fetch_array($sql); // <== HIER WIRD DER FEHLER ANGEZEIGT
	if ($res[0])
		{$message = "<font color='green'>Es befinden sich ".$res[0]." Datensätze im Sortiment</font>";
		 global $anz;
		 $anz=$res[0];
		 }
	else
		{$message = "<font color='red'><blink>Reihen zählen Fehlgeschlagen. Erst fortfahren wenn Problem behoben.</blink></font>";}
	/*Reihen zählen ende*/
	/*Vertragsnamen auslesen*/
	global $res2;
	$sql2 ="SELECT name FROM $tabelle ORDER BY name";
	$res2 = mysql_query($sql2);
	/*Vertragsnamen auslesen ende*/
	}
}

Ich weiß absolut nicht woran es liegt.
Ich übergebe alles Ordentlich aber es kommt immer:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\kombinator\functions.php on line 112

Das is quasi der gleich fehler. Ich wäre euch sehr dankbar wenn jemand von euch da mal schauen könnte. Danke
 
Sieht für mich auch erstmal OK aus, aber ich würde mir den Query-String vom mysql_query mal ausgeben lassen (z.B. vor dem mysql_query):
PHP:
print "SELECT COUNT(*) FROM $tabelle";
Könnte ja sein, dass $tabelle nicht richtig gesetzt ist bzw. vorher überschrieben wurde.
 
Zuletzt bearbeitet:
schon probiert

tabelle ist hersteller
die tabelle hersteller gibt es 100% hab ich überprüft

was mich so wundert ist, das es in der funktion die ich am anfang zur debatte gestellt habe funzt.
Liegt es vielleicht daran, das beide in der gleichen datei liegen?

hier das kommt übrigens heraus
SELECT COUNT(*) FROM hersteller
 
Hm, eigenartig. Was mir aber auffällt, ist, dass du die Verbindung zur Datenbank mehrmals aufbaust und nicht beendest (innerhalb einer Funktion). Vielleicht, benutzt PHP deshalb die falsche Verbindungskennung. In dem Fall, sollte es so klappen:
PHP:
mysql_query("SELECT COUNT(*) FROM $tabelle", $db_link);
 
ich hab schon
PHP:
mysql_close($dblink)
eingebaut
und auch mit dieser variante funzts net
 
Das gibts doch nicht. Spuckt mysql_error nach mysql_query vielleicht was aus?

Edit: In deinem Code eben hast du $db_link falsch geschrieben. Ich hoffe mal, im richtigen Quelltext ist es richtig.
 
Zuletzt bearbeitet:
Habs jetzt so abgeändert

PHP:
	$sql = mysql_query("SELECT COUNT(*) FROM $tabelle");
	echo mysql_error();
	$res = mysql_fetch_array($sql);
	echo mysql_error();

und da kommt rein garnix außer der alt bekannte fehler
ich muss jetzt leider ne stunde oder 2 weg
aber ich muss dir echt dolle danken Gobble-G. Ich will nicht rumschleimen aber du hast echt ahnung und antwortest super schnell danke.

Ich lass einfach mal den code der function.php hier:

EDIT: Ich weiß woran es lag es war nen falscher datenbank name weil ich was aus nem alten script rauskopiert habe danke man

Danke
 
Zuletzt bearbeitet:
Ah, sehr schön!



asseskiller schrieb:
Habs jetzt so abgeändert

PHP:
	$sql = mysql_query("SELECT COUNT(*) FROM $tabelle");
	echo mysql_error();
	$res = mysql_fetch_array($sql);
	echo mysql_error();
Das hattest du auch in der falschen Funktion gemacht. Nämlich genau in der, in der der Fehler nicht auftrat.

Aber egal...
 
Zurück
Oben