不能对函数调用的结果使用 isset()(可以使用 "null != Func ()" 代替)
Cannot use isset () on the result of a function call (you can use "null != Func ()" instead)
( ! ) 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";
?>
加载索引文件时,它应该检测设备并将其重定向到正确的根目录,但在我的情况下它没有
我收到以下错误
( ! ) 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
将isset()
用作:
if(!defined('WAP')){
if(isset($_REQUEST['wap']) || isset($_REQUEST['wap2']) || ..){
$wap = $_REQUEST['wap']);
$wap2 = $_REQUEST['wap2']);
//other variables
define('WAP', $wap || $wap2 || ..);
}
}
删除第二个示例中的 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()
函数将 return 一个已经计算为 true/false 的值,因此您也不需要 isset()
。查看 PHP Manual for filter_input() 中的 return 值了解更多信息。
您可能还想查看 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\web4.html
您需要 create/move 该位置的文件,或者更改包含路径以指向正确的文件位置。你可以给我文件位置,我会给你正确的包含路径。
首先,NetBeans IDE 会向您显示这些警告,这样您就不会直接信任 $_REQUEST
值并以某种方式对其进行验证。通过检查 isset($_REQUEST['wap'])
,您已经在检查 IDE 所建议的部分。此过程可能还有其他步骤,您应该在 使用 之前执行这些步骤,例如插入数据库。我忽略了许多 NetBeans 警告,因为 NetBeans 不知道我将如何处理我的输入/变量。它只是警告我最佳实践,这可能对我的情况来说是最好的,也可能不是。 警告 应仅作为建议,而不是您必须 做的事情。
其次,如果你使用filter_input(),你不需要额外使用isset()
。因为,filter_input()
已经在为您做这件事了。正如文档所说,
Return Values : Value of the requested variable on success, FALSE
if the filter fails, or NULL
if the variable_name variable is not set. If the flag FILTER_NULL_ON_FAILURE
is used, it returns FALSE
if the variable is not set and NULL
if the filter fails.
因此您只需删除 isset()
并且您的代码应该可以安全运行。但您可能仍想检查该值是否设置为应用替代值。在这种情况下,只需使用 empty() 函数,当从 filter_input()
编辑的值 return 为 NULL
/ FALSE
时,它将 return 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' : '')))))));
}
第二个错误
Notice: Undefined index: ALL_HTTP
我在 $_SERVER 的 php 文档中找不到任何名为 ALL_HTTP
的变量。所以检查 link 并找到一个可以满足您的目的。我不确定你到底想用它得到什么,所以我不能提出任何建议。
第三个错误
Warning: include(web/404.html): failed to open stream.
错误提示文件不存在。因此,要么文件不存在,要么您提供的路径不正确。请检查并修复它。
您应该考虑使用更可靠的代码:
第 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
虽然第一部分没有直接回答您的问题,但它是一个重要说明,可能会在您的申请中为您省去很多麻烦。您错误地使用了常量,这可能会反噬您。
考虑以下代码:
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']));
这些行表示“如果未定义 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(又名 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()
。您可以执行以下三种操作之一来规避此问题:
- 如 PHP 所建议的那样,改为使用
null !==
。这可能是最简单的 shorthand 解决方案。
示例:
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, 'imode', FILTER_SANITIZE_STRING);
如果(isset($imode))
...
您可以使用 function
return 值来确定结果。如果第三方或内置函数没有正确的 return 值,您甚至可以创建自定义函数来为您处理逻辑。
例如,如果您只是想确保一个值不等于 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
如果过滤器失败则 return false,如果变量不存在则为 null。因此,完全省略 isset
可能更有利,这将导致您进行逻辑检查以确定变量是否存在,而过滤器可能会失败。
我应该注意到过滤器在生产中失败的可能性很低。回到我原来的观点,它如此低的原因之一是因为过滤器是常量,并且 ALWAYS 代表相同的东西。
( ! ) 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";
?>
加载索引文件时,它应该检测设备并将其重定向到正确的根目录,但在我的情况下它没有 我收到以下错误
( ! ) 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
将isset()
用作:
if(!defined('WAP')){
if(isset($_REQUEST['wap']) || isset($_REQUEST['wap2']) || ..){
$wap = $_REQUEST['wap']);
$wap2 = $_REQUEST['wap2']);
//other variables
define('WAP', $wap || $wap2 || ..);
}
}
删除第二个示例中的 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()
函数将 return 一个已经计算为 true/false 的值,因此您也不需要 isset()
。查看 PHP Manual for filter_input() 中的 return 值了解更多信息。
您可能还想查看 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\web4.html
您需要 create/move 该位置的文件,或者更改包含路径以指向正确的文件位置。你可以给我文件位置,我会给你正确的包含路径。
首先,NetBeans IDE 会向您显示这些警告,这样您就不会直接信任 $_REQUEST
值并以某种方式对其进行验证。通过检查 isset($_REQUEST['wap'])
,您已经在检查 IDE 所建议的部分。此过程可能还有其他步骤,您应该在 使用 之前执行这些步骤,例如插入数据库。我忽略了许多 NetBeans 警告,因为 NetBeans 不知道我将如何处理我的输入/变量。它只是警告我最佳实践,这可能对我的情况来说是最好的,也可能不是。 警告 应仅作为建议,而不是您必须 做的事情。
其次,如果你使用filter_input(),你不需要额外使用isset()
。因为,filter_input()
已经在为您做这件事了。正如文档所说,
Return Values : Value of the requested variable on success,
FALSE
if the filter fails, orNULL
if the variable_name variable is not set. If the flagFILTER_NULL_ON_FAILURE
is used, it returnsFALSE
if the variable is not set andNULL
if the filter fails.
因此您只需删除 isset()
并且您的代码应该可以安全运行。但您可能仍想检查该值是否设置为应用替代值。在这种情况下,只需使用 empty() 函数,当从 filter_input()
编辑的值 return 为 NULL
/ FALSE
时,它将 return 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' : '')))))));
}
第二个错误
Notice: Undefined index: ALL_HTTP
我在 $_SERVER 的 php 文档中找不到任何名为 ALL_HTTP
的变量。所以检查 link 并找到一个可以满足您的目的。我不确定你到底想用它得到什么,所以我不能提出任何建议。
第三个错误
Warning: include(web/404.html): failed to open stream.
错误提示文件不存在。因此,要么文件不存在,要么您提供的路径不正确。请检查并修复它。
您应该考虑使用更可靠的代码:
第 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
虽然第一部分没有直接回答您的问题,但它是一个重要说明,可能会在您的申请中为您省去很多麻烦。您错误地使用了常量,这可能会反噬您。
考虑以下代码:
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']));
这些行表示“如果未定义 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(又名 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()
。您可以执行以下三种操作之一来规避此问题:
- 如 PHP 所建议的那样,改为使用
null !==
。这可能是最简单的 shorthand 解决方案。
示例:
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, 'imode', FILTER_SANITIZE_STRING); 如果(isset($imode)) ...
您可以使用
function
return 值来确定结果。如果第三方或内置函数没有正确的 return 值,您甚至可以创建自定义函数来为您处理逻辑。
例如,如果您只是想确保一个值不等于 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
如果过滤器失败则 return false,如果变量不存在则为 null。因此,完全省略 isset
可能更有利,这将导致您进行逻辑检查以确定变量是否存在,而过滤器可能会失败。
我应该注意到过滤器在生产中失败的可能性很低。回到我原来的观点,它如此低的原因之一是因为过滤器是常量,并且 ALWAYS 代表相同的东西。