By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,267 Members | 1,861 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,267 IT Pros & Developers. It's quick & easy.

"Three Strikes You're Out" rule fails

P: n/a
I have a counter that evokes the "Three Strikes You're Out" rule.. if
you make more than N mistakes it auto-resets to avoid flooding
$_SESSION with attempt after attempt, etc.

However, the counter never advances beyond 1!

[PHP]
// HANDLE THE PART WHERE THE STUDENT INFORMATION WILL BE UPDATED OR
SEARCHED
if (is_array($_POST) && @sizeof($_POST) > 0) {
$accepter =& new Accepter($student_id);
if (!$accepter->isValid) $errorArray = $accepter->getErrorArray();
} else {
// NEW 3/24/2006: MAKE SURE THE $_SESSION KOUNTER IS RESET SINCE
THEY HAVE DONE NO FORM ACTION
//unset($_SESSION["${projectAcronym}_kounter"]);
//@session_unregister("${projectAcronym}_kounter"); //
DESTROY SESSION ERROR COUNTER TO FORCE IT TO RESET
$_SESSION["${projectAcronym}_kounter"] = null;
}

[/PHP]

And this is supposed to advance the $_SESSION counter:

[PHP]

/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
New 2/27/2006: New "Three Strikes You're Out" Rule: To prevent
overstuffing of $_SESSION and other memory-encroaching collection
objects,
a "Three Strikes You're Out" rule will be implemented. If the user
makes fewer than 3 mistakes either within Accepter or in
ActionPerformer combined,
then a $_SESSION counter will increase, up to 2 tries. After the 2nd
try, all $_SESSION variables prefixed by $projectAcronym are destroyed
and you are
automatically rerouted back to the default page

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
print_r("Before: "); print_r($_SESSION["${projectAcronym}_kounter"]);
print_r("<P>");
if (is_array($_POST) && @sizeof($_POST) > 0 && is_object($accepter)
&& @is_a($accepter, 'Accepter') && is_object($ap) && @is_a($ap,
'ActionPerformer') &&
(!$accepter->isValid || !$ap->isSuccessful) &&
(int)$_SESSION["${projectAcronym}_kounter"] >= 1
) {
foreach ($_SESSION as $field) if (strpos($field, $projectAcronym)
=== 0) unset($_SESSION[$field]);
$qs = '?sort=' . $_REQUEST['sort'] . '&willDesc=' .
$_REQUEST['willDesc'] . '&willShowDetail=1&id=' . $_REQUEST['id'];
$errorMsg = "<p><font color=\"#cc0000\"><b>Application display
restarted due to too many errors, all values reset</b></font></p>";
$qs .= '&errorMsg=' . urlencode($errorMsg);
header('Location: ' . $_SERVER['PHP_SELF'] . $qs);
} elseif (is_array($_POST) && @sizeof($_POST) > 0 &&
is_object($accepter) && @is_a($accepter, 'Accepter') && is_object($ap)
&& @is_a($ap, 'ActionPerformer') &&
(!$accepter->isValid || !$ap->isSuccessful) &&
(int)$_SESSION["${projectAcronym}_kounter"] >= 0
) {
if ((int)($_SESSION["${projectAcronym}_kounter"]) > 0)
(int)$_SESSION["${projectAcronym}_kounter"]++; else
$_SESSION["${projectAcronym}_kounter"] = 1;
}
print_r("After: ");
print_r($_SESSION["${projectAcronym}_kounter"]); print_r("<P>");
//--END OF "Three Strikes You're Out"
RULE------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[/PHP]

Problem is that the session counter never advances beyond 1, it remains
1 indefinitely unless you do not do a form action then it's null again.

It's supposed to go to 1 if you make one mistake, to 2 if you make
another, and so on until you reach the limit and then it auto resets
while destroying all SESSION objects whose keys are stamped to this
particular project alone.

Help!

Thanx
Phil

Mar 27 '06 #1
Share this Question
Share on Google+
3 Replies


P: n/a
comp.lang.php said the following on 27/03/2006 16:55:
print_r("Before: "); print_r($_SESSION["${projectAcronym}_kounter"]);
print_r("<P>");
if (is_array($_POST) && @sizeof($_POST) > 0 && is_object($accepter)
&& @is_a($accepter, 'Accepter') && is_object($ap) && @is_a($ap,
'ActionPerformer') &&
(!$accepter->isValid || !$ap->isSuccessful) &&
(int)$_SESSION["${projectAcronym}_kounter"] >= 1
) {
foreach ($_SESSION as $field) if (strpos($field, $projectAcronym)
=== 0) unset($_SESSION[$field]);
$qs = '?sort=' . $_REQUEST['sort'] . '&willDesc=' .
$_REQUEST['willDesc'] . '&willShowDetail=1&id=' . $_REQUEST['id'];
$errorMsg = "<p><font color=\"#cc0000\"><b>Application display
restarted due to too many errors, all values reset</b></font></p>";
$qs .= '&errorMsg=' . urlencode($errorMsg);
header('Location: ' . $_SERVER['PHP_SELF'] . $qs);
} elseif (is_array($_POST) && @sizeof($_POST) > 0 &&
is_object($accepter) && @is_a($accepter, 'Accepter') && is_object($ap)
&& @is_a($ap, 'ActionPerformer') &&
(!$accepter->isValid || !$ap->isSuccessful) &&
(int)$_SESSION["${projectAcronym}_kounter"] >= 0
) {
if ((int)($_SESSION["${projectAcronym}_kounter"]) > 0)
(int)$_SESSION["${projectAcronym}_kounter"]++; else
$_SESSION["${projectAcronym}_kounter"] = 1;
}
print_r("After: ");
print_r($_SESSION["${projectAcronym}_kounter"]); print_r("<P>");
//--END OF "Three Strikes You're Out"


That's some of the most unreadable code I've ever seen.
--
Oli
Mar 28 '06 #2

P: n/a
Oli Filth wrote:
comp.lang.php said the following on 27/03/2006 16:55:
print_r("Before: "); print_r($_SESSION["${projectAcronym}_kounter"]);
print_r("<P>");
if (is_array($_POST) && @sizeof($_POST) > 0 && is_object($accepter)
&& @is_a($accepter, 'Accepter') && is_object($ap) && @is_a($ap,
'ActionPerformer') &&
(!$accepter->isValid || !$ap->isSuccessful) &&
(int)$_SESSION["${projectAcronym}_kounter"] >= 1
) {
foreach ($_SESSION as $field) if (strpos($field, $projectAcronym)
=== 0) unset($_SESSION[$field]);
$qs = '?sort=' . $_REQUEST['sort'] . '&willDesc=' .
$_REQUEST['willDesc'] . '&willShowDetail=1&id=' . $_REQUEST['id'];
$errorMsg = "<p><font color=\"#cc0000\"><b>Application display
restarted due to too many errors, all values reset</b></font></p>";
$qs .= '&errorMsg=' . urlencode($errorMsg);
header('Location: ' . $_SERVER['PHP_SELF'] . $qs);
} elseif (is_array($_POST) && @sizeof($_POST) > 0 &&
is_object($accepter) && @is_a($accepter, 'Accepter') && is_object($ap)
&& @is_a($ap, 'ActionPerformer') &&
(!$accepter->isValid || !$ap->isSuccessful) &&
(int)$_SESSION["${projectAcronym}_kounter"] >= 0
) {
if ((int)($_SESSION["${projectAcronym}_kounter"]) > 0)
(int)$_SESSION["${projectAcronym}_kounter"]++; else
$_SESSION["${projectAcronym}_kounter"] = 1;
}
print_r("After: ");
print_r($_SESSION["${projectAcronym}_kounter"]); print_r("<P>");
//--END OF "Three Strikes You're Out"


That's some of the most unreadable code I've ever seen.

It's still obtuse if you do reformat it...
My comments with '--' prefix.

print_r("Before: ");
print_r($_SESSION["${projectAcronym}_kounter"]);
print_r("<P>");

if(
is_array($_POST)
&& @sizeof($_POST) > 0
&& is_object($accepter)
&& @is_a($accepter, 'Accepter')
&& is_object($ap)
&& @is_a($ap, 'ActionPerformer')
&& ( ! $accepter->isValid || !$ap->isSuccessful )
-- up to here the two clauses of the if are identical
&& (int)$_SESSION["${projectAcronym}_kounter"] >= 1 ) {
-- if we get here, i.e. kounter > 0, then we never increment it
-- net result: the kounter goes from 0 in the second clause
-- and stays at one here - which is the observed result.
-- Also, the casts to int are not needed
foreach( $_SESSION as $field)
if( strpos($field, $projectAcronym) === 0 )
-- why ===? checking the return type of strpos for integer?
unset($_SESSION[$field]);

$qs = '?sort='.$_REQUEST['sort']
.'&willDesc='.$_REQUEST['willDesc']
.'&willShowDetail=1'
.'&id='.$_REQUEST['id'];
$errorMsg = "<p><font color=\"#cc0000\">"
."<b>Application display restarted due to too many errors, all values
reset</b>"
."</font></p>";
$qs .= '&errorMsg='.urlencode($errorMsg);
header('Location: '.$_SERVER['PHP_SELF'].$qs);
} elseif(
is_array($_POST)
&& @sizeof($_POST) > 0
&& is_object($accepter)
&& @is_a($accepter, 'Accepter')
&& is_object($ap)
&& @is_a($ap, 'ActionPerformer')
&& ( ! $accepter->isValid || !$ap->isSuccessful )
&& (int)$_SESSION["${projectAcronym}_kounter"] >= 0 ) {
-- the previous if clause will trap on kounter >= 1, so this test
-- should be == 0 if kounter has any chance of going negative
-- otherwise it is useless.
if ((int)($_SESSION["${projectAcronym}_kounter"]) > 0)
(int)$_SESSION["${projectAcronym}_kounter"]++;
else
$_SESSION["${projectAcronym}_kounter"] = 1;
-- so we know that kounter is always zero, to only this line will
-- be used, moving kounter to 1.
}
print_r("After: ");
print_r($_SESSION["${projectAcronym}_kounter"]);
print_r("<P>");
//--END OF "Three Strikes You're Out"

-david-

Mar 28 '06 #3

P: n/a
Read my comments below in **

David Haynes wrote:
Oli Filth wrote:
comp.lang.php said the following on 27/03/2006 16:55:
print_r("Before: "); print_r($_SESSION["${projectAcronym}_kounter"]);
print_r("<P>");
if (is_array($_POST) && @sizeof($_POST) > 0 && is_object($accepter)
&& @is_a($accepter, 'Accepter') && is_object($ap) && @is_a($ap,
'ActionPerformer') &&
(!$accepter->isValid || !$ap->isSuccessful) &&
(int)$_SESSION["${projectAcronym}_kounter"] >= 1
) {
foreach ($_SESSION as $field) if (strpos($field, $projectAcronym)
=== 0) unset($_SESSION[$field]);
$qs = '?sort=' . $_REQUEST['sort'] . '&willDesc=' .
$_REQUEST['willDesc'] . '&willShowDetail=1&id=' . $_REQUEST['id'];
$errorMsg = "<p><font color=\"#cc0000\"><b>Application display
restarted due to too many errors, all values reset</b></font></p>";
$qs .= '&errorMsg=' . urlencode($errorMsg);
header('Location: ' . $_SERVER['PHP_SELF'] . $qs);
} elseif (is_array($_POST) && @sizeof($_POST) > 0 &&
is_object($accepter) && @is_a($accepter, 'Accepter') && is_object($ap)
&& @is_a($ap, 'ActionPerformer') &&
(!$accepter->isValid || !$ap->isSuccessful) &&
(int)$_SESSION["${projectAcronym}_kounter"] >= 0
) {
if ((int)($_SESSION["${projectAcronym}_kounter"]) > 0)
(int)$_SESSION["${projectAcronym}_kounter"]++; else
$_SESSION["${projectAcronym}_kounter"] = 1;
}
print_r("After: ");
print_r($_SESSION["${projectAcronym}_kounter"]); print_r("<P>");
//--END OF "Three Strikes You're Out"
That's some of the most unreadable code I've ever seen.

It's still obtuse if you do reformat it...
My comments with '--' prefix.

print_r("Before: ");
print_r($_SESSION["${projectAcronym}_kounter"]);
print_r("<P>");

if(
is_array($_POST)
&& @sizeof($_POST) > 0
&& is_object($accepter)
&& @is_a($accepter, 'Accepter')
&& is_object($ap)
&& @is_a($ap, 'ActionPerformer')
&& ( ! $accepter->isValid || !$ap->isSuccessful )
-- up to here the two clauses of the if are identical


** How? I don't see how they're identical in any way, they're
completely distinctive
&& (int)$_SESSION["${projectAcronym}_kounter"] >= 1 ) {
-- if we get here, i.e. kounter > 0, then we never increment it
-- net result: the kounter goes from 0 in the second clause
-- and stays at one here - which is the observed result.
-- Also, the casts to int are not needed
** I don't follow you here. Sorry, elaborate more, please. And I've
had no luck without casts using $_SESSION objects
foreach( $_SESSION as $field)
if( strpos($field, $projectAcronym) === 0 )
-- why ===? checking the return type of strpos for integer?
** I am checking to see if the $_SESSION key starts with
"$projectAcronym", isn't that what strpos() does?
unset($_SESSION[$field]);

$qs = '?sort='.$_REQUEST['sort']
.'&willDesc='.$_REQUEST['willDesc']
.'&willShowDetail=1'
.'&id='.$_REQUEST['id'];
$errorMsg = "<p><font color=\"#cc0000\">"
."<b>Application display restarted due to too many errors, all values
reset</b>"
."</font></p>";
$qs .= '&errorMsg='.urlencode($errorMsg);
header('Location: '.$_SERVER['PHP_SELF'].$qs);
} elseif(
is_array($_POST)
&& @sizeof($_POST) > 0
&& is_object($accepter)
&& @is_a($accepter, 'Accepter')
&& is_object($ap)
&& @is_a($ap, 'ActionPerformer')
&& ( ! $accepter->isValid || !$ap->isSuccessful )
&& (int)$_SESSION["${projectAcronym}_kounter"] >= 0 ) {
-- the previous if clause will trap on kounter >= 1, so this test
-- should be == 0 if kounter has any chance of going negative
-- otherwise it is useless.
if ((int)($_SESSION["${projectAcronym}_kounter"]) > 0)
(int)$_SESSION["${projectAcronym}_kounter"]++;
else
$_SESSION["${projectAcronym}_kounter"] = 1;
-- so we know that kounter is always zero, to only this line will
-- be used, moving kounter to 1.
}
** No it should not always be 0, it might be 0 but it could be 1, 2,
.... N. It's supposed to be at the point where you made a mistake and
it auto--increments.
print_r("After: ");
print_r($_SESSION["${projectAcronym}_kounter"]);
print_r("<P>");
//--END OF "Three Strikes You're Out"

-david-


Mar 28 '06 #4

This discussion thread is closed

Replies have been disabled for this discussion.