Seite 1 von 1

Macht PHP Punkt-vor-Strich?

Verfasst: 11.05.2009 21:13
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

Re: Macht PHP Punkt-vor-Strich?

Verfasst: 11.05.2009 22:57
von piero
Ja tut es...

Dir ist bewusst, dass die Funktion time() jede Sekunde einen anderen Rückgabewert gibt?

Re: Macht PHP Punkt-vor-Strich?

Verfasst: 12.05.2009 17:48
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

Re: Macht PHP Punkt-vor-Strich?

Verfasst: 12.05.2009 19:11
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...

Re: Macht PHP Punkt-vor-Strich?

Verfasst: 12.05.2009 19:36
von Martin Truckenbrodt
Hallo,
$config['user_prune_lost_time'] ist immer gleich.

Gruß Martin

Re: Macht PHP Punkt-vor-Strich?

Verfasst: 12.05.2009 19:43
von piero
Letzter Versuch:
Wenn du nun alle Varianten im gleichen Scriptdurchlauf ausrechnest... Gibt es dann ein unterschiedliches Ergebnis?

Re: Macht PHP Punkt-vor-Strich?

Verfasst: 12.05.2009 20:09
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

Re: Macht PHP Punkt-vor-Strich?

Verfasst: 12.05.2009 20:46
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

Re: Macht PHP Punkt-vor-Strich?

Verfasst: 12.05.2009 20:58
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...

Re: Macht PHP Punkt-vor-Strich?

Verfasst: 21.05.2009 02:26
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)