( ! ) Fatal error: Cannot use isset() on the result of a function call (you can use "null !== func()" instead) in C:\Users\sanoj\Documents\NetBeansProjects\video-site\app\detect.php on line 45
Call Stack
# Time Memory Function Location
1 0.0000 234208 {main}( ) ..\index.php:0
以前我的代码是
if(!defined('WAP'))
define('WAP', isset($_REQUEST['wap']) || isset($_REQUEST['wap2']) || isset($_REQUEST['imode'])|| isset($_REQUEST['html'])|| isset($_REQUEST['Android'])|| isset($_REQUEST['iphone'])|| isset($_REQUEST['IEMobile']));
if (WAP)
{
define('WIRELESS_PROTOCOL', isset($_REQUEST['wap']) ? 'wap' : (isset($_REQUEST['wap2']) ? 'wap2' : (isset($_REQUEST['iphone']) ? 'iphone' : (isset($_REQUEST['imode']) ? 'imode' : (isset($_REQUEST['IEMobile']) ? 'IEMobile' :(isset($_REQUEST['html']) ? 'html' : (isset($_REQUEST['Android']) ? 'Android' : '')))))));
我的IDE警告Do Not Access SuperGlobal $_REQUEST Array Directly
所以我使用了以下代码
if(!defined('WAP'))
{
define('WAP', isset(filter_input(INPUT_REQUEST, 'wap', FILTER_SANITIZE_STRING)) || isset(filter_input(INPUT_REQUEST, 'wap2', FILTER_SANITIZE_STRING)) || isset(filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING))|| isset(filter_input(INPUT_REQUEST, 'html', FILTER_SANITIZE_STRING))|| isset(filter_input(INPUT_REQUEST, 'Android', FILTER_SANITIZE_STRING))|| isset(filter_input(INPUT_REQUEST, 'iphone', FILTER_SANITIZE_STRING))|| isset(filter_input(INPUT_REQUEST, 'IEMobile', FILTER_SANITIZE_STRING)));
}
if (WAP)
{
define('WIRELESS_PROTOCOL', isset(filter_input(INPUT_REQUEST, 'wap', FILTER_SANITIZE_STRING)) ? 'wap' : (isset(filter_input(INPUT_REQUEST, 'wap2', FILTER_SANITIZE_STRING)) ? 'wap2' : (isset(filter_input(INPUT_REQUEST, 'iphone', FILTER_SANITIZE_STRING)) ? 'iphone' : (isset(filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING)) ? 'imode' : (isset(filter_input(INPUT_REQUEST, 'IEMobile', FILTER_SANITIZE_STRING)) ? 'IEMobile' :(isset(filter_input(INPUT_REQUEST, 'html', FILTER_SANITIZE_STRING)) ? 'html' : (isset(filter_input(INPUT_REQUEST, 'Android', FILTER_SANITIZE_STRING)) ? 'Android' : '')))))));
以下是detect.php
<?php
$userBrowser = $_SERVER['HTTP_ACCEPT'];
if(stristr($userBrowser, 'application/vnd.wap.xhtml+xml'))
{
$_REQUEST['wap2'] = 1;
}
elseif(stripos($_SERVER['HTTP_USER_AGENT'],"iPod"))
{
$_REQUEST['iphone'] = 1;
}
elseif(stripos($_SERVER['HTTP_USER_AGENT'],"iPhone"))
{
$_REQUEST['iphone'] = 1;
}
elseif(stripos($_SERVER['HTTP_USER_AGENT'],"Android"))
{
$_REQUEST['Android'] = 1;
}
elseif(stripos($_SERVER['HTTP_USER_AGENT'],"IEMobile"))
{
$_REQUEST['IEMobile'] = 1;
}
elseif(stristr($userBrowser, 'DoCoMo/' || 'portalmmm/'))
{
$_REQUEST['imode'] = 1;
}
elseif(stristr($userBrowser, 'text/vnd.wap.wml'))
{
$_REQUEST['wap'] = 1;
}
elseif(stristr($userBrowser, 'text/html'))
{
$_REQUEST['html'] = 1;
}
if(!defined('WAP'))
define('WAP', isset($_REQUEST['wap']) || isset($_REQUEST['wap2']) || isset($_REQUEST['imode'])|| isset($_REQUEST['html'])|| isset($_REQUEST['Android'])|| isset($_REQUEST['iphone'])|| isset($_REQUEST['IEMobile']));
if (WAP)
{
define('WIRELESS_PROTOCOL', isset($_REQUEST['wap']) ? 'wap' : (isset($_REQUEST['wap2']) ? 'wap2' : (isset($_REQUEST['iphone']) ? 'iphone' : (isset($_REQUEST['imode']) ? 'imode' : (isset($_REQUEST['IEMobile']) ? 'IEMobile' :(isset($_REQUEST['html']) ? 'html' : (isset($_REQUEST['Android']) ? 'Android' : '')))))));
if (WIRELESS_PROTOCOL == 'wap')
{
$browser_t = "mobile";
}
elseif (WIRELESS_PROTOCOL == 'wap2')
{
$browser_t = "mobile";
}
elseif (WIRELESS_PROTOCOL == 'imode')
{
$browser_t = "mobile";
}
elseif (WIRELESS_PROTOCOL == 'iphone')
{
$browser_t = "smartphone";
}
elseif (WIRELESS_PROTOCOL == 'Android')
{
$browser_t = "smartphone";
}
elseif (WIRELESS_PROTOCOL == 'IEMobile')
{
$browser_t = "smartphone";
}
elseif (WIRELESS_PROTOCOL == 'html')
{
$mobile_browser = '0';
if(preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone)/i',
strtolower($_SERVER['HTTP_USER_AGENT']))){
$mobile_browser++;
}
if((strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml')>0) or
((isset($_SERVER['HTTP_X_WAP_PROFILE']) or isset($_SERVER['HTTP_PROFILE'])))){
$mobile_browser++;
}
$mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'],0,4));
$mobile_agents = array(
'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
'wapr','webc','winw','winw','xda','xda-');
if(in_array($mobile_ua,$mobile_agents)){
$mobile_browser++;
}
if (strpos(strtolower($_SERVER['ALL_HTTP']),'OperaMini')>0) {
$mobile_browser++;
}
if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']),'iemobile')>0) {
$mobile_browser++;
}
if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']),'windows')>0) {
$mobile_browser=0;
}
if($mobile_browser>0){
// do something wap
$browser_t = "mobile";
}
// non-mobile
else
{
$_SESSION['Browser_d'] = "web";
$browser_t = "web";
}
} else {
// do something else html
$_SESSION['Browser_d'] = "web";
$browser_t = "web";
}
}
else
{
$mobile_browser = '0';
if(preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone)/i',
strtolower($_SERVER['HTTP_USER_AGENT']))){
$mobile_browser++;
}
if((strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml')>0) or
((isset($_SERVER['HTTP_X_WAP_PROFILE']) or isset($_SERVER['HTTP_PROFILE'])))){
$mobile_browser++;
}
$mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'],0,4));
$mobile_agents = array(
'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
'wapr','webc','winw','winw','xda','xda-');
if(in_array($mobile_ua,$mobile_agents)){
$mobile_browser++;
}
if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']),'iemobile')>0) {
$mobile_browser++;
}
if (strpos(strtolower($_SERVER['ALL_HTTP']),'OperaMini')>0) {
$mobile_browser++;
}
if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']),'windows')>0) {
$mobile_browser=0;
}
if($mobile_browser>0){
// do something wap
$browser_t = "mobile";
}
// non-mobile
else
{
$_SESSION['Browser_d'] = "web";
$browser_t = "web";
}
}
?>
index.php
<?php
include "app/config.php";
include "app/detect.php";
if ($page_name=='') {
include $browser_t.'/index.html';
}
elseif ($page_name=='index.html') {
include $browser_t.'/index.html';
}
elseif ($page_name=='singlepage.html') {
include $browser_t.'/singlepage.html';
}
elseif ($page_name=='categories.html') {
include $browser_t.'/categories.html';
}
elseif ($page_name=='contact.html') {
include $browser_t.'/contact.html';
}
else
{
include $browser_t.'/404.html';
}
?>
config.php
<?php
$current_page_uri = $_SERVER['REQUEST_URI'];
$part_url = explode("/", $current_page_uri);
$page_name = end($part_url);
$email_id = "s.hidayath@agileits.com";
?>
当加载索引文件时,它应该检测设备并将其重定向到正确的root,但在我的情况下它不会 我收到以下错误
( ! ) Notice: Undefined index: ALL_HTTP in C:\Users\sanoj\Documents\NetBeansProjects\video-site-2\app\detect.php on line 118
Call Stack
# Time Memory Function Location
1 0.0090 233992 {main}( ) ..\index.php:0
2 0.0230 295896 include( 'C:\Users\sanoj\Documents\NetBeansProjects\video-site-2\app\detect.php' ) ..\index.php:11
( ! ) Warning: include(web/404.html): failed to open stream: No such file or directory in C:\Users\sanoj\Documents\NetBeansProjects\video-site-2\index.php on line 30
Call Stack
# Time Memory Function Location
1 0.0090 233992 {main}( ) ..\index.php:0
( ! ) Warning: include(): Failed opening 'web/404.html' for inclusion (include_path='.;C:\php\pear') in C:\Users\sanoj\Documents\NetBeansProjects\video-site-2\index.php on line 30
Call Stack
# Time Memory Function Location
1 0.0090 233992 {main}( ) ..\index.php:0
答案 0 :(得分:4)
首先, NetBeans IDE 会向您显示这些警告,以便您不会直接信任$_REQUEST
值并以某种方式对其进行验证。通过检查isset($_REQUEST['wap'])
,您已经在检查IDE建议的哪个部分。此过程可能还有其他步骤,您应该在使用之前执行此操作,例如插入数据库。我忽略了许多NetBeans警告,因为NetBeans不知道我将如何处理输入/变量。它只是警告我最佳做法,这可能是也可能不是我的最佳做法。 警告应仅作为建议,而不是必须所做的事情。
其次,如果您使用filter_input(),则不需要另外使用isset()
。因为,filter_input()
已经为你做了。正如文档所说,
返回值:请求变量成功时的值,如果过滤器失败则为
FALSE
,如果未设置variable_name变量,则为NULL
。如果使用了标记FILTER_NULL_ON_FAILURE
,则如果未设置变量,则返回FALSE
,如果过滤器失败,则返回NULL
。
因此,您只需删除isset()
,您的代码就可以安全地运行。但您可能仍想检查该值是否已设置为应用替代值。在这种情况下,只需使用empty()函数,当FALSE
返回的值为filter_input()
/ NULL
时,该函数将返回FALSE
。所以只是否定符合条件的条件。就像这样 -
if(!defined('WAP'))
{
define('WAP', !empty(filter_input(INPUT_REQUEST, 'wap', FILTER_SANITIZE_STRING)) || !empty(filter_input(INPUT_REQUEST, 'wap2', FILTER_SANITIZE_STRING)) || !empty(filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING))|| !empty(filter_input(INPUT_REQUEST, 'html', FILTER_SANITIZE_STRING))|| !empty(filter_input(INPUT_REQUEST, 'Android', FILTER_SANITIZE_STRING))|| !empty(filter_input(INPUT_REQUEST, 'iphone', FILTER_SANITIZE_STRING))|| !empty(filter_input(INPUT_REQUEST, 'IEMobile', FILTER_SANITIZE_STRING)));
}
if (WAP)
{
define('WIRELESS_PROTOCOL', !empty(filter_input(INPUT_REQUEST, 'wap', FILTER_SANITIZE_STRING)) ? 'wap' : (!empty(filter_input(INPUT_REQUEST, 'wap2', FILTER_SANITIZE_STRING)) ? 'wap2' : (!empty(filter_input(INPUT_REQUEST, 'iphone', FILTER_SANITIZE_STRING)) ? 'iphone' : (!empty(filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING)) ? 'imode' : (!empty(filter_input(INPUT_REQUEST, 'IEMobile', FILTER_SANITIZE_STRING)) ? 'IEMobile' :(!empty(filter_input(INPUT_REQUEST, 'html', FILTER_SANITIZE_STRING)) ? 'html' : (!empty(filter_input(INPUT_REQUEST, 'Android', FILTER_SANITIZE_STRING)) ? 'Android' : '')))))));
}
第二次错误
注意:未定义的索引:ALL_HTTP
我无法在$_SERVER的php文档中找到任何名为ALL_HTTP
的变量。因此,请检查链接并找到一个可以满足您目的的链接。我不确定你究竟想要用它做什么,所以我无法提出任何建议。
第三次错误
警告:include(web / 404.html):无法打开流。
错误已经说明文件不存在。所以要么文件没有,要么你提供的路径不正确。请检查并修复它。
答案 1 :(得分:2)
在第二个示例中删除isset()
个调用,它应该可以正常工作。
if(!defined('WAP'))
{
define('WAP', filter_input(INPUT_REQUEST, 'wap', FILTER_SANITIZE_STRING) || filter_input(INPUT_REQUEST, 'wap2', FILTER_SANITIZE_STRING) || filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING)|| filter_input(INPUT_REQUEST, 'html', FILTER_SANITIZE_STRING)|| filter_input(INPUT_REQUEST, 'Android', FILTER_SANITIZE_STRING)|| filter_input(INPUT_REQUEST, 'iphone', FILTER_SANITIZE_STRING)|| filter_input(INPUT_REQUEST, 'IEMobile', FILTER_SANITIZE_STRING));
}
if (WAP)
{
define('WIRELESS_PROTOCOL', filter_input(INPUT_REQUEST, 'wap', FILTER_SANITIZE_STRING) ? 'wap' : (filter_input(INPUT_REQUEST, 'wap2', FILTER_SANITIZE_STRING) ? 'wap2' : (filter_input(INPUT_REQUEST, 'iphone', FILTER_SANITIZE_STRING) ? 'iphone' : (filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING) ? 'imode' : (filter_input(INPUT_REQUEST, 'IEMobile', FILTER_SANITIZE_STRING) ? 'IEMobile' :(filter_input(INPUT_REQUEST, 'html', FILTER_SANITIZE_STRING) ? 'html' : (filter_input(INPUT_REQUEST, 'Android', FILTER_SANITIZE_STRING) ? 'Android' : '')))))));
}
这是因为filter_input()
函数将返回一个已经计算为true / false的值,因此您也不需要isset()
。请查看PHP Manual for filter_input()中的返回值以获取更多信息。
您可能还想查看empty()
和is_null()
,看看他们在使用中与isset()
的对比情况。在这种情况下,函数empty()
会更有意义。
对于未定义%_SERVER['ALL_HTTP']
的问题,您应该使用isset()
来首先检查变量是否存在。例如:
if (isset($_SERVER['ALL_HTTP']) && strpos(strtolower($_SERVER['ALL_HTTP']), 'OperaMini') > 0) {
$mobile_browser++;
}
缺少404文件的错误是我无法在不知道文件放置位置的情况下解决的问题。但是,您正在使用的包含正在寻找:
C:\Users\sanoj\Documents\NetBeansProjects\video-site-2\web\404.html
您需要在该位置创建/移动文件,或更改包含路径以指向正确的文件位置。你可以给我文件位置,我会给你正确的包含路径。
答案 2 :(得分:1)
您应该考虑使用更隐蔽的代码:
第1步:在一个数组中获得符合您需求的变量
$tab=array_filter(filter_input_array(INPUT_SERVER,Array(
'wap' =>FILTER_SANITIZE_STRING,
'wap2' =>FILTER_SANITIZE_STRING,
'imode' =>FILTER_SANITIZE_STRING,
'html' =>FILTER_SANITIZE_STRING,
'Android' =>FILTER_SANITIZE_STRING,
'iphone' =>FILTER_SANITIZE_STRING,
'IEMobile'=>FILTER_SANITIZE_STRING)));
步骤2:使用检测到的第一个变量
if(!defined('WAP'))&&(count($tab)) {
define('WAP', $tab[0]);
}
另外,正如其他答案中所述,您必须使用filter_input()
函数才能满足IDE警告Do Not Access SuperGlobal $_REQUEST Array Directly
答案 3 :(得分:0)
将isset()
用作:
if(!defined('WAP')){
if(isset($_REQUEST['wap']) || isset($_REQUEST['wap2']) || ..){
$wap = $_REQUEST['wap']);
$wap2 = $_REQUEST['wap2']);
//other variables
define('WAP', $wap || $wap2 || ..);
}
}
答案 4 :(得分:0)
虽然第一部分没有直接回答你的问题,但这是一个重要的注意事项,可能会为你的应用程序带来很多麻烦。你错误地使用了常数,这可能会让你感到厌烦。
请考虑以下代码:
if(!defined('WAP'))
define('WAP', isset($_REQUEST['wap'])
|| isset($_REQUEST['wap2']) || isset($_REQUEST['imode'])
|| isset($_REQUEST['html'])|| isset($_REQUEST['Android'])
|| isset($_REQUEST['iphone'])|| isset($_REQUEST['IEMobile']));
这些行说&#34;如果未定义WAP,则如果以下任何一个在REQUEST
范围内,则为WAP分配值:wap,wap2,imode,html,Android,iphone,或IEMobile。如果它们不在请求范围内,则将WAP
常量赋值为false。
我知道这可能感觉微不足道,但是常量应该具有相同的值,而不管其他任何系统现实。常量应该很容易发现值。看看PHP如何使用常量来表达想法。 E_NOTICE
始终是相同的值。因此,您可以使用表示E_NOTICE
的整数(8),或者使用E_NOTICE
常量来获得相同的结果。
另一方面,如果E_NOTICE
等于8,除非您指定通知应触发致命错误,在这种情况下E_NOTICE
等于16(aka E_CORE_ERROR
),那么你手上有一点令人困惑的混乱。
考虑你的代码:
if(!defined('WAP'))
{
define('WAP', isset(filter_input(INPUT_REQUEST, 'wap', FILTER_SANITIZE_STRING))
|| isset(filter_input(INPUT_REQUEST, 'wap2', FILTER_SANITIZE_STRING))
|| isset(filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING))
|| isset(filter_input(INPUT_REQUEST, 'html', FILTER_SANITIZE_STRING))
|| isset(filter_input(INPUT_REQUEST, 'Android', FILTER_SANITIZE_STRING))
|| isset(filter_input(INPUT_REQUEST, 'iphone', FILTER_SANITIZE_STRING))
|| isset(filter_input(INPUT_REQUEST, 'IEMobile', FILTER_SANITIZE_STRING)));
}
你正在做很多心理体操,以确保将常数设置为特定的课程。虽然有一些方法可以清理这些代码以免触发错误,但它仍然会包含一个问题,可能会回来咬你,即你正在使用常量,你应该使用一个变量,或者,更好的是,一种功能。
喜欢,以下内容:
function is_wap()
{
return (filter_input(INPUT_REQUEST, 'wap2', FILTER_SANITIZE_STRING)
|| filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING)
|| filter_input(INPUT_REQUEST, 'html', FILTER_SANITIZE_STRING)
|| filter_input(INPUT_REQUEST, 'Android', FILTER_SANITIZE_STRING)
|| filter_input(INPUT_REQUEST, 'iphone', FILTER_SANITIZE_STRING)
|| filter_input(INPUT_REQUEST, 'IEMobile', FILTER_SANITIZE_STRING));
}
现在,将WAP
替换为is_wap()
。
更符合您的问题, 无法 使用isset()
对抗直接函数调用。你可以做三件事之一来规避这个:
null !==
。这可能是最简单的速记解决方案。示例:
if (isset(filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING)))
...
可以很容易地写成
if (null !== ($imode = filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING)))
...
同时为您提供变量作业。
如果您坚持使用isset()
,则可以预先指定变量。
$ imode = filter_input(INPUT_REQUEST,&#39; imode&#39;,FILTER_SANITIZE_STRING); if(isset($ imode)) ...
您可以使用function
返回值来确定结果。如果第三方或内置函数没有正确的返回值,您甚至可以创建自定义函数来处理您的逻辑。
例如,如果您只想确保某个值不等于null(并且您确定它为false),则可以使用:
function isNotNull($val)
{
return ($val !== null);
// note that, because you've essentially passed the function result,
// you could use this line instead:
// return isset($val);
}
然后,在您的代码中,您可以使用自定义函数:
isNotNull(filter_input(INPUT_REQUEST, 'wap', FILTER_SANITIZE_STRING))
|| isNotNull(filter_input(INPUT_REQUEST, 'wap2', FILTER_SANITIZE_STRING))
|| isNotNull(filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING))
|| isNotNull(filter_input(INPUT_REQUEST, 'html', FILTER_SANITIZE_STRING))
|| isNotNull(filter_input(INPUT_REQUEST, 'Android', FILTER_SANITIZE_STRING))
|| isNotNull(filter_input(INPUT_REQUEST, 'iphone', FILTER_SANITIZE_STRING))
|| isNotNull(filter_input(INPUT_REQUEST, 'IEMobile', FILTER_SANITIZE_STRING)));
请注意,因为filter_input
在过滤器失败时返回false,如果变量不存在则返回null。因此,完全省略isset
可能更有利,这将导致您的逻辑检查确定变量是否存在而过滤器可能失败的可能性。
我应该注意到过滤器生产失败的可能性很低。完全循环到我的原点,其中一个原因是因为过滤器是常量,始终代表同样的事情。