Was ist an dieser Funktion denn bitte falsch?
Derrik
- php
0 Axel Richter0 Derrik
0 Sven Rautenberg0 Derrik
Guten Morgen Forum,
Also ich habe mir jetzt ein kleine Funktion gebastelt, damit ich schneller und einfacher auf die MySQL-Datenbanken zugreifen kann.
Die sieht so aus:
-------------------------------------
function ctm($was = "get", $wasschreiben = "kdnr" , $schreibenvalues = "$kdnr") {
@mysql_connect("localhost","webXXX","meinpasswort") or die("Die Verbindung zur Datenbank konnte nicht hergestellt werden !<br />\nBitte kontaktieren sie uns !");
//DB wählen
@mysql_select_db("usr_web88_1") or die("Die Datenbank konnte nicht ausgewählt werden !<br />\nBitte kontaktieren sie uns !");
if ($was == "get")
{
$mysql_query_getkundendata = "SELECT * FROM kundendaten WHERE kdnr = '$kdnr' LIMIT 1";
$getkundendata = @mysql_query($mysql_query_getkundendata) or die("Ihre Daten konnten nicht aus der Datenbank gelesen werden !<br />\nVon MySQL angegebener Grund: <b>".mysql_error()."</b>");
$daten = mysql_fetch_assoc ( $getkundendata );
}
elseif ($was=="write")
{
$mysql_query_adduser = "INSERT INTO kundendaten ($wasschreiben) VALUES ($wasschreibenvalues) WHERE kdnr = '$kdnr'";
@mysql_query($mysql_query_adduser) or die("Konnte User nicht anlegen, da ich nichts in die Tabelle schreiben konnte.<br />\nVon MySQL angegebener Grund: <b>".mysql_error()."</b>");
}
global $daten,$getkundendata,$mysql_query_getkundendata;
}
-------------------------------------
Nun bringt mir PHP aber einen Parse Error auf der Zeile,auf der diese Funktion anfängt.
(Also auf der Zeile wo steht
function ctm($was = "get", $wasschreiben = "kdnr" , $schreibenvalues = "$kdnr") {
)
Ich habe extra nochmal nachgeschaut, ich habe vor der Funktion kein falschen parameteroder vergessene Semikolens oder sonstiges, allesläft.
Kann mir vielleicht jemand sagen, was ich da falsch gemacht habe?
Oder darf man nicht _nur_ optionale Parameter reinmachen???
Danke für eure Hilfe. Derrik.
Hallo,
Nun bringt mir PHP aber einen Parse Error auf der Zeile,auf der diese Funktion anfängt.
(Also auf der Zeile wo stehtfunction ctm($was = "get", $wasschreiben = "kdnr" , $schreibenvalues = "$kdnr") {
http://de.php.net/manual/de/functions.arguments.php#functions.arguments.default
function ctm(..., $schreibenvalues = "$kdnr")
^Der Vorgabewert muss ein konstanter Ausdruck sein, darf also (zum Beispiel) keine Variable oder Element einer Klasse sein.
viele Grüße
Axel
Hallo,
Nun bringt mir PHP aber einen Parse Error auf der Zeile,auf der diese Funktion anfängt.
(Also auf der Zeile wo stehtfunction ctm($was = "get", $wasschreiben = "kdnr" , $schreibenvalues = "$kdnr") {
http://de.php.net/manual/de/functions.arguments.php#functions.arguments.default
function ctm(..., $schreibenvalues = "$kdnr")
^Der Vorgabewert muss ein konstanter Ausdruck sein, darf also (zum Beispiel) keine Variable oder Element einer Klasse sein.
Danke, jetzt geht es !
nun hab ich es eben so gemacht:
function ctm($was = "get", $wasschreiben = "quatsch" , $schreibenvalues = "dies ist irgendein wert der keinen sinn hatweil ich irgendwas als defaultfunktion reinmachen muss")
// (...)
man kann natürlich darüber streiten, dass es quatsch ist und unnötig Speicherplatz kostet, aber egal ;-)
Es funktioniert endlich und das ist die Hauptsache ;-)
Moin!
Eingangsfrage: Was ist an dieser Funktion falsch?
Antwort: Viel zuviel, nicht nur der Syntaxfehler.
Im Einzelnen:
function ctm($was = "get", $wasschreiben = "kdnr" , $schreibenvalues = "$kdnr") {
Ist es sinnvoll, wirklich _alle_ Funktionsparameter mit Defaultwerten vorzubelegen? Ist die gewählte Reihenfolge sinnvoll?
Ist es sinnvoll, eine gemeinsame Funktion zum Lesen und Schreiben zu benutzen? Warum nicht _zwei_ Funktionen, eine zum Lesen, und eine zum Schreiben?
@mysql_connect("localhost","webXXX","meinpasswort") or die("Die Verbindung zur Datenbank konnte nicht hergestellt werden !<br />\nBitte kontaktieren sie uns !");
//DB wählen
@mysql_select_db("usr_web88_1") or die("Die Datenbank konnte nicht ausgewählt werden !<br />\nBitte kontaktieren sie uns !");
Örks. Ok, wenn man vorhat, je PHP-Skript nur ein einziges Mal auf seine Datenbank zuzugreifen, dann kann man den DB-Connect auch in die einzige Funktion packen. Aber mehrere Aufrufe der Funktion kosten dadurch unnötig Zeit. Die Verbindung zur Datenbank wird ja nicht in Nullzeit hergestellt.
if ($was == "get")
{
$mysql_query_getkundendata = "SELECT * FROM kundendaten WHERE kdnr = '$kdnr' LIMIT 1";$getkundendata = @mysql_query($mysql_query_getkundendata) or die("Ihre Daten konnten nicht aus der Datenbank gelesen werden !<br />\nVon MySQL angegebener Grund: <b>".mysql_error()."</b>");
$daten = mysql_fetch_assoc ( $getkundendata );
}
elseif ($was=="write"){
$mysql_query_adduser = "INSERT INTO kundendaten ($wasschreiben) VALUES ($wasschreibenvalues) WHERE kdnr = '$kdnr'";
@mysql_query($mysql_query_adduser) or die("Konnte User nicht anlegen, da ich nichts in die Tabelle schreiben konnte.<br />\nVon MySQL angegebener Grund: <b>".mysql_error()."</b>");
}
Hier ist der eigentliche Grund, warum man lieber zwei Funktionen machen sollte, statt einer Universalfunktion.
Die Leseroutine benötigt nur einen einzigen Parameter, nämlich die Kundennummer. Trotzdem muß man die Funktion dafür mit "ctm('get','1234')" aufrufen. Eine Funktion "get_kd('1234')" wäre viel schneller geschrieben.
Umgekehrt ist das Schreiben von neuen Kundeneinträgen in der Funktion selbst ziemlich knapp abgewickelt - dafür muß man außerhalb der Funktion dann heftig arbeiten, obwohl das auch komplett in einer Schreibfunktion erledigt werden könnte. Es wäre beispielsweise kein Problem, den kompletten zu schreibenden Datensatz als _ein_ Array zu übergeben:
$datensatz = array(
'name' => 'Müller',
'vorname' => 'Hans'
//...
)
put_kd($datensatz)
Solch ein Array liefert die jetzige ctm-Funktion und künftige get_kd-Funktion ja aus MySQL schon zurück.
Die Schlüssel werden zu DB-Feldern, und die Werte dann eingefügt.
global $daten,$getkundendata,$mysql_query_getkundendata;
global zu benutzen ist Ultraböse.
}
Zusammengefaßt: Du hast eine Funktion, aus der du besser zwei Funktionen machst, und die dann noch verbessert werden sollten hinsichtlich ihrer Aufgaben.
- Sven Rautenberg
Tach,
Eingangsfrage: Was ist an dieser Funktion falsch?
Antwort: Viel zuviel, nicht nur der Syntaxfehler.
Hmmm, ich denke, jeder hat so seine Vorstellung, was man anders machen könnte, nenne mir ein Script, wo niemand was zu verbessern finden würde ;-)
Im Einzelnen:
function ctm($was = "get", $wasschreiben = "kdnr" , $schreibenvalues = "$kdnr") {
Ist es sinnvoll, wirklich _alle_ Funktionsparameter mit Defaultwerten vorzubelegen? Ist die gewählte Reihenfolge sinnvoll?
ja, die Reihenfolge ist Sinnvoll.
weil ich muss ja erstmal sagen, was er mache soll, und wenn er nur was rausholen soll, brauche ich die anderen Parameter nicht ;-)
Ist es sinnvoll, eine gemeinsame Funktion zum Lesen und Schreiben zu benutzen? Warum nicht _zwei_ Funktionen, eine zum Lesen, und eine zum Schreiben?
Hmmm, warum denn nicht?
@mysql_connect("localhost","webXXX","meinpasswort") or die("Die Verbindung zur Datenbank konnte nicht hergestellt werden !<br />\nBitte kontaktieren sie uns !");
//DB wählen
@mysql_select_db("usr_web88_1") or die("Die Datenbank konnte nicht ausgewählt werden !<br />\nBitte kontaktieren sie uns !");Örks. Ok, wenn man vorhat, je PHP-Skript nur ein einziges Mal auf seine Datenbank zuzugreifen, dann kann man den DB-Connect auch in die einzige Funktion packen. Aber mehrere Aufrufe der Funktion kosten dadurch unnötig Zeit. Die Verbindung zur Datenbank wird ja nicht in Nullzeit hergestellt.
Ich greife ja auch nur einmal pro "Ausgabeschritt" darauf zu, also macht es keinen Unterschied.
if ($was == "get")
{
$mysql_query_getkundendata = "SELECT * FROM kundendaten WHERE kdnr = '$kdnr' LIMIT 1";$getkundendata = @mysql_query($mysql_query_getkundendata) or die("Ihre Daten konnten nicht aus der Datenbank gelesen werden !<br />\nVon MySQL angegebener Grund: <b>".mysql_error()."</b>");
$daten = mysql_fetch_assoc ( $getkundendata );
}
elseif ($was=="write"){
$mysql_query_adduser = "INSERT INTO kundendaten ($wasschreiben) VALUES ($wasschreibenvalues) WHERE kdnr = '$kdnr'";
@mysql_query($mysql_query_adduser) or die("Konnte User nicht anlegen, da ich nichts in die Tabelle schreiben konnte.<br />\nVon MySQL angegebener Grund: <b>".mysql_error()."</b>");
}
Hier ist der eigentliche Grund, warum man lieber zwei Funktionen machen sollte, statt einer Universalfunktion.
Die Leseroutine benötigt nur einen einzigen Parameter, nämlich die Kundennummer. Trotzdem muß man die Funktion dafür mit "ctm('get','1234')" aufrufen. Eine Funktion "get_kd('1234')" wäre viel schneller geschrieben.
??
Wenn ich was lesen will, muss ich nur die Funktion aufrufen, OHNE irgendwelche Parameter, weil ich $kdnr vor der Funktion schon globalisiert habe...
Umgekehrt ist das Schreiben von neuen Kundeneinträgen in der Funktion selbst ziemlich knapp abgewickelt - dafür muß man außerhalb der Funktion dann heftig arbeiten, obwohl das auch komplett in einer Schreibfunktion erledigt werden könnte. Es wäre beispielsweise kein Problem, den kompletten zu schreibenden Datensatz als _ein_ Array zu übergeben:
$datensatz = array(
'name' => 'Müller',
'vorname' => 'Hans'
//...
)put_kd($datensatz)
Solch ein Array liefert die jetzige ctm-Funktion und künftige get_kd-Funktion ja aus MySQL schon zurück.
??
Wenn ich was schreiben will, ruf ich die einfach so auf:
ctm("write","pass,email","'$neuespasswort','$neueemailadresse'");
Die Schlüssel werden zu DB-Feldern, und die Werte dann eingefügt.
global $daten,$getkundendata,$mysql_query_getkundendata;
global zu benutzen ist Ultraböse.
Warum ?
}
Zusammengefaßt: Du hast eine Funktion, aus der du besser zwei Funktionen machst, und die dann noch verbessert werden sollten hinsichtlich ihrer Aufgaben.
Hmmm, dann muss ich im Script mehr denken, wenn ich dann 2 Funktionen starten muss...
LOL und das Bildchen gefällt mir, also dein posting hat mir etwas geholfen, Dakeschön ;-)