开发者

PHP if() evaluation problem needs a rewrite

I noticed this weird evaluation yesterday after searching for a few hours in my code for an error. i am passing scores into php, sometim开发者_Go百科es the score=0 which causes an issue.

send php ?blah=blah&score=0

if(!empty($_REQUEST['score']){
    //do database update stuff
}else{
   // show entire webpage
}

It works great unless the score=0 the if() will evaluate to false and return the entire webpage to my ajax handler and error. I have temporarily changed !empty to isset but this will cause problems in the future because isset evaluates to true even if the score key is in the url string without a value.

ex: (?blah=blah&score=&something=else)

my question is: what is the best way to recode this to work correctly now and in the future?

edit: there are a few working answers here, i appreciate everyones time. it was difficult to choose an answer


As the manual says, a variable is considered empty() if it has an empty or zero value.

So it will treat your variable wrongly as empty even though 0 is a perfectly acceptable value in your case.

If you need score to be a number, you could use isset() in combination with a is_numeric() check instead:

if((isset($_REQUEST['score']) and (is_numeric($_REQUEST['score'])){

Check out the manual page to see the kinds of values is_numeric() accepts. If score is always an integer, you can also use is_int((int)$_REQUEST['score']) but that will convert invalid input values to 0.

Additionally, as @sightofnick says, it's better to use explicit $_GET or $_POST instead of $_REQUEST.

Re your update:

In that case I would

  1. Do check whether the variable is "0" (string "zero")
  2. If it is "0", make it 0 (integer "zero")
  3. If it is not 0, convert it to an integer (int)$_REQUEST["score"])
  4. If the conversion resulted in 0, it was invalid input - exit
  5. You have a valid integer variable.


empty() will return false if a value is zero. Use isset() or array_key_exists() instead, if you want to check if a variable in an array is set:

if (array_key_exists('score', $_REQUEST)) {...}


Try doing

if (isset($_REQUEST['score']) && ($_REQUEST['score'] !== '')) {
 ...
}

The isset will handle the presence/absence of the query parameter, and the strict string (!==) comparison will handle the case where the 'score' query is present but has no value. PHP treats all data coming from _GET/_POST/_REQUEST as strings, so this test is 100% reliable.


if(isset($_REQUEST['score']) && $_REQUEST['score'] != ''){
    //do database update stuff
}else{
   // show entire webpage
}


You may be able to solve that with

if (isset($_REQUEST['score']) && is_numeric($_REQUEST['score'])) {}

That of course if scrore can only contain numeric value

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜