Jump to content

PHP, SWITCH statement, and NULL Values


snorky

Recommended Posts

PHP 4.3.8

 

I can't figure out the correct syntax for the case condition in a switch statement where one of the case conditions is a NULL value.  :facewall: :facewall:

 

For a switch statement I have 3 conditions:

 

[*]variable's value is NULL // NULL

[*]variable's value is "" // blank & NOT NULL

[*]variable's value is "abcdef" // not blank (and therefore NOT NULL)

 

The switch statement looks like this

switch(var)
{
case * (where * is some kind of NULL -- see below):
	do something #0;
	break;

case ""
	do something #1;
	break;

case "!=''"
	do something #2;
	break;
}

* Case NULL is the joker in the deck. I've tried it 5 different ways.

 

case "= NULL":

case NULL:

case "NULL":

case IS_NULL():

case "IS_NULL()":

 

None of the 5 works correctly when the condition is a NULL value. Each of those has a different -- and incorrect -- result set for

variable's value is NULL // NULL

variable's value is "" // blank & NOT NULL

variable's value is "abcdef" // not blank (and therefore NOT NULL)

Link to comment
Share on other sites

You're using case wrong, but case null: should work.

 

switch only compares the value of the variable you pass it. It does not allow you perform any conditions.

 

$var = null;

switch($var)
{
    case null:
       echo '$var is NULL';
    break;

    case '':
       echo '$var has no value or is emtpy';
    break;
}

Link to comment
Share on other sites

You're using case wrong, but case null: should work.

 

switch only compares the value of the variable you pass it. It does not allow you perform any conditions.

 

$var = null;

switch($var)
{
    case null:
       echo '$var is NULL';
    break;

    case '':
       echo '$var has no value or is emtpy';
    break;
}

 

/* ---------------------- */

 

The goal is to produce a report. There is a while loop that spins out the report based on what happens in the while loop. The report looks fine (except that one column): all of the other elements of the report - including some generated by other switch statements (none of which have NULL as a possible value) - look as designed.

 

(Note: I changed :one" to NONE" - oops!)

 

Here's how I got the variable where NULL is a possible value:

The table has a column named emdiff.

The PHP to produce the report is next:

 

while($row=mysql_fetch_array($rpt1))

    ....

    $emdiff= $row["emdiff"];

// note: there several other columns in this mysql_fetch_array

// all of them work as designed - including switch statements - but none of them has a condition where NULL is one of the possible values

// in the process, values are assigned to $var2 and $var3

    ....

 

Then the switch statement in question:

switch($emdiff)
{
   case * (where * is some kind of NULL -- see below):
      print "";
      break;

   case ""
      print $emdiff . " abcdef";
      break;

   case "!=''"
      print $var2 . $var3;
      break;

}  // end switch statement

} // end while loop

In the result set

a. when $emdiff is  NULL the field displays as designed (meaning: it displays an empty result)

b. when $emdiff is  =""    print $emdiff . " abcdef"; does not display, even though it should display

c. when $emdiff is  !=""  print $var2 . $var3;  displays as designed

 

When I use the other attempts at case * (some expression of NULL),  I get various mixes of a, b, and c

 

Link to comment
Share on other sites

In the above,

The report looks fine (except that one column): all of the other elements of the report - including some generated by other switch statements (one of which has NULL as a possible value) - look as designed

 

Should read

 

The report looks fine (except that one column): all of the other elements of the report - including some generated by other switch statements (NONE of which have NULL as a possible value) - look as designed.

 

That oopsie changes a lot.... sorry for the confusion.

Link to comment
Share on other sites

I came up up with a way to get the desired result. It's kludgey, involving nested if-else statements.

 

<?php
// there are 3 possible values for $emdiff:
// NULL, "" (blank), and (non-blank)
if(isset($emdiff))		// if emdiff is NOT NULL
{
if($emdiff !='')	// emdiff is NOT NULL and NOT blank 
{
	do task a;
}
else			// emdiff is NOT NULL and is blank(empty)
{		
	do task b;
}     
}
else				//	otherwise, emdiff is NULL
{
do task c;
}
?>

 

If anyone can come up with a more elegant solution, I'd love to see it. I suspect that a switch/case would be better, but I struck out dozens of times trying.


Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.