Macht PHP Punkt-vor-Strich?

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
Martin Truckenbrodt
Mitglied
Beiträge: 1143
Registriert: 15.08.2003 23:16
Wohnort: Südthüringen
Kontaktdaten:

Macht PHP Punkt-vor-Strich?

Beitrag von Martin Truckenbrodt »

Hallo,
macht PHP Punkt-vor-Strich?

Code: Alles auswählen

$prune_date = (time() - (intval($config['user_prune_lost_time']) * 2592000));
bringt ein anderes Ergebnis als

Code: Alles auswählen

$prune_date = time() - (intval($config['user_prune_lost_time']) * 2592000);
oder

Code: Alles auswählen

$prune_date = time() - intval($config['user_prune_lost_time']) * 2592000;
Danke und Gruß Martin
Advanced Block MOD 1.1.4 ist released! - Verhindere Spam auf Deinem phpBB3 Board mit Stop Forum Spam, BotScout, Akismet, Project Honey Pot und verschiedenen IP-RBL und Domain-RBL DNS Blacklisten! - Meine MODs - phpBB Complete Core
piero
Mitglied
Beiträge: 476
Registriert: 10.11.2008 17:15
Wohnort: Schweiz

Re: Macht PHP Punkt-vor-Strich?

Beitrag von piero »

Ja tut es...

Dir ist bewusst, dass die Funktion time() jede Sekunde einen anderen Rückgabewert gibt?
Benutzeravatar
Martin Truckenbrodt
Mitglied
Beiträge: 1143
Registriert: 15.08.2003 23:16
Wohnort: Südthüringen
Kontaktdaten:

Re: Macht PHP Punkt-vor-Strich?

Beitrag von Martin Truckenbrodt »

Hallo,
wieso bekomme ich dann für die drei Beispiele unterschiedliche Ergebnisse?

Mir ist schon klar, dass time() Zeit in Sekunden liefert. Dies ist jedoch für den MOD nicht relevant.
Die Unterschiede der drei Beispiele liegen nicht im Sekundenbereich, sondern liegen teilweise ganz woanders!

Gruß Martin
Advanced Block MOD 1.1.4 ist released! - Verhindere Spam auf Deinem phpBB3 Board mit Stop Forum Spam, BotScout, Akismet, Project Honey Pot und verschiedenen IP-RBL und Domain-RBL DNS Blacklisten! - Meine MODs - phpBB Complete Core
piero
Mitglied
Beiträge: 476
Registriert: 10.11.2008 17:15
Wohnort: Schweiz

Re: Macht PHP Punkt-vor-Strich?

Beitrag von piero »

Hast du auch überprüft, ob die Variable $config['user_prune_lost_time'] bei jedem Test denselben Wert hat?

Weil mal angenommen, PHP missachtet Punkt vor Strich...
Dann würden deine ersten beiden aber immernoch dasselbe Ergebnis ausgeben...
Benutzeravatar
Martin Truckenbrodt
Mitglied
Beiträge: 1143
Registriert: 15.08.2003 23:16
Wohnort: Südthüringen
Kontaktdaten:

Re: Macht PHP Punkt-vor-Strich?

Beitrag von Martin Truckenbrodt »

Hallo,
$config['user_prune_lost_time'] ist immer gleich.

Gruß Martin
Advanced Block MOD 1.1.4 ist released! - Verhindere Spam auf Deinem phpBB3 Board mit Stop Forum Spam, BotScout, Akismet, Project Honey Pot und verschiedenen IP-RBL und Domain-RBL DNS Blacklisten! - Meine MODs - phpBB Complete Core
piero
Mitglied
Beiträge: 476
Registriert: 10.11.2008 17:15
Wohnort: Schweiz

Re: Macht PHP Punkt-vor-Strich?

Beitrag von piero »

Letzter Versuch:
Wenn du nun alle Varianten im gleichen Scriptdurchlauf ausrechnest... Gibt es dann ein unterschiedliches Ergebnis?
Benutzeravatar
Martin Truckenbrodt
Mitglied
Beiträge: 1143
Registriert: 15.08.2003 23:16
Wohnort: Südthüringen
Kontaktdaten:

Re: Macht PHP Punkt-vor-Strich?

Beitrag von Martin Truckenbrodt »

Hallo,
was, so schnell schon aufgeben? ;)

Code: Alles auswählen

echo "Test 1: " . (time() - (intval($config['user_prune_lost_time']) * 2592000)) . "<br />";
echo "Test 2: " . time() - (intval($config['user_prune_lost_time']) * 2592000) . "<br />";
echo "Test 3: " . time() - intval($config['user_prune_lost_time']) * 2592000;
Test 1: 1179943404
-62208000
-62208000
Dass jetzt "Test 2:" und "Test 3:" nicht angezeigt, bringt uns vielleicht auf den richtigen Weg. ???

Hier der Original Code aus dem MOD, wie er richtig funktioniert:

Code: Alles auswählen

		//prune lost users
		if ($config['user_prune_lost_time'])
		{
			$prune_date = (time() - (intval($config['user_prune_lost_time']) * 2592000));
			if ($config['user_prune_lost_posts'])
			{
				$sql_posts = ' AND user_posts < ' . (intval($config['user_prune_lost_posts']) + 1);
			}
			else
			{
				$sql_posts = '';
			}
			$sql = 'SELECT user_id
				FROM ' . USERS_TABLE . '
				WHERE user_lastvisit < ' . $prune_date . '
					AND user_type = ' . USER_NORMAL . '
					AND user_prune_exclude = 0' . 
					$sql_posts;
			$result = $db->sql_query($sql);
			while ($row = $db->sql_fetchrow($result))
			{
				$users_array[] = $row['user_id'];
			}
			$db->sql_freeresult($result);

			$prune_date = '';
		}
'user_prune_lost_time' ist integer Wert in Monaten (30 Tage).

Hier das Projekt - Version 1.4.0 in der Mache mit automatischer Benutzerbereinigung - das Code Beispiel zeigt die härteste Option, die ich standardmäßig nach UMIL Skript Ausführung auch nicht aktiviert habe (user_prune_lost_time = 0): http://www.martin-truckenbrodt.com/cgi/ ... m.php?f=22

Gruß Martin
Advanced Block MOD 1.1.4 ist released! - Verhindere Spam auf Deinem phpBB3 Board mit Stop Forum Spam, BotScout, Akismet, Project Honey Pot und verschiedenen IP-RBL und Domain-RBL DNS Blacklisten! - Meine MODs - phpBB Complete Core
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Macht PHP Punkt-vor-Strich?

Beitrag von Pyramide »

Martin Truckenbrodt hat geschrieben:Dass jetzt "Test 2:" und "Test 3:" nicht angezeigt, bringt uns vielleicht auf den richtigen Weg. ???
Genau - der Weg heißt "poste immer exakt den Code, bei dem das Problem auftritt und nicht einen Code, der nur so ähnlich aussieht".

Durch das vorangestellte "Test 2:". wird der Code nämlich so interpretiert:

Code: Alles auswählen

echo (("Test 2: " . time()) - (intval($config['user_prune_lost_time']) * 2592000)) . "<br />";
Und nach Auflösung der ersten Klammern wird daraus dann:

Code: Alles auswählen

echo ("Test 2: 123456789" - 62208000) . "<br />";
Siehe Operator-Reihenfolge
KB:knigge
BB-BF-BM
Mitglied
Beiträge: 2179
Registriert: 28.10.2005 16:38
Wohnort: Essen

Re: Macht PHP Punkt-vor-Strich?

Beitrag von BB-BF-BM »

Hallo Martin!

Sieh dir einmal die Operator-Rangfolge in PHP an!

Der Verknüpfungsoperator . steht auf dem gleichen Level wie der Additionsoperator + oder der Subtraktionsoperator -. Da eine Assoziativität von links nach rechts vorliegt, wird zunächst der String "Test 2: " mit dem Rückgabewert des Funktionsaufrufs von time() verknüpft; von dem Ergebnis wird das Produkt intval($config['user_prune_lost_time']) * 2592000 subtrahiert. Dieses Ergebnis (-62208000) wird mit dem String "<br />" verknüpft.

Folgende Zeilen sind allerdings äquivalent:

Code: Alles auswählen

echo "Test: " . (time() - (intval($config['user_prune_lost_time']) * 2592000)) . "<br />";
echo "Test: " . (time() - intval($config['user_prune_lost_time']) * 2592000) . "<br />"; 
Dies liegt daran, dass der Multiplikationsoperator * einen höheren Rang als Additions- oder Verknüpfungsoperator hat und die Multiplikation deshalb zuerst ausgeführt wird. (Daher führen die zweite und die dritte Zeile deines Testcodes zur gleichen Ausgabe.)
Deine Frage, ob PHP Punkt- vor Strichrechnung berücksichtigt, lässt sich also positiv beantworten.


P.S.: Schade, zu spät...
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Macht PHP Punkt-vor-Strich?

Beitrag von gn#36 »

In dem Fall lässt sich das "Punkt vor Strich" sogar wörtlich nehmen :) (auch wenn es nur an der Reihenfolge liegt)
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „Coding & Technik“