Problem mit sprintf() und den Variablen %s und %d

Allgemeiner Support zum phpBB 2 Board und phpBB 2 Modifikationen
Forumsregeln
Auch wenn hier der Support für phpBB 2 weiterhin aufrecht erhalten bleibt, weisen wir darauf hin, dass das phpBB 2 nicht mehr offiziell unterstützt und weiterentwickelt wird!
Antworten
schmidtedv
Beiträge: 607
Registriert: So 13.Feb, 2005 10:46
Wohnort: St. Blasien (seit 01.06)
Kontaktdaten:

Problem mit sprintf() und den Variablen %s und %d

Beitrag von schmidtedv »

Ab und an kam immer

Code: Alles auswählen

Warning: sprintf() [function.sprintf]: Too few arguments in page_header, Line 160
Ich dachte, der Fehler sei behoben, aber nun kam er doch wieder. Die Zeile umschreibt die Anzahl der anwesenden Benutzer in einem im ACP definierten Zeitraum:

Code: Alles auswählen

$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_users_total'], ($board_config['online_time'] / 60) % 60)));
Fehler hier, so nehme ich an, war der Eintrag %s in Kombination mit %d in der lang_main.php:

Code: Alles auswählen

$lang['Online_users_total'] = 'In den letzten %s Minuten waren <b>%d</b> Besucher anwesend: ';
Ich habe die Zeile nun korrigiert in:

Code: Alles auswählen

$lang['Online_users_total'] = 'In den letzten %s Minuten waren <b>%s</b> Besucher anwesend: ';
...und hoffe, das Problem ist damit beseitigt!?
Rettet den Wald, esst mehr Specht!

Forum [ sofern im Beitrag darauf verwiesen :-) ]
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

%s wäre ein einfacher String. Das kann klar auch ein Datum sein.
Ist so okay...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
schmidtedv
Beiträge: 607
Registriert: So 13.Feb, 2005 10:46
Wohnort: St. Blasien (seit 01.06)
Kontaktdaten:

Beitrag von schmidtedv »

Grummel...nein, leider kommt der Fehler immernoch...also mal ausführlicher, ich habe den Topic in Who is online MOD verbaut UND zusätzlich nun eine extra %s-Variable drin für die im ACP einstellbare Zeitspanne...das zusammen beist sich so wie ich es zusammengebaut habe...aber ich bin mal wieder an meiner Wissens-Grenze, seufz:


Code: Alles auswählen

$online_userlist = $lang['Registered_users'] . ' ' . $online_userlist;

	$total_online_users = $logged_visible_online + $logged_hidden_online + $guests_online;

	if ($total_online_users > $board_config['record_online_users']) {
		$board_config['record_online_users'] = $total_online_users;
		$board_config['record_online_date'] = time();

		$sql = "UPDATE " . CONFIG_TABLE . "
			SET config_value = '$total_online_users'
			WHERE config_name = 'record_online_users'";
		if (!$db->sql_query($sql)) {
			message_die(GENERAL_ERROR, 'Could not update online user record (nr of users)', '', __LINE__, __FILE__, $sql);
		}

		$sql = "UPDATE " . CONFIG_TABLE . "
			SET config_value = '" . $board_config['record_online_date'] . "'
			WHERE config_name = 'record_online_date'";
		if (!$db->sql_query($sql)) {
			message_die(GENERAL_ERROR, 'Could not update online user record (date)', '', __LINE__, __FILE__, $sql);
		}
	}

	if ($total_online_users == 0) {
		$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_users_zero_total'], ($board_config['online_time'] / 60) % 60)));
	} else if ($total_online_users == 1) {
		$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_user_total'], ($board_config['online_time'] / 60) % 60)));
	} else {
		$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_users_total'], ($board_config['online_time'] / 60) % 60)));
	}

	if ($logged_visible_online == 0) {
		$l_r_user_s = $lang['Reg_users_zero_total'];
	} else if ($logged_visible_online == 1) {
		$l_r_user_s = $lang['Reg_user_total'];
	} else {
		$l_r_user_s = $lang['Reg_users_total'];
	}

	if ($logged_hidden_online == 0) {
		$l_h_user_s = $lang['Hidden_users_zero_total'];
	} else if ($logged_hidden_online == 1) {
		$l_h_user_s = $lang['Hidden_user_total'];
	} else {
		$l_h_user_s = $lang['Hidden_users_total'];
	}

	if ($guests_online == 0) {
		$l_g_user_s = $lang['Guest_users_zero_total'];
	} else if ($guests_online == 1) {
		$l_g_user_s = $lang['Guest_user_total'];
	} else {
		$l_g_user_s = $lang['Guest_users_total'];
	}

	$l_online_users = sprintf($l_t_user_s, $total_online_users);
	$l_online_users .= sprintf($l_r_user_s, $logged_visible_online);
	$l_online_users .= sprintf($l_h_user_s, $logged_hidden_online);
	$l_online_users .= sprintf($l_g_user_s, $guests_online);
Da oben muß mir ein Denkfehler unterlaufen sein, denn auch wenn nur 1 Benutzer anwesend ist, also nur eine %s-Variable angesprochen wird, scheint es, kann es zu dem sprintf()-Fehler kommen, bei dem dann unten "In den letzten 2 Minuten waren x Benutzer anwesend" nicht mehr angezeigt wird

Code: Alles auswählen

$lang['Nobody'] = 'Niemand';
$lang['Online_users_zero_total'] = 'In den letzten %s Minuten waren <b>0</b> Besucher anwesend: ';
$lang['Online_users_total'] = 'In den letzten %s Minuten waren <b>%s</b> Besucher anwesend: ';
$lang['Online_user_total'] = 'In den letzten %s Minuten war <b>1</b> Besucher anwesend: ';

EDIT: Ich hab nun folgendes drin (PS: Die Zeit im ACP steht in Sekunden drin...und wird hier in Minuten angezeigt...ist da $board_config['online_time'] / 60 % 60 überhaubt richtig oder sollte ich besser einfach die Sekundendauer drin lassen im Text und mir das / 60 % 60 sparen, wie es der MOD-author verwendet hat? :

Code: Alles auswählen

$l_online_time = $board_config['online_time'] / 60 % 60;

	if ($total_online_users == 0) {
		$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_users_zero_total'], $l_online_time)));
	} else if ($total_online_users == 1) {
		$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_user_total'], $l_online_time)));
	} else {
		$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_users_total'], $l_online_time)));
	}
Ich bin nur nicht sicher, ob es nun richtig ist oder ich prinzipiell am Grundproblem vorbei hantiere...

EDIT 2: Nein, das ist es auch nicht...Fehler kommt wenn mehrere Benutzer, also tatsächlich die 2te Variable angesprochen wird...da muss ich wohl mit sprintf($lang['Online_users_total'], $l_online_time) was falsch machen, oder?
Zuletzt geändert von schmidtedv am Do 23.Nov, 2006 18:38, insgesamt 2-mal geändert.
Rettet den Wald, esst mehr Specht!

Forum [ sofern im Beitrag darauf verwiesen :-) ]
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Code: Alles auswählen

$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_users_total'], ($board_config['online_time'] / 60) % 60)));
Naja, 2 Variablen im Text, aber nur eine wird gefüllt (online_time / 60 % 60)...
Die Anzahl der User fehlt hier, also z. B. so:

Code: Alles auswählen

$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_users_total'], ($board_config['online_time'] / 60) % 60), $t_users));
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
schmidtedv
Beiträge: 607
Registriert: So 13.Feb, 2005 10:46
Wohnort: St. Blasien (seit 01.06)
Kontaktdaten:

Beitrag von schmidtedv »

Das klingt logisch, auch wenn ich mich frage wann ich das "verschluckt" haben könnte oder ob das somit auch schon vor Einbau der Zeitanpassung gefehlt hat...

Jedenfalls ist's nun so verbaut und scheint zu funktionieren:

Code: Alles auswählen

if ($total_online_users == 0) {
		$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_users_zero_total'], ($board_config['online_time'] / 60) % 60)));
	} else if ($total_online_users == 1) {
		$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_user_total'], ($board_config['online_time'] / 60) % 60)));
	} else {
		$l_t_user_s = ((isset($topic_id)) ? $lang['Browsing_topic'] : ((isset($forum_id)) ? $lang['Browsing_forum'] : sprintf($lang['Online_users_total'], ($board_config['online_time'] / 60) % 60, $total_online_users)));
	}
Oder sollte ich den Teil ($board_config['online_time'] / 60) % 60 noch zusätzlich in Klammern setzen, also (($board_config['online_time'] / 60) % 60) ??
Zuletzt geändert von schmidtedv am Do 23.Nov, 2006 18:54, insgesamt 1-mal geändert.
Rettet den Wald, esst mehr Specht!

Forum [ sofern im Beitrag darauf verwiesen :-) ]
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Ist nicht nötig, wäre aber besser lesbar...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
schmidtedv
Beiträge: 607
Registriert: So 13.Feb, 2005 10:46
Wohnort: St. Blasien (seit 01.06)
Kontaktdaten:

Beitrag von schmidtedv »

Ok :-) danke....und ich dachte schon wer weiß was mieses sich da eingeschlichen hätte...lief ja immer alles einwandfrei...aber wenn halt nur ein Besucher, sprich "Ich" das Ganze testen kann, kommen Fehler solcher Art eher selten, hrrhrrhrr...wenn Zeit (und Lust), kannst Du eventuell nochmal die aktuelle Version downloaden/anschauen? http://support.schmidtedv.de oder ich leg Dir n' Admin-Account an zum durchtesten, wenn Du möchtest...ist eh' eher ne Testseite bis ich umgezogen bin
Rettet den Wald, esst mehr Specht!

Forum [ sofern im Beitrag darauf verwiesen :-) ]
Antworten