当我做strpos时,PHP认为null为0

时间:2014-11-19 00:51:13

标签: php

当$ position中的字符不存在时,PHP认为null为0。

  

$ statusentery = $ _POST [status];   
$ position = strpos($ statusentery,"<");

     

if($ position == 0){
  echo"抱歉,出于安全考虑,我们不这样做   允许使用<&#;;等字符;    
退出;   
  }

例如,如果$ statusentery等于"你好",它会返回"抱歉,出于安全考虑,我们不允许使用<"等字符。 (意外)

如果$ statusentery等于" Howdy那里<"它将返回空白(预期)。

如何使它工作,以便当我进入"你好"时,它没有做if循环,但当我进入"<你在那里>",它做了if循环?

2 个答案:

答案 0 :(得分:2)

因为0在PHP中可能意味着“假”,所以当$ post不存在时,$ post将为false。所以你需要使用以下内容:

if ($position === 0){

在PHP中使用三重等号验证比较的值是否具有相同的数据类型。可以在此处找到更多信息:http://php.net/manual/en/language.operators.comparison.php

答案 1 :(得分:2)

来自:http://php.net/manual/es/function.strpos.php

  

警告

     

因为strpos可能返回FALSE(子字符串缺席)或0(子字符串   在字符串的开头),严格的与松散的等价运算符必须是   非常小心地使用。

     

要知道子字符串不存在,您必须使用:

     

=== FALSE

     

要知道存在子串(在包括0的任何位置),你   可以使用以下任何一种:

     

!== FALSE(推荐)

     
    

-1(注意:或大于任何负数)

  
     

要知道子字符串位于字符串的开头,您必须使用:

     

=== 0

     

要知道子字符串在开头以外的任何位置,你   可以使用以下任何一个:

     
    

0(推荐)!= 0(注意:但不是!== 0也等于FALSE)!= FALSE(推荐为高度混淆)

  
     

另请注意,您无法将“”值与返回值进行比较   strpos。使用松散等价运算符(==或!=)它将返回   结果不区分子串的存在   与位置。使用严格等价运算符(===或!==)   将永远返回虚假。

所以代码必须是:

$statusentery = $_POST[status];
$position = strpos($statusentery,"<");

if ($position === 0){
echo "Sorry, for security purposes we do not allow characters such as <";
exit;
}