two-dimensional switch statement?
am 22.08.2007 20:33:36 von Miyagi
I have a bunch of conditions in which to determine different types of
questions to ask in a survey I am constructing.
Just was wondering if anybody has used a two-dimensional switch
statement. If this works, is this an efficient coding method or would
anybody else have another way around this?
$type = enters _POST as (employee, client, or peer)
$visit = enters _POST as ( 0 or 1 )
$userage = enters _POST as ( 1, 2, 3, or 4)
$ip is the IP address of the user
function determineUser($type, $userage, $ip, $visit)
{
switch ($type){
case 'employee':
switch ($userage){
case '1':
case '2': if($visit){$surveyType=1;}else{$surveyType=2;} break;
case '3':
case '4': $surveyType=3; break;
case 'client': if($visit){$surveyType=4;}else{$surveyType=5;}
break;
case 'peer': if($visit){$surveyType=6;}else{$surveyType=7;} break;
}
$query = "INSERT INTO user(userip, userage, idsurvey)
VALUES('$ip','$userage','$surveyType')";
mysql_query($query);
return (getUserId($ip));
}
Thanks.
Re: two-dimensional switch statement?
am 22.08.2007 21:00:31 von Michael Fesser
..oO(Miyagi)
>I have a bunch of conditions in which to determine different types of
>questions to ask in a survey I am constructing.
>Just was wondering if anybody has used a two-dimensional switch
>statement.
Not yet.
>If this works, is this an efficient coding method or would
>anybody else have another way around this?
Should work. Just some notes:
* I would use the ternary operator instead of the if-statements to keep
the code a bit shorter (and more readable for me).
* You should initialize the $surveyType variable, just in case a switch
statement will fail.
* There was a brace and a "break" missing after the nested switch.
* Don't quote numeric values in a switch statement or in a query.
* Don't forget to validate the $ip and $userage before passing them to
the function. They are used in a database query. If you don't make
sure they only contain allowed values, this may lead to an SQL
injection hole.
You could also use PDO with prepared statements to avoid this risk.
Your function slightly modified:
function determineUser($type, $userage, $ip, $visit) {
$surveyType = 0;
switch ($type) {
case 'employee':
switch ($userage) {
case 1:
case 2: $surveyType = $visit ? 1 : 2; break;
case 3:
case 4: $surveyType = 3;
}
break;
case 'client': $surveyType = $visit ? 4 : 5; break;
case 'peer': $surveyType = $visit ? 6 : 7;
}
if ($surveyType != 0) {
$query = "
INSERT INTO user (userip, userage, idsurvey)
VALUES ('$ip', $userage, $surveyType)";
mysql_query($query);
return getUserId($ip);
} else {
// something went wrong
}
}
HTH
Micha
Re: two-dimensional switch statement?
am 22.08.2007 21:35:36 von gosha bine
Miyagi wrote:
> I have a bunch of conditions in which to determine different types of
> questions to ask in a survey I am constructing.
> Just was wondering if anybody has used a two-dimensional switch
> statement. If this works, is this an efficient coding method or would
> anybody else have another way around this?
>
> $type = enters _POST as (employee, client, or peer)
> $visit = enters _POST as ( 0 or 1 )
> $userage = enters _POST as ( 1, 2, 3, or 4)
> $ip is the IP address of the user
>
> function determineUser($type, $userage, $ip, $visit)
> {
>
> switch ($type){
> case 'employee':
> switch ($userage){
> case '1':
> case '2': if($visit){$surveyType=1;}else{$surveyType=2;} break;
> case '3':
> case '4': $surveyType=3; break;
> case 'client': if($visit){$surveyType=4;}else{$surveyType=5;}
> break;
> case 'peer': if($visit){$surveyType=6;}else{$surveyType=7;} break;
> }
>
> $query = "INSERT INTO user(userip, userage, idsurvey)
> VALUES('$ip','$userage','$surveyType')";
> mysql_query($query);
>
> return (getUserId($ip));
> }
>
> Thanks.
>
I think using an explicit configuration / lookup table would make the
code far more maintainable. Something along the lines of
function get_survey_type($type, $age, $visit)
{
// lookup key is either 'type-age-visit'
// or 'type-visit' (assumes any age)
static $map = array(
'employee-1-1' => 1,
'employee-2-1' => 1,
//
'client-1' => 4,
'client-0' => 5,
);
$key = "$type-$age-$visit";
if(isset($map[$key]))
return $map[$key];
$key = "$type-$visit";
if(isset($map[$key]))
return $map[$key];
return default or error;
}
--
gosha bine
extended php parser ~ http://code.google.com/p/pihipi
blok ~ http://www.tagarga.com/blok