Jump to content

I want 0 to be a number, not false


Wickham

Recommended Posts

I've got a form where people will be able to enter a vote from 0 to 10 inclusive. So far I've dealt with the empty box (rejected), entries more than 10 (rejected) and entries 1 to 10 (accepted) but 0 gets treated as an empty box because I can see the echo statement it produces. How do I get 0 in the form treated as a true number?

 

Here's a snippet

 

if(empty($_POST['rating']))

{echo "

Rating must be between 0 and 10.

Use your back button to try again.

"; }

elseif($rating > 10)

{echo "

Rating must be less than 10.

Use your back button to try again.

"; }

elseif($rating

{echo "

You rated {$item} as {$rating} out of 10.

Thank You.

Use your back button to vote for another song.

";}

elseif($rating = 0)

{echo "

You rated {$item} as {$rating} 0 out of 10.

Thank You.

Use your back button to vote for another song.

";}

}

else

{ echo "

Please submit form.

";.........................

 

The last one elseif($rating = 0) doesn't work nor does elseif($rating == 0)

 

The form works well except for rejecting 0.

Link to comment
Share on other sites

OK, It works on its own, I had it in the wrong order before.

 

However, it's now confused with the Empty situation. If I have the 0 statement first:-

$rating = $_POST['rating'];

$item = $_POST['item'];

if($rating == 0)

{echo "

You rated {$item} as 0 out of 10.

Thank You.

Use your back button to vote for another song.

";}

elseif(empty($_POST['rating']))

{echo "

Rating must be between 0 and 10 inclusive.

Use your back button to try again.

"; }

elseif($rating > 10)

{echo "

Rating must be equal to or less than 10.

Use your back button to try again.

"; }

elseif($rating

{echo "

You rated {$item} as {$rating} out of 10.

Thank You.

Use your back button to vote for another song.

";}

}

else ..........

 

Someone entering 0 gets the "0 out of ten" (correct) but someone submitting an empty input box also gets "0 out of 10 Thank You" instead of Try Again.

 

If I put the Empty situation first:-

 

if(empty($_POST['rating']))

{echo "

Rating must be between 0 and 10 inclusive.

Use your back button to try again.

"; }

elseif($rating == 0)

{echo "

You rated {$item} as 0 out of 10.

Thank You.

Use your back button to vote for another song.

";}

 

then someone entering an empty box gets Try Again but someone entering 0 also gets Try Again, so the first conditional statement sets the value for the next or to put it another way, once the 0 is a number the Empty statement also treats an empty box as a number 0.

>




PHP test



This is testing WampServer2.
if(isset($_POST['sendit']))
{
$rating = $_POST['rating'];
$item = $_POST['item'];
if(empty($_POST['rating'])) 
{echo "
Rating must be between 0 and 10 inclusive.
Use your back button to try again."; }
elseif($rating == 0) 
{echo "
You rated {$item} as 0 out of 10.
Thank You.
Use your back button to vote for another song.";}
elseif($rating > 10) 
{echo "
Rating must be equal to or less than 10.
Use your back button to try again."; }
elseif($rating {echo "
You rated {$item} as {$rating} out of 10.
Thank You.
Use your back button to vote for another song.";}
}
else 
{ echo "
Please submit form.";
?>
</pre>
<form action="test-form-conditional-statementa.php" method="post">

Song 1
Song 2

Rating (out of 10 please):  

</form>
<br>}<br>?><br><p>Other page content here.</p>
<br><br><br

Edited by Wickham
Link to comment
Share on other sites

Yes I could, but I'm trying to learn. I realise that 0 is treated as false in Boolean so your code gets one part of the code working to make it true but for some reason the Empty statement and the 0 statement are linked and give the same result so depending on the order, one of them is wrong.

 

Somewhere I need to convert a true to false or vice versa.

Link to comment
Share on other sites

the == comparison operator does type coersion. When you say "if ( $var == 0 )", you're really saying "If you typecast 0 to the type of $var, are they equivalent?"

 

The === operator, on the other hand, tests both value and type.

 

I'm not sure if I"m being clear - its been a long day at work - so here are some examples

 

$var = 0;

if( $var == 0 ){ ... } //this executes
if( $var == false ){ ... } //this executes

if( $var === 0 ){ ... } //this executes
if( $var === false ){ ... } //this does not execute

 

PHP manual entry for comparison operators:

http://us2.php.net/operators.comparison

Link to comment
Share on other sites

With the code I've got in post 3, with the Empty statement first, using elseif($rating == 0) for the second statement the 0 input is treated like an empty box and echos

Rating must be between 0 and 10 inclusive.

Use your back button to try again.

 

which is the incorrect text for 0 input but it's correct for Empty box input. Edit: my guess is that the 0 statement would treat 0 as a number (not false) but the processor gets to the Empty statement first where it treats 0 as Empty (Empty is true - there is no input) and echos the Empty text "Try Again" and stops and never reaches the 0 statement.

 

It's the same using if(strlen($rating) == 0)

 

If I reverse the order and put the Empty statement second using if($rating == 0) for the 0 statement first I get

You rated Song 1 as 0 out of 10.

Thank You.

Use your back button to vote for another song.

 

for both a 0 input (correct) and an empty box input (wrong - it must now be treating an empty box as Empty - there is an input of 0 which is now a number therefore Empty is false).

 

If i use if(strlen($rating) == 0) for the first 0 statement both empty and 0 inputs wrong, they have echo text swapped.

 

I haven't tried lwsimon's solution yet.

Edited by Wickham
Link to comment
Share on other sites

I've found the answer. The problem as I said was that when someone enters 0 it's treated like Empty so all my different attempts made Empty the same text as 0, except one where the Empty and 0 produced different echo text, but swapped. I could have swapped the text but that would have been cheating.

 

It was using elseif(strlen($rating) == 0) but 0 is false so I realised that if I made that elseif(strlen($rating) == 1) it would make it true, even though it's checking whether 0 is in the string. It can also be elseif(strlen($rating) == true).

 

I also decided to change the order so that the more correct options were first and the Empty statement was last if there were no numbers and 0 was not a string 0. I also changed =1 (equal to or over 1) - after numbers over 10 have been rejected.

 

>




PHP test



This is testing WampServer2.
if(isset($_POST['sendit']))
{
$rating = $_POST['rating'];
$item = $_POST['item'];
if($rating > 10) 
{echo "
Rating must be equal to or less than 10.
Use your back button to try again."; }
elseif($rating >= 1) 
{echo "
You rated {$item} as {$rating} out of 10.
Thank You.
Use your back button to vote for another song.";}
elseif(strlen($rating) == true)  //ie true not false 0 or elseif(strlen($rating) == 1)
{echo "
You rated {$item} as 0 out of 10.
Thank You.
Use your back button to vote for another song.";}
elseif(empty($_POST['rating'])) 
{echo "
Nothing entered.
Rating must be between 0 and 10 inclusive.
Use your back button to try again."; }
}
else 
{ echo "
Please submit form.";
?>
</pre>
<form action="test-form-conditional-statementf2.php" method="post">

Song A
Song B

Rating (out of 10 please):  

</form>
<br>}<br>?><br><p>Other page content here.</p>
<br><br><br><br

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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.

Loading...
×
×
  • Create New...