benutzerstatus abfragen bzw. vergleichen

In diesem Forum gibt es Starthilfe zum neuen Extension-System von phpBB 3.1/3.2. Fragen zur Entwicklung von Extensions und zur Konvertierung von phpBB 3.0.x MODs sind ebenfalls willkommen.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3536
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: benutzerstatus abfragen bzw. vergleichen

Beitrag von chris1278 »

Nien nicht ganz. es müssen zwei bedingungen erfüllt sein..


entweder leer und user ist normal
oder leer und user ist gründer.

Das leer mus in jedemfall in verbindung mit einem der beiden anderen zusammen true ergeben.

Sonst würde der Block ja jedesmall ausgefüllt wenn das forum geladen wird.

Um mal zum verständniss den genazen code der diese aufgabe macht:

Code: Alles auswählen

if (empty($this->user->data['csstamp']) && $this->user->data['user_type'] == USER_NORMAL || $this->user->data['user_type'] == USER_FOUNDER)
{
	$cs_timestamp	= time();

	$sql = 'UPDATE ' . USERS_TABLE . '
		SET csstamp = "' . $this->db->sql_escape($cs_timestamp) . '"
		WHERE user_id = "' . $this->db->sql_escape($this->user->data['user_id']) . '"';
	$this->db->sql_query($sql);
}

$sql = 'SELECT id
	FROM ' . $this->callsign_table . '
	WHERE csstamp = "' . $this->db->sql_escape($this->user->data['csstamp']) . '"';
$result = $this->db->sql_query($sql);
$id = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);

if (empty($id) && $this->user->data['user_type'] == USER_NORMAL || $this->user->data['user_type'] == USER_FOUNDER)
{
	$sql_ary = [];

	$sql_ary[] = [
		'csstamp'				=> $this->user->data['csstamp'],
		'callsign_1'			=> '',
		'callsign_2'			=> '',
		'callsign_3'			=> '',
		'callsign_4'			=> '',
		'callsign_5'			=> '',
		'vorname'				=> '',
		'nachname'				=> '',
		'street'				=> '',
		'plz'					=> '',
		'city'					=> '',
		'country'				=> '',
		'email'					=> '',
		'flag'					=> '',
		'qslmgrcallsign '		=> '',
		'homepage'				=> '',
		'twitter'				=> '',
		'skype'					=> '',
		'bio'					=> '',
		'lat_n'					=> '',
		'lat_n_deg'				=> '',
		'lat_n_min'				=> '',
		'lat_n_sec'				=> '',
		'len_e'					=> '',
		'len_e_deg'				=> '',
		'len_e_min'				=> '',
		'len_e_sec'				=> '',
		'pic'					=> '',
		'tech'					=> '',
		'gridsq'				=> '',
		'itzone'				=> '',
		'cqzone'				=> '',
		'qslmgr'				=> 0,
		'qslvorname'			=> '',
		'qslnachname'			=> '',
		'qslstreet'				=> '',
		'qslcity'				=> '',
		'qslcountry'			=> '',
	];

	$this->db->sql_multi_insert($this->callsign_table, $sql_ary);
}


Wenn du den auseinander pflückst ist der erste teil:

Code: Alles auswählen

if (empty($this->user->data['csstamp']) && $this->user->data['user_type'] == USER_NORMAL || $this->user->data['user_type'] == USER_FOUNDER)
{
	$cs_timestamp	= time();

	$sql = 'UPDATE ' . USERS_TABLE . '
		SET csstamp = "' . $this->db->sql_escape($cs_timestamp) . '"
		WHERE user_id = "' . $this->db->sql_escape($this->user->data['user_id']) . '"';
	$this->db->sql_query($sql);
}
der soll also bei aufruf des forums prüfen auf folgendes:

Also der teil macht folgendes.

Wenn also jetzt die Seite aufgerufen soll erstmal geprüft werden ob der Benutzer eine csstamp Eintrag in der Tabelle hate und falls nicht dann wird geprüft ob eben normaler oder Gründer ist. dann wird ein csstamp (Hashwert aus time()) erstellt.

Das hab ich halt so gemacht weil wenn ein Benutzer sich registriert wird ja in dem Feld nix eingetragen. Ja ich weis man könnte das wahrscheinlich auch so programmieren das bei der Registrierung der Hashwert eingetragen wird. Ich weis nur leider nicht wie. Weil mein wissen dafür eben noch nicht ausreichend ist. Wenn man das so machen könnte das bei der Registrierung eben schon der wert individuell eingetragen wird würde man diesen Code teil nämlich nicht brauchen.


Nachfolgend der zweite Code teil:

Code: Alles auswählen

$sql = 'SELECT id
	FROM ' . $this->callsign_table . '
	WHERE csstamp = "' . $this->db->sql_escape($this->user->data['csstamp']) . '"';
$result = $this->db->sql_query($sql);
$id = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);

if (empty($id) && $this->user->data['user_type'] == USER_NORMAL || $this->user->data['user_type'] == USER_FOUNDER)
{
	$sql_ary = [];

	$sql_ary[] = [
		'csstamp'				=> $this->user->data['csstamp'],
		'callsign_1'			=> '',
		'callsign_2'			=> '',
		'callsign_3'			=> '',
		'callsign_4'			=> '',
		'callsign_5'			=> '',
		'vorname'				=> '',
		'nachname'				=> '',
		'street'				=> '',
		'plz'					=> '',
		'city'					=> '',
		'country'				=> '',
		'email'					=> '',
		'flag'					=> '',
		'qslmgrcallsign '		=> '',
		'homepage'				=> '',
		'twitter'				=> '',
		'skype'					=> '',
		'bio'					=> '',
		'lat_n'					=> '',
		'lat_n_deg'				=> '',
		'lat_n_min'				=> '',
		'lat_n_sec'				=> '',
		'len_e'					=> '',
		'len_e_deg'				=> '',
		'len_e_min'				=> '',
		'len_e_sec'				=> '',
		'pic'					=> '',
		'tech'					=> '',
		'gridsq'				=> '',
		'itzone'				=> '',
		'cqzone'				=> '',
		'qslmgr'				=> 0,
		'qslvorname'			=> '',
		'qslnachname'			=> '',
		'qslstreet'				=> '',
		'qslcity'				=> '',
		'qslcountry'			=> '',
	];

	$this->db->sql_multi_insert($this->callsign_table, $sql_ary);
Damit wird die id ermittelt welche den csstamp des besuchers hat. und dann der selbe hashwert in die rufzeichentabelle eingetragen. Somit ist die verknüpfung des Besuchers mit der Rufzeichendatenbankstabelle hergestellt.

Ich hoffe ich konnte es somit verdeutlichen.
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 2129
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: benutzerstatus abfragen bzw. vergleichen

Beitrag von LukeWCS »

chris1278 hat geschrieben: 20.02.2024 20:16 Nien nicht ganz. es müssen zwei bedingungen erfüllt sein..

entweder leer und user ist normal
oder leer und user ist gründer.

Das leer mus in jedemfall in verbindung mit einem der beiden anderen zusammen true ergeben.
Ahaaaa! :D Jetzt kommen wir weiter und ich hab dich da, wo ich dich haben will.

Danke für den zusätzlichen Code, aber der wäre zum Verständnis deiner Bedingung gar nicht nötig gewesen, weil hier nur die Info gefehlt hat, was genau csstamp ist und wann das gefüllt und wann es nicht gefüllt ist. Das reichte schon.

Gut, damit ist jetzt zweifelsfrei geklärt, was du eigentlich erreichen wolltest. Wie du jetzt aber an meiner letzten Erklärung gesehen hast, liest der Interpreter da was ganz anderes als du eigentlich wolltest, also ist dein Code noch nicht ganz korrekt.

Sorry Chris, ich lass dich jetzt nicht mehr vom Haken, weil das muss mal bei dir richtig ankommen. Hast du gelesen was dir Thorsten verlinkt hat?
Möge das Backup mit dir sein. Immer.

Erweiterungen - Infos zur artgerechten Haltung
phpBB Ext Check - Analysesystem für phpBB Erweiterungen (Entwickler Werkzeug)
Benutzeravatar
chris1278
Mitglied
Beiträge: 3536
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: benutzerstatus abfragen bzw. vergleichen

Beitrag von chris1278 »

Ja aber ich werd daraus nicht wirklich schlau.

Ich könnte das natürlich auch so schreiben:

Code: Alles auswählen

if (empty($this->user->data['csstamp']))
{
	if ($this->user->data['user_type'] == USER_NORMAL || $this->user->data['user_type'] == USER_FOUNDER)
	{
		hier der code
	}
}
Ich dachte halt das andere wäre das in Kurzform.

@edit

So hab nochmals in das Thema reingeschaut. Dort steht folgendes in 2 Absätzen:
https://www.php.net/manual/de/language.operators.precedence.php hat geschrieben:Die Operator-Rangfolge legt fest, wie "eng" ein Operator zwei Ausdrücke miteinander verbindet. Zum Beispiel ist das Ergebnis des Ausdruckes 1 + 5 * 3 16 und nicht 18, da der Multiplikations-Operator ("*") in der Rangfolge höher steht als der Additions-Operator ("+"). Wenn nötig, können Sie Klammern setzen, um die Rangfolge der Operatoren zu beeinflussen. Zum Beispiel ergibt: (1 + 5) * 3 18.

Haben Operatoren die gleiche Rangfolge, dann entscheidet ihre Assoziativität wie die Operatoren gruppiert werden. Zum Beispiel ist "-" links-assoziativ, sodass 1 - 2 - 3 als (1 - 2) - 3 gruppiert und zu -4 ausgewertet wird. Andererseits ist "=" rechts-assoziativ, sodass $a = $b = $c als $a = ($b = $c) gruppiert wird.
Demzufolge müsste das was ich hier habe:

Code: Alles auswählen

if (empty($this->user->data['csstamp']) && $this->user->data['user_type'] == USER_NORMAL || $this->user->data['user_type'] == USER_FOUNDER)
beides inks-assoziativ

In dem fall solllte das eigentlich so wie in dem absatz beschrieben (1 - 2) - 3 gruppiert gelesen werden. ich könnte das auch so aufbauen wie in dem absatz dann sähe das so aus:

Code: Alles auswählen

if ((empty($this->user->data['csstamp'])) && $this->user->data['user_type'] == USER_NORMAL || $this->user->data['user_type'] == USER_FOUNDER)
So sollte in jedemfall erst auf die id also auf den leeren hashwert geprüft werden und dann zusätzlich eben auf normal bzw. Gründer.
Benutzeravatar
IMC
Mitglied
Beiträge: 543
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: benutzerstatus abfragen bzw. vergleichen

Beitrag von IMC »

chris1278 hat geschrieben: 20.02.2024 20:16 Das hab ich halt so gemacht weil wenn ein Benutzer sich registriert wird ja in dem Feld nix eingetragen. Ja ich weis man könnte das wahrscheinlich auch so programmieren das bei der Registrierung der Hashwert eingetragen wird. Ich weis nur leider nicht wie.
Hi Chris,
schau dir mal diesen Code an.
https://github.com/IMC-GER/RecentTopics ... #L202-L223
Dort weisen wir dem neuen User nach erfolgreicher Registrierung Daten zu. Dazu nutzen wir das Event core.ucp_register_welcome_email_before. Dies ist das erste Event nach dem der neue User seine ID zugewiesen bekommen hat.
Gruß, Thorsten
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 2129
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: benutzerstatus abfragen bzw. vergleichen

Beitrag von LukeWCS »

chris1278 hat geschrieben: 20.02.2024 20:26 Ja aber ich werd daraus nicht wirklich schlau.
Alles klar. Dann sag das bitte immer sofort. Du kennst mich lange genug; tacheles reden, Fakten auf den Tisch, Problem analysieren, Problem lösen, nächstes Thema. Wenn du nicht direkt klar sagst was du nicht verstehst, eiern wir hier bis zum Sanktnimmerleinstag sinnlos rum und das Ganze zieht sich wie Kaugummi. ;)
Ich könnte das natürlich auch so schreiben:

Code: Alles auswählen

if (empty($this->user->data['csstamp']))
{
	if ($this->user->data['user_type'] == USER_NORMAL || $this->user->data['user_type'] == USER_FOUNDER)
	{
		hier der code
	}
}
Sehr gut, DIESER Code wäre genau das, was du erreichen willst. Und hier macht der Interpreter auch ganz genau das, was du willst, weil du präzise Anweisungen gegeben hast. Aber bei deinem Einzeiler warst du unpräzise und das klären wir jetzt.
Ich dachte halt das andere wäre das in kurzform.
Deine Gedankengänge waren schon richtig, aber bei deinem Code fehlt noch was. Da wäre jetzt der besagte Artikel wichtig gewesen um zu verstehen, was an deinem Einzeiler nicht korrekt ist. Die Rangfolge der Operatoren ist immens wichtig.

Nur in Kurzform: && hat eine höhere Prio als ||. Das heisst && wird VOR || ausgeführt. Das heisst mit deinen Worten:

Was du gemeint hast:
entweder leer und user ist normal
oder leer und user ist gründer.
Was du aber tatsächlich programmiert hast:
entweder leer und user ist normal
oder user ist gründer.
Jetzt nochmal dein Code der schon fast richtig ist:

Code: Alles auswählen

if (empty($this->user->data['csstamp']) && $this->user->data['user_type'] == USER_NORMAL || $this->user->data['user_type'] == USER_FOUNDER)
Und jetzt noch dazu die wichtige Aussage von Thorsten:
IMC hat geschrieben: 18.02.2024 23:38 Wenn nicht, musst du Eventuell noch eine Klammer setzen. Der Operator && ist im Rang höher als das ||.
Fällt der Euro jetzt? Schule Mathematik? Klammern-Regel? Schon zu lange her?
Möge das Backup mit dir sein. Immer.

Erweiterungen - Infos zur artgerechten Haltung
phpBB Ext Check - Analysesystem für phpBB Erweiterungen (Entwickler Werkzeug)
Benutzeravatar
chris1278
Mitglied
Beiträge: 3536
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: benutzerstatus abfragen bzw. vergleichen

Beitrag von chris1278 »

Ok das werde ich demnächst mal testen. wenn das funktioniert dann fällt die erste Prüfung und Code Eintragung schonmal weg und man kann das andere dann auch kürzen und einfach prüfen ob die csstamp des Benutzers welche ja dann eingetragen ist schon in der anderen Tabelle vorhanden ist und wenn nicht eben den Eintrag machen.

@edit

ok Luke ich denke jetzt hats klick gemacht. Ausgehen davon das && schwerer wiegt als || würde ich den code in sofern abändern

Code: Alles auswählen

if (empty($this->user->data['csstamp']) && ($this->user->data['user_type'] == USER_NORMAL || $this->user->data['user_type'] == USER_FOUNDER))
Damit würde er die klammern zuerst auflösen und auch noch auf die leere id prüfen.

Sprich so müsste das kommen was ich möchte.

Der Prüft dann ob der hashwert leer ist und ob der benutzer normal oder gründer ist und nur wenn beides dann zutrifft wird ausgeführt.
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 2129
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: benutzerstatus abfragen bzw. vergleichen

Beitrag von LukeWCS »

Perfekt, jetzt hast du es! :thumbsup:

Und nachdem du das Problem, das du hattest, verstanden und gelöst hast, kannst dir Thorstens neuen Vorschlag angucken, das wär eine bessere Alternative. Aber ich wollte erst das du das eigentliche Problem verstehst, weil das gehört zu den Grundlagen und genau sowas wirst du immer wieder brauchen können. Deswegen war das jetzt wichtig.
Möge das Backup mit dir sein. Immer.

Erweiterungen - Infos zur artgerechten Haltung
phpBB Ext Check - Analysesystem für phpBB Erweiterungen (Entwickler Werkzeug)
Benutzeravatar
chris1278
Mitglied
Beiträge: 3536
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: benutzerstatus abfragen bzw. vergleichen

Beitrag von chris1278 »

Ja das werde ich in jedem Fall testen von Torsten.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3536
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: benutzerstatus abfragen bzw. vergleichen

Beitrag von chris1278 »

IMC hat geschrieben: 20.02.2024 20:47 Hi Chris,
schau dir mal diesen Code an.
https://github.com/IMC-GER/RecentTopics ... #L202-L223
Dort weisen wir dem neuen User nach erfolgreicher Registrierung Daten zu. Dazu nutzen wir das Event core.ucp_register_welcome_email_before. Dies ist das erste Event nach dem der neue User seine ID zugewiesen bekommen hat.
Ok ich hab das versucht zu übernehmen in der normalen listner aber da hat es keine auswirkung.

Mein code sieht so aus:

Code: Alles auswählen

public static function getSubscribedEvents()
{
	return [
		'core.ucp_register_welcome_email_before' 			=> 'ucp_register_set_data',
	];
}

Und dann der eigentliche eintrag der gemacht werden sollte.

Code: Alles auswählen

public function ucp_register_set_data($event)
{
	
	$sql_ary = [
		'csstamp'		  => time,
	];

	$sql = 'UPDATE ' . USERS_TABLE . '
			SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . '
			WHERE user_id = ' . $event['user_id'];

	$this->db->sql_query($sql);
}

Allerdings erfolgt kine eintragung. Die spalte csstamp ist aber da. Selbst wenn ich vorher ein Echo 'test'; einbaue wird nix geladen. Irgendwas mach ich falsch.
Benutzeravatar
IMC
Mitglied
Beiträge: 543
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: benutzerstatus abfragen bzw. vergleichen

Beitrag von IMC »

Ersetze mal

Code: Alles auswählen

	$sql_ary = [
		'csstamp'		  => time,
	];
durch

Code: Alles auswählen

	$sql_ary = [
		'csstamp'		  => time(),
	];
Gruß, Thorsten
Verschoben von Coding & Technik nach Extension Bastelstube am 05.03.2024 17:57 durch LukeWCS

Antworten

Zurück zu „Extension Bastelstube“