Zum Inhalt springen

Habe ich hier ein Datenbank-Problem?

Erstellt am 5. Dezember 2006 · 8 Antworten · letzte Antwort am 12. Dezember 2006

Tags: Frontend-Benutzer, Datenbank, Frage

El_Rolando ·

Hallo Forum,

Ich habe eine Extension geschrieben welche Lokal auch bereits funktioniert! Als ich sie aber online installierte funktionierte sie nicht mehr richtig!
(Die Berücksichtigung der usergroup wird ignoriert!?)

Ziel:, bzw. die zu erfüllenden Bedingungen:
1. Fall)
Falls $wert1 == ’Vorgabe’ && $wert2 == 100 && $usergroup == 4
-> dann wechsle FE User Group zu ID=5
Sonst falls $wert1 == ’Vorgabe’ && $wert2 == 100
-> dann wechsle FE User Group zu ID=3

2. Fall)
Falls $wert1 == ’Vorgabe’ && $wert2 == 200 && $usergroup == 3
-> dann wechsle FE User Group zu ID=5
Sonst falls $wert1 == ’Vorgabe’ && $wert2 == 200
-> dann wechsle FE User Group zu ID=4

3.) Falls $wert1 == ’Vorgabe’ && $wert2 == 300 dann wechsle FE User Group zu ID=5
4.) Sonst auf eine Errorseite!?

Hier zur verdeutlichung ein Auszug aus den PHP der Extension:
(Meine "Problemstellen" habe ich zur Verdeutlichung mit ***** markiert!!)

.....
    $status = $_POST['status'];
    $amount = $_POST['amount'];
    $userid = $_POST['userid'];
*************************************************************************
    $ugroup = $GLOBALS['TSFE']->fe_user->user['usergroup'];
*************************************************************************

if ($status == 'success'  &&  $amount == 100  *****&&  $ugroup == 4*****) {  $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>5 ));
          header("Location: index.php?id=5");

} elseif ($status == 'success'  &&  $amount == 100) {          $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>3 ));
          header("Location: index.php?id=5");

} elseif ($status == 'success'  &&  $amount == 200  ***** && $ugroup == 3*****) {          $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>5 ));
          header("Location: index.php?id=5");

} elseif ($status == 'success'  &&  $amount == 200) {         $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>4 ));
          header("Location: index.php?id=5");

} elseif ($status == 'success'  &&  $amount == 300) {          $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>5 ));
          header("Location: index.php?id=5");

} elseif ($status == 'error') {
          header("Location: index.php?id=24");
        
} else {
......

Da es lokal funktionierte und auch online ohne die mit *** markierten Änderungen... so denke ich, dass die Bedingungen eigentlich okay sind, und das Problem an der $ugroup liegt!? Diese werden nun online nicht mehr richtig interpretiert!!

Könnte es sich hier um ein Problem mit der Datenbank handeln?
Ich habe nämlich folgendes bemerkt:

Lokal habe ich Apache und MySQL.
Wenn ich mir hier mit phpMyAdmin die Datenbank anzeigen lasse, so enthält die Spalte usergroup Werte als Zahlen.
Also z.B. usergroup = 3

Online handelt es sich um einen ISS und wie mir ist auch MySQL als DB.
Wenn ich mir hier aber mit phpMyAdmin die Datenbank anzeigen lasse, so enthält die Spalte usergroup keine Werte als Zahlen sondern steht da:
[BLOB - 1 Bytes] bei einem Eintrag und...
[BLOB - 0 Bytes] bei keinem Eintrag!?

...ansonsten sind die beiden Einträgen aber identisch:
FELD: usergroup
TYP: tinyblob
ATTRIBUTE: BINARY
NULL: Nein

Was ist denn hier das Problem?
Kann man die Datenbank umstellen, so das richtige Werte ausgegeben werden? Oder wie müsste man die Zeile...
$ugroup = $GLOBALS['TSFE']->fe_user->user['usergroup'];
...umschreiben, damit es auch mit diesen BLOB-Einträgen funktioniert??

steffenk ·

1. - Du kannst phpmyadmin so einstellen, das er Dir den Inhalt von blob anzeigt
oder Du nimmst mysqldumper

2. Du vergisst das es auch ein cache gibt. Wenn Du das Userobjekt in der DB änderst, musst Du auch das Userobjekt ändern:

if ($status == 'success'  &&  $amount == 100  *****&&  $ugroup == 4*****) {    $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>5 ));
  $GLOBALS['TSFE']->fe_user->user['usergroup']=5;
  header("Location: index.php?id=5");
}
El_Rolando ·

Hi steffenk,

Danke für den Tipp! Also, ich habe folgendes gemacht:

1. Ich habe jetzt mal in der config.inc.php...
$cfg['ShowBlob'] = TRUE; ...auf TRUE umgestellt.

Unter PHPMyAdmin werden mir nun die Usergruppen wie gewünscht in Werten ausgegeben.

2. Auch die Ergänzungen...
$GLOBALS['TSFE']->fe_user->user['usergroup']=*;
habe ich gemacht!?

Aber leider funktioniert es online immer noch nicht wie gewünscht!
Er wechselt zwar die Gruppe, gemäss den Bedingungen aber...
die Überprüfung der Usergroup wird irgendwie nicht gemacht!
D.h. für einen User der Gruppe 4 mit success und Amount=100 wird in die Usergroup auf 3 umgestellt und nicht wie gewünscht auf 5!?

Ich blicke irgendwie nicht ganz durch, wieso geht es lokal aber nicht online??

Hier nochmals das jetztige PHP:

.....
    $status = $_POST['status'];
    $amount = $_POST['amount'];
    $userid = $_POST['userid'];
*************************************************************************
    $ugroup = $GLOBALS['TSFE']->fe_user->user['usergroup'];
*************************************************************************

if ($status == 'success'  &&  $amount == 100  &&  $ugroup == 4) { $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>5 ));
$GLOBALS['TSFE']->fe_user->user['usergroup']=5;
header("Location: index.php?id=5");

} elseif ($status == 'success'  &&  $amount == 100) { $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>3 ));
$GLOBALS['TSFE']->fe_user->user['usergroup']=3;
header("Location: index.php?id=5");

} elseif ($status == 'success'  &&  $amount == 200  && $ugroup == 3) {$GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>5 ));
$GLOBALS['TSFE']->fe_user->user['usergroup']=5;
header("Location: index.php?id=5");

} elseif ($status == 'success'  &&  $amount == 200) { $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>4 ));
$GLOBALS['TSFE']->fe_user->user['usergroup']=4;
header("Location: index.php?id=5");

} elseif ($status == 'success'  &&  $amount == 300) { $GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>5 ));
$GLOBALS['TSFE']->fe_user->user['usergroup']=5;
header("Location: index.php?id=5");

} elseif ($status == 'error') {

header("Location: index.php?id=24");
       
} else {
......

Ist hier der Hund begraben?:
$ugroup = $GLOBALS['TSFE']->fe_user->user['usergroup'];
?

Weis nicht mehr wie weiter!

El_Rolando ·

Eine andere Idee...

Wie müsste ich:
$GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>5 ));
umschreiben, so dass es anstatt die Werte zu ersetzen die Werte hinzufügt?

Irgendwie mit INSERT INTO... oder?
Aber wie sieht der genaue Syntax für Typo3 aus? Bin da noch voll der Neuling und durch ausprobieren komm ich nicht drauf!?

Habe folgendes auf wiki.typo3.org gefunden:
exec_INSERTquery($table,$fields_values)
exec_UPDATEquery($table,$where,$fields_values)

Das würde heissen irgendwie so:
$GLOBALS['TYPO3_DB']->exec_INSERTquery('fe_users','uid='.intval($userid),array('uid'=>$userid, 'usergroup'=>5 ));?
oder
$GLOBALS['TYPO3_DB']->exec_INSERTquery('fe_users',array('uid'=>$userid, 'usergroup'=>5 ));?

Aber so stimmt der Syntax nicht, irgendwo ist noch ein Fehler, denn so wird die Gruppe gar nicht mehr umgestellt!?

steffenk ·

Bei Dir treffen ja auch die ersten beiden Bedingungen zu, Bedingung 2 müsste dann heissen

elseif ($status == 'success'  &&  $amount == 100 && $ugroup!=4) ...

Mit Insert geht nicht, jeder User hat nur einen Datensatz. Eine Zuweisung zu mehreren Gruppen wird als Kommaliste eingetragen. Das hast Du bei Dir noch garnicht berücksichtigt.

Also musst Du das Gruppenfeld in ein Array einlesen, bei bedarf das Array erweitern, updaten mittels implode.

El_Rolando ·

Zitat:

Bei Dir treffen ja auch die ersten beiden Bedingungen zu...

Das sollte doch kein Problem sein!?
Wenn die 1. Bedingung erfüllt ist (z.B. $ugroup == 4), wird ja "abgebrochen" und weitergeleitet... und somit wird dann die 2. Bedingung gar nicht mehr geprüft!

Aber habe die != "ungleich" Bedingung trotzdem mal eingefügt, brachte aber auch nichts!
Es ist als würde:
$ugroup = $GLOBALS['TSFE']->fe_user->user['usergroup'];
…nicht richtig interpretiert!?

Ich habe als Test mal versucht die Extension online auf einem anderen Server zu installieren!
Dort habe ich die gleiche Umgebung wie ich lokal habe... und dort funktioniert es auch!? Sogar meine Ursprüngliche Version!?
Das würde doch heissen, dass es eigentlich funktionieren würde!?
Ich "schnall" das Problem nicht! :x

Als Versuch habe ich dann mal:
$ugroup = $GLOBALS['TSFE']->fe_user->user['usergroup'];
… auf $ugroup = 4; umgeschrieben!
Und siehe da, es funkionierte!

D.h. $GLOBALS['TSFE']->fe_user->user['usergroup'] scheint mir nicht wirklich die ID der usergroup auszugeben!
Falls ich es ja durch eine Zahl ersetze, werden die Bedingungen richtig interpretiert!! #angry#

Hier kam ich nicht mehr ganz mit:
Zitat:

Mit Insert geht nicht, jeder User hat nur einen Datensatz. Eine Zuweisung zu mehreren Gruppen wird als Kommaliste eingetragen. Das hast Du bei Dir noch garnicht berücksichtigt.
Also musst Du das Gruppenfeld in ein Array einlesen, bei bedarf das Array erweitern, updaten mittels implode.

Geht es jetzt gar nicht?
Oder würde es erst dann funktionieren wenn man die besagten Anpassungen vornehmen würde… oder gehört das nicht zusammen?

steffenk ·

Das erste Problem wird ein reines Cacheproblem sein. Setz die Seite mal auf "no cache" und es wird funktionieren.
Zum Thema Cache findest Du auf meiner Seite zwei wichtige Artikel.

zum zweiten:
Angenommen, der User hat usergroup 4 und es soll noch Gruppe 5 hinzugefügt werden, dann steht nachher in usergroup 4,5 drin.

Also müsstest Du die Gruppe immer so auslesen:

$ugroup=explode(',',$GLOBALS['TSFE']->fe_user->user['usergroup']);

hat der User nur Gruppe 4, dann hast Du in $ugroup jetzt drin:
array(0 => 4)

Jetzt willst Du Gruppe 5 hinzufügen:

$ugroup[]=5;

in $ugroup steht jetzt
array(0=>4,1=>5);

Willst Du das sichern, musst Du das so machen:

$GLOBALS['TYPO3_DB']->exec_UPDATEquery('fe_users','uid='.intval($userid),array('usergroup'=>implode(',',$ugroup) ));

Ich hoffe das es so verständlicher ist.

El_Rolando ·

Hi steffenk,

Danke für die Ausführungen, ja, es ist mir einiges klarer so!!
Habe aus no_cache umgestellt (im TS der seite eingefügt) und die Anpassungen gemacht!
...aber das Problem löst es leider immer noch nicht!

Das eigentliche Problem scheint irgendwie das auslesen der Usergroup zu sein!? Es scheint, als würde diese nicht richtig ausgelesen!
$ugroup = $GLOBALS['TSFE']->fe_user->user['usergroup'];
bzw.
$ugroup=explode(',',$GLOBALS['TSFE']->fe_user->user['usergroup']);

Denn wenn ich die Werte nicht auslesen lasse sondern direkt hineinschreibe...
Also z.B.:
$ugroup = 4;
Dann funktioniert alles korrekt!!!

Bin ich aber als User in der Usergroup 4 und teste die Extension mit:
$ugroup = $GLOBALS['TSFE']->fe_user->user['usergroup'];
...was ja eigentlich $ugroup = 4; entsprechen würde...
Dann geht es nicht mehr... die Gruppe wird scheinbar nicht erkannt, bzw. ist nicht 4 und deshalb werden wohl auch die Bedingungen ignoriert.
Und nur die entsprechende Gruppe umgestellt!

Könnte es sein, dass:
$ugroup = $GLOBALS['TSFE']->fe_user->user['usergroup'];
...mir die Gruppe in einem anderen Format als einer Zahl ausliest?
...oder das Ganze zusätzlich maskiert sein könnte?
-und deshalb die Bedingungen nicht richtig erfüllt werden?

Hinzu kommt, dass es auf unserem Server auch einwandfrei läuft!?!
Nur eben auf dem des Kunden nicht?!?!?

El_Rolando ·

Ich habe nun einfach mal versucht die...
$ugroup = $GLOBALS['TSFE']->fe_user->user['usergroup'];
mit...
echo $ugroup;
...ausgeben zu lassen... aber der output bleibt leer!?

Auch...
$ugroup = $GLOBALS['TSFE']->fe_user->user['email']; etc.
...funktioniert nicht!

Die fe_user Tabelle wird irgendwie nicht ausgelesen!!
Was kann das Problem sein, wenn dieser Syntax nicht funktioniert??

Der Output des Debug Modus:

|Object:
tslib_feuserauth Object
(
[global_database] =>
[session_table] => fe_sessions
[name] => fe_typo_user
[get_name] => ftu
[user_table] => fe_users
[username_column] => username
[userident_column] => password
[userid_column] => uid
[lastLogin_column] => lastlogin
[enablecolumns] => Array
(
[deleted] => deleted
[disabled] => disable
[starttime] => starttime
[endtime] => endtime
)
[formfield_uname] => user
[formfield_uident] => pass
[formfield_chalvalue] => challenge
[formfield_status] => logintype
[security_level] => normal
[auth_include] =>
[auth_timeout_field] => 6000
[lifetime] => 0
[gc_time] => 24
[gc_probability] => 1
[writeStdLog] =>
[writeAttemptLog] =>
[sendNoCacheHeaders] => 0
[getFallBack] => 1
[hash_length] => 10
[getMethodEnabled] => 1
[lockIP] => 2
[lockHashKeyWords] => useragent
[warningEmail] =>
[warningPeriod] => 3600
[warningMax] => 3
[checkPid] => 1
[checkPid_value] => 0
[id] => ca506679e0
[cookieId] => ca506679e0
[loginFailure] =>
[loginSessionStarted] =>
[get_URL_ID] =>
[newSessionID] =>
[forceSetCookie] =>
[dontSetCookie] =>
[challengeStoredInCookie] =>
[loginType] => FE
[svConfig] =>
[writeDevLog] =>
[usergroup_column] => usergroup
[usergroup_table] => fe_groups
[groupData] => Array
(
[title] => Array
(
)
[uid] => Array
(
)
[pid] => Array
(
)
)
[TSdataArray] => Array
(
[0] =>
)
[userTS] => Array
(
)
[userTSUpdated] => 0
[showHiddenRecords] => 0
[sesData] => Array
(
)
[sesData_change] => 0
[userData_change] => 0
[user] =>
)
|

Ich kann aber leider damit nichts anfangen!? Kann wer helfen?

NB:
Das Schreiben in die Tabelle mit dem entsprechenden Syntax funktioniert aber!?
z.B $GLOBALS['TSFE']->fe_user->user['usergroup']=5;
....wechselt die Usergroup des Users auf 5!??