anpera.net
http://anpera.homeip.net/phpbb3/

2 Funktionen aus Terve (getuser & edituser)
http://anpera.homeip.net/phpbb3/viewtopic.php?f=43&t=4319
Seite 1 von 1

Autor:  MySql [ Sa 09 Feb, 2008 14:59 ]
Betreff des Beitrags:  2 Funktionen aus Terve (getuser & edituser)

Hallo.

Ich habe hier vor ein paar Monaten die zwei Funktionen 'edituser' und 'getuser' gepostet. Daher diese einfach zu viel Code hatten, habe ich beide nochmal neu geschrieben. Nun sind es nur noch 35 Zeilen Code und nur noch eine Funktion für drei verschiedene Dinge. :p

Die Funktion nennt sich 'User' und kann folgende Dinge:

  • Eine Abfrage durchführen, ob der User genug von etwas hat.
  • Den Wert eines Tabellenfelder ändern.
  • Den aktuellen Wert des Tabellenfeldes zurück geben.

Die Funktion hat eigentlich recht wenig Sinn. Doch für Schreibfaule sollte sie genügen.

Funktion User:

$this->bbcode_second_pass_code('', 'function User($step,$field,$value = false,$operator = false) {

global $session;

switch ($step) {

case 'check':

if ($operator == 1) return $session['user'][$field] == $value;
if ($operator == 2) return $session['user'][$field] <= $value;
if ($operator == 3) return $session['user'][$field] >= $value;
if ($operator == 4) return $session['user'][$field] < $value;
if ($operator == 5) return $session['user'][$field] > $value;

break;

case 'change':

if ($operator == 1) return $session['user'][$field] += $value;
if ($operator == 2) return $session['user'][$field] -= $value;
if ($operator == 3) return $session['user'][$field] *= $value;
if ($operator == 4) return $session['user'][$field] /= $value;
if ($operator == 5) return $session['user'][$field] = $value;

break;

case 'callback':

return $session['user'][$field];

break;
}


}')

User('check'...):

$this->bbcode_second_pass_code('', 'if (User('check','gold',5000,1)) {

# true

} else {

# false

}')

User('change'...):

$this->bbcode_second_pass_code('', 'User('change','gold',5000,1);')

User('callback'....):

$this->bbcode_second_pass_code('', 'output('`@Du hast Momentan `^'.User('callback','gold').' Goldstücke`@.');')

Viel Spaß damit.

My.

Ps: Änderungen an Array-Feldern sind derzeit nicht möglich. (prefs,donationsconfig,etc.)

Autor:  Jenutan [ Sa 09 Feb, 2008 17:05 ]
Betreff des Beitrags:  Re: 3 "sinnlose" Funktionen. (User)

Fraglich, ob Beispielcode 1 so funktionieren kann:
$this->bbcode_second_pass_code('', 'if (check('gold') > 5000 || check('gold') == 5000)
{
output('Genug Gold dabei,,,,');
}
else {
output('Nicht genug Gold dabei....');
}')

Mit solch einer Funktion...ohne Rückgabewert...

$this->bbcode_second_pass_code('', 'Function check($what,$ausgabe = false)
{
global $session;
$session['user'][$what];
if ($ausgabe === true)
{
output($session['user'][$what]);
}
}')

:dumm: Naja... wer's braucht... :nene:
:D

Autor:  Eliwood [ Sa 09 Feb, 2008 17:13 ]
Betreff des Beitrags:  Re: 3 "sinnlose" Funktionen. (User)

Yep, Richtig erkannt. Check geht genau... Gar nicht. NUL (\0, 0x00) ist nunmal nie = 5000 oder > 5000, sondern einfach "gar nichts". An deiner Stelle, MySQL, würd ich nochmal die Dokumentation zu Funktionen durchlesen ;)

Autor:  MySql [ Sa 09 Feb, 2008 17:45 ]
Betreff des Beitrags:  Re: 3 "sinnlose" Funktionen. (User)

[........]

Autor:  Eliwood [ Sa 09 Feb, 2008 18:04 ]
Betreff des Beitrags:  Re: 3 "sinnlose" Funktionen. (User)

MySql hat geschrieben:
Wie gesagt alte sinnlose Funktionen.

Obriger Beitrag editiert.


Du solltest wirklich die Doku lesen. Wenn eine Funktion keinen Wert zurück gibt, kann man auch nix in einen String einbauen lassen:
$this->bbcode_second_pass_code('', 'output('Dein Name ist '.check('name').', dein Level ist '.check('level'));')

Ausgabe (Name=Eliwood;Level=15):

Wasili15Dein Name ist , dein Leven ist

Grund: check() gibt selbst bereits mit output die Daten aus (Gibt sie nicht zurück!). Da nun aber output noch nicht beendet wird, werden zuerst die Werte von name und level ausgegeben (Da in check() ein Output drin ist). Wenn du schon sinnlose Funktionen postest, dann bitte auch richtige ;)

http://ch2.php.net/manual/de/language.functions.php

Was du meinst, ist sowas:

$this->bbcode_second_pass_code('', 'Function check($what) {
global $session;
return $session['user'][$what];
}')

Autor:  Drazaar [ Mo 11 Feb, 2008 23:10 ]
Betreff des Beitrags:  Re: 3 "sinnlose" Funktionen. (User)

Das kann man doch auch mit weniger vielen Funktionen machen, wenn man ein drittes Argument einbaut:
$this->bbcode_second_pass_code('', 'function values($field, $op, $value='0') {
global $session;

if($op == '==') {
return $session['user'][$field];
}
elseif($op == '+') {
$session['user'][$field] += $value;
}
elseif($op == '*') {
$session['user'][$field] *= $value;
}
elseif($op == '-') {
$session['user'][$field] -= $value;
}
elseif($op == '/') {
$session['user'][$field] /= $value;
}
}')

Allerdings ist der Aufruf der Funktion jetzt beinahe gleich aufwändig wie wenn man $session['user'] schreiben würde xD

MfG Draz

Autor:  Nightborn [ Di 12 Feb, 2008 00:09 ]
Betreff des Beitrags:  Re: 3 "sinnlose" Funktionen. (User)

wenn das ganze

if
elseif
elseif
.
.
.

jetzt noch ein switch() wäre, säh es nicht nur schöner aus, sondern wär auch schneller =)

Autor:  Drazaar [ Di 12 Feb, 2008 00:45 ]
Betreff des Beitrags:  Re: 3 "sinnlose" Funktionen. (User)

Okay, der geht an dich :D

$this->bbcode_second_pass_code('', 'function values($field, $op, $value='0') {
global $session;

switch($op) {
case '==':
return $session['user'][$field];
break;
case '*':
$session['user'][$field] += $value;
break;
case '*':
$session['user'][$field] *= $value;
break;
case '-':
$session['user'][$field] -= $value;
break;
case '/':
$session['user'][$field] /= $value;
break;
}
}')


Liege ich eigentlich richtig damit, dass man das Ganze nicht auf 2 Abfragen aufteilen könnte? In Scheme könnte man es einfach so schreiben (ohne den ersten Fall für die Ausgabe):

$this->bbcode_second_pass_code('', '(define values
(lambda (field op value)
(op $session['user'][field] value)))')
[[es sei außer Acht gelassen, dass Scheme keine variablen mit $ unterstützt, es diente nur zur Verdeutlichung]]

Ich meien damit, den Operator in einer Variablen abspeichern.
Also ~ so:
$this->bbcode_second_pass_code('', '
$session['user'][$field].$op.$value;')

Ich weiß, dass es nicht geht, aber kann man es irgendwie auf eine solche Weise machen?

Autor:  Eliwood [ Di 12 Feb, 2008 18:51 ]
Betreff des Beitrags:  Re: 3 "sinnlose" Funktionen. (User)

Mit eval - ja. Sonst nein. Und wenn eval die Antwort ist, war die Frage falsch. Normalerweise braucht man eval nicht ;)

Autor:  Drazaar [ Fr 15 Feb, 2008 01:22 ]
Betreff des Beitrags:  Re: 3 "sinnlose" Funktionen. (User)

Also nein ^^
eval, wie es in php.net beschrieben wird (vor allem das Beispielt mit dem Bierglas und dem Namen) leuchtet mir nicht ein...

Autor:  Eliwood [ Fr 15 Feb, 2008 14:06 ]
Betreff des Beitrags:  Re: 3 "sinnlose" Funktionen. (User)

Drazaar hat geschrieben:
Also nein ^^
eval, wie es in php.net beschrieben wird (vor allem das Beispielt mit dem Bierglas und dem Namen) leuchtet mir nicht ein...


$this->bbcode_second_pass_code('', 'eval('echo "Das ist eine Ausgabe, die PHP-Code in PHP-Code ist.";');')

Autor:  MySql [ Mi 15 Jul, 2009 13:24 ]
Betreff des Beitrags:  Re: 2 Funktionen aus Terve (getuser & edituser)

[........]

Autor:  MySql [ Do 16 Jul, 2009 10:08 ]
Betreff des Beitrags:  Re: 2 Funktionen aus Terve (getuser & edituser)

[........]

Autor:  Auric [ Do 16 Jul, 2009 12:56 ]
Betreff des Beitrags:  Re: 2 Funktionen aus Terve (getuser & edituser)

Zum einen: Wozu brauche ich die Funktion getuser? Kapselung ist zwar gut und schon, aber das ist nun wirklich nicht besser als der direkte Zugriff auf $session['user'] - zumal nicht mal auf das vorhandensein des Feldes geprüft wird.

Zum anderen: Deine Beschreibung zu edituser stimmt nicht ganz:
$this->bbcode_second_pass_code('', ' * edituser($session['user']['acctid'],'gold','+',100);
* oder auch:
* $_U = $session['user'];
* edituser($_U,'gold','+',5);')
Es findet keine Prüfung statt, ob $_THIS_USER ein Array oder eine Zahl ist! Dem entsprechend funktioniert das zweite Beispiel nicht!

Und noch ein Hinweis zur Nomenklatur: Das die Variablennamen auf nicht viel Gegenliebe stoßen, hast du ja scheinbar schon gemerkt. Insbesondere da die $_VAR-Notation sonst für superglobals verwendet wird ist das für sich sehr verwirrend.
"getuser" hingegen halte ich für schlicht und ergreifend falsch, da man eben keinen User zurück gegeben bekommt, sondern ein Attribut des derzeit aktiven Spielers. "getPlayerAttribute" oder "getPlayerField" würde ich ja noch verstehen (streng genommen handelt es sich ja um Daten der Spielfigur/des Chars und nicht des Users).

Ist als Anregung zu verstehen.

Auric

Autor:  MySql [ Fr 17 Jul, 2009 16:25 ]
Betreff des Beitrags:  Re: 2 Funktionen aus Terve (getuser & edituser)

[........]

Autor:  MySql [ Sa 27 Mär, 2010 01:46 ]
Betreff des Beitrags:  Re: 2 Funktionen aus Terve (getuser & edituser)

Funktionen geändert / erneuert und gepostet. Wie gesagt, eher sinnlos. ^^

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/