У меня есть сом-код для веб-сайта, который раньше работал нормально. Я хочу проверить, установлена ли переменная или сессия. Я использовал следующий код:
if ($_GET['something']){ //Do something }
Теперь я пытаюсь установить его на локальном сервере, при этом я получаю код ошибки, говорящий о наличии неопределенного индекса.
Это требует от меня сделать:
if (isset($_GET['']) { //Do something }
Могу ли я сделать быстрое решение для этого, так как я не хочу менять код так много мест?
Вы не получили ошибку раньше, потому что ваши настройки error_reporting и / или display_error были слишком простыми. Ваш первый фрагмент является попытка получить доступ к значению в массиве, который может не существовать. Если это не PHP всегда выдает уведомление.
Это только после было выпущено уведомление о том, что его можно замять (отключив display_errors
или настройка error_reporting
не сообщать об уведомлениях (~E_NOTICE
).
Вы просите быстрого исправления:
if (isset($_GET['something']))
требуется только добавить isset()
, Это быстро, и это решает проблему. Кроме того: использование isset
это то, что ты должен делать. Всегда.
Не по теме, но, возможно, полезно:
Как я объяснил в комментариях: лучший способ действий для вас сейчас — это решить проблему самостоятельно, а не игнорировать уведомления. С этой целью простой скрипт, который сканирует каталоги ваших проектов для файлов .php (используя glob
), читает их и ищет шаблон, который может оказаться полезным:
foreach ($phpFiles as $file)
{
$code = file_get_contents($file);//read the file
if (preg_match_all('/if\s*\(\$[^[]+\[[^]]+\]\s*\)/',$code, $matches))
{//find all usages of "if ($rawVar['offset'])" in code
echo 'Expressions to check or fix in file: ', $file,':', PHP_EOL, '=>';
echo implode(PHP_EOL.'=>', $matches[0]), PHP_EOL;
}
}
запустите скрипт, возможно, запишите результат во временный файл и установите для работы. Вывод должен выглядеть примерно так:
Expressions to check or fix in file: scriptname.php:
=> if ($_GET['something'])
=> if ($var[123])
И так далее. Это работоспособный формат, и со временем вы можете написать скрипт для автоматического рефакторинга кода.
Возможно, более полное (как в полном) регулярное выражение для использования здесь будет что-то вроде:
/if\s*\((\|\||&&|\()?\$[^[]+\[[^]]+\]\s*(\|\||&&|\))?/
Но здесь тоже есть некоторые оговорки, но это только начало.
Добавление назначений — я сделаю вам еще одну услугу: добавление кода, который устраняет проблемы, возникающие в выражениях назначений, таких как $var = $_GET['something'];
, Это можно сделать автоматически, и довольно просто:
foreach ($phpFiles as $file)
{
$code = file_get_contents($file);//read the file
$clean = preg_replace(
'/(\$[^\s]+\s*={1}\s*)(\$[^[]+[^]]+\])\s*;/',
'$1isset($2) ? $2 : null;',
$code
);
file_put_contents($file, $clean);
}
Я проверил этот код так:
$code = '$foo = 123;
$foo = $_GET["bar"];';
$clean = preg_replace(
'/(\$[^\s]+\s*={1}\s*)(\$[^[]+[^]]+\])\s*;/',
'$1isset($2) ? $2 : null;',
$code
);
echo $clean, PHP_EOL;
И это дало ожидаемый результат:
$foo = 123;
$foo = isset($_GET["bar"]) ? $_GET["bar"] : null;
Объедините эти два регулярных выражения, и вы должны быть на пути к рефакторингу кода, который у вас есть …
Проверьте, есть ли у вас параметр
что-то
если это не так, передайте некоторые фиктивные значения для проверки.
Есть два способа исправить или скрыть это.
Первый вариант лучше и может быть сделан с isset()
функция, и это лучшее решение.
Другой способ — скрыть ошибки уведомления, с которыми вы можете сделать это. error_reporting(E_ALL & ~E_NOTICE);
Я не рекомендую это решение
Будет работать без уведомления, если у вас есть значение $_GET['something']
при проверке или это уже определено. Также у вас есть сообщение об ошибке на на вашем локальном сервере, а не на втором сервере, поэтому вы будете получать уведомления на локальном сервере.
if ($_GET['something']){
если не определено, вам нужно использовать isset()
или же empty()
чтобы избежать php уведомлений.
if (isset($_GET['something'])){ // will check variable is already set
if (!empty($_GET['something'])){ // will check variable value is not blank or 0
или вам нужно инициализировать переменную с пустым или с некоторыми предопределенными значениями.
использовать это может быть полезно, если (isset (@ $ _ GET [»])) {}