У меня есть Сценарий PHP, что при загрузке проверьте сначала, был ли он загружен через POST, если не, если ДОБИРАЮТСЯ ['идентификатор'], число.
Теперь я знаю, что мог сделать это как это:
if(isset($_GET['id']) AND isNum($_GET['id'])) { ... }
function isNum($data) {
$data = sanitize($data);
if ( ctype_digit($data) ) {
return true;
} else {
return false;
}
}
Но я хотел бы сделать это этот путь:
if(isNum($_GET['id'])) { ... }
function isNum($data) {
if ( isset($data) ) {
$data = sanitize($data);
if ( ctype_digit($data) ) {
return true;
} else {
return false;
}
} else {
return false;
}
}
Когда я пробую его этот путь, если $ _GET ['идентификатор'] не установлен, я получаю предупреждение неопределенного индекса: идентификатор... Это похоже, как только я поместил свой $ _GET ['идентификатор'] в рамках моего вызова функции, это отправляет предупреждение... Даже при том, что моя функция проверит, установлен ли тот var или нет...
Есть ли другой способ сделать то, что я хочу сделать, или я вынужденный всегда проверить, что isset затем добавляют мои другие требования..??
Я всегда добавляю удобную функцию, которую предоставляют некоторые другие языки: get.
function get($needle, $haystack, $return=null) {
return array_key_exists($needle, $haystack) ? $haystack[$needle] : $return;
}
Теперь вы можете позвонить:
if(isNum(get('id', $_GET))) {
// do something here
}
Это то, что вы хотите, убедитесь, что идентификатор установлен ПЕРЕД вызовом isNum
:
if(isset($_GET['id']) && isNum($_GET['id'])) {
...
}
Вы ссылаетесь на неопределенный индекс при его первоначальной передаче. Вы можете сделать так:
$key = 'id';
function foo($id ) {
if ( isset( $_GET[$id] ) ) {
}
}
В качестве альтернативы вы можете просто сделать isset перед вызовом функции.
if ( isset($_GET['id']) && isNum($_GET['id'])) { }
Другой вариант - использовать временную переменную:
$foo = isset( $_GET['id'] ) ? $_GET['id'] : null;
if ( $foo ) { functionCall($foo); }
Вы также можете снизить уровень сообщений об ошибках, если вас это не так сильно беспокоит.
Вы можете изменить isNum
для получения параметра по ссылке
<?php
if(isNum($_GET['id'])) { ... }
function isNum(&$data) {
if (isset($data) ) {
$data = sanitize($data);
return ctype_digit($data);
} else {
return false;
}
}
Однако $ _ GET ['id']
будет неявно создан по вызову и инициализируется значением NULL
.
Если вас не устраивает это или хакерский характер этого решения, выберите другой ответ.
Вот элегантный способ сделать это с помощью специального класса:
Сначала определите класс SmartArray:
class SmartArray extends ArrayObject {
public static function convert(&$array) {
$array = new self($array);
}
public function offsetGet($index) {
return $this->offsetExists($index)? parent::offsetGet($index):NULL;
}
}
Затем просто вызовите:
SmartArray::convert($_GET);
Теперь ваш if ( isNum ($ _ GET ['id'])) {...}
больше не будет жаловаться, если $ _GET не имеет ключа 'id' :)