Нельзя использовать isset() в результате вызова функции (вместо этого можно использовать null != Func())

( ! ) 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 = "[email protected]";
?>

когда индексный файл загружен, он должен обнаружить устройство и перенаправить его в правильный корень, но в моем случае это не так. Я получаю следующую ошибку

( ! ) 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

person sanoj lawrence    schedule 23.01.2016    source источник
comment
Сама ошибка говорит вам, что использовать вместо isset(), вместо этого вы можете использовать null !== func()   -  person Rajdeep Paul    schedule 23.01.2016
comment
кстати: с isset вы можете тестировать несколько элементов одновременно ~ isset( $var, $var2, $var3, $var4 )   -  person Professor Abronsius    schedule 23.01.2016
comment
@RajdeepPaul я пробовал, но не работает   -  person sanoj lawrence    schedule 23.01.2016
comment
Isset проверяет, установлена ​​ли и инициализирована ли переменная. Результат функции, на мой взгляд, не может быть не задан. Чтобы проверить, установлена ​​ли переменная $_REQUEST['wap'], ваша первая конструкция подходит с точки зрения синтаксиса. Я предлагаю вам игнорировать предупреждение вашей IDE в этом случае.   -  person hherger    schedule 23.01.2016
comment
stristr($userBrowser, 'DoCoMo/' || 'portalmmm/') не делает то, что вы, вероятно, думали. Вам нужно использовать две разные проверки stristr или проверку preg_match.   -  person LSerni    schedule 29.01.2016
comment
Кроме того, вам, вероятно, следует проверить browscap: php.net/manual/en/function .get-browser.php   -  person LSerni    schedule 29.01.2016
comment
ошибка говорит о решении.   -  person Erkan Özkök    schedule 01.02.2016


Ответы (5)


Во-первых, среда IDE NetBeans показывает эти предупреждения, чтобы вы не доверяли значениям$_REQUEST напрямую и не проверяли их каким-либо образом. Проверяя isset($_REQUEST['wap']), вы уже делаете часть проверки, которую предлагает IDE. В этом процессе могут быть и другие шаги, которые вы должны выполнить перед его использованием, например вставка в базу данных. Я игнорирую многие предупреждения NetBeans, потому что NetBeans не знает, что я собираюсь делать со своими входными данными/переменными. Он просто предупреждает меня о лучших практиках, которые могут быть или не быть лучшими для моего случая. И предупреждения следует воспринимать только как предложения, а не как то, что вы должны делать.

Во-вторых, если вы используете filter_input(), вам не нужно использовать isset() кроме того. Потому что filter_input() уже делает это за вас. Как говорится в документации,

Возвращаемые значения : значение запрошенной переменной в случае успеха, FALSE в случае сбоя фильтра или NULL, если переменная variable_name не задана. Если используется флаг 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

Я не смог найти переменную с именем ALL_HTTP в документации по php для $_SERVER. . Так что проверьте ссылку и найдите тот, который может служить вашей цели. Я не уверен, что вы на самом деле пытаетесь получить с этим, поэтому я не могу ничего предложить.

Третья ошибка

Предупреждение: include(web/404.html): не удалось открыть поток.

Ошибка уже говорит, что файл не существует. Так что либо файла нет, либо вы указали неправильный путь. Пожалуйста, проверьте и исправьте это.

person Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ    schedule 26.01.2016
comment
а что насчет другого, правильно ли вы можете исправить полный файл detect.php - person sanoj lawrence; 27.01.2016
comment
@sanojlawrence Я добавил примечания к другим вашим проблемам выше. Пожалуйста, проверьте последнее редактирование. Кроме того, если у вас есть такая же проблема isset() в других файлах, я думаю, вы можете исправить ее таким же образом, если вы понимаете мою логику. Помните, что мы не предоставляем здесь никаких кодовых услуг, мы просто помогаем друг другу. :) - person Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ; 27.01.2016

Удалите вызовы 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 для 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

Вам нужно либо создать/переместить файл в это место, либо изменить путь включения, чтобы он указывал на правильное расположение файла. Вы можете указать мне местоположение файла, и я дам вам правильный путь включения.

person Siphon    schedule 25.01.2016
comment
а что насчет другого, правильно ли вы можете исправить полный файл detect.php - person sanoj lawrence; 27.01.2016
comment
Пожалуйста, смотрите вторую половину моего ответа для получения дополнительной информации об ошибках. - person Siphon; 27.01.2016

Вам следует рассмотреть возможность использования более понятного кода:

Шаг 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

person Adam    schedule 31.01.2016

Используйте isset() как:

    if(!defined('WAP')){
      if(isset($_REQUEST['wap']) || isset($_REQUEST['wap2']) || ..){
      $wap = $_REQUEST['wap']);
      $wap2 = $_REQUEST['wap2']);
      //other variables
      define('WAP', $wap || $wap2 || ..);
    }

}
person Jsparo30    schedule 23.01.2016

Хотя первая часть не дает прямого ответа на ваш вопрос, это важное примечание, которое, вероятно, избавит вас от многих проблем в вашем приложении. Вы неправильно используете константы, что может обернуться против вас.

Рассмотрим следующий код:

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 не определен, присвойте WAP значение true, если любой из следующих элементов находится в области REQUEST: wap, wap2, imode, html, Android, iphone или IEMobile. Если они НЕ указаны в запросе Scope, присвойте константе WAP значение false.

Я знаю, что это может показаться тривиальным, но константы должны иметь одно и то же значение независимо от любой другой системной реальности. Константы должны быть очень легко находить значения. Посмотрите, как PHP использует константы, чтобы получить представление. E_NOTICE всегда одно и то же значение. Таким образом, вы можете использовать целое число (8), которое представляет E_NOTICE, или вы можете использовать константу 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() против прямого вызова функции. Вы можете сделать одну из трех вещей, чтобы обойти это:

  1. Как предлагает PHP, вместо этого используйте null !==. Это, вероятно, самое простое решение для сокращения.

Пример:

if (isset(filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING)))
    ...

Можно так же легко записать как

if (null !== ($imode = filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING)))
    ...

Получение вашего назначения переменных, а также.

  1. Если вы настаиваете на использовании isset(), вы можете заранее назначить переменную.

    $imode = filter_input(INPUT_REQUEST, 'imode', FILTER_SANITIZE_STRING); если (isset($imode))...

  2. Вы можете использовать возвращаемые значения function для определения результата. Вы даже можете создать пользовательскую функцию для обработки вашей логики, если сторонняя или встроенная функция не имеет правильного возвращаемого значения.

Например, если вы просто хотите убедиться, что значение не равно null (и вы согласны с тем, что оно ложно), вы можете использовать это:

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, что заставит вашу логическую проверку определить, существует ли переменная, без возможности того, что фильтр может дать сбой.

Должен отметить, что вероятность отказа фильтра в производстве невелика. Возвращаясь к моей исходной точке, одна из причин, по которой она такая низкая, заключается в том, что фильтры являются константами и ВСЕГДА представляют одно и то же.

person smcjones    schedule 31.01.2016