PHP: короткое сокращение для isset и! Empty?

Интересно, есть ли какие-нибудь лучшие идеи для решения проблемы ниже,

У меня есть форма с несколькими полями ввода, например,

<input name="pg_title" type="text" value="" /> <input name="pg_subtitle" type="text" value="" /> <input name="pg_description" type="text" value="" /> <input name="pg_backdate" type="text" value="" /> etc 

Но иногда мне не нужны определенные поля ввода выше в моей форме, например, мне нужен только заголовок страницы для моей инъекции дБ,

 <input name="pg_title" type="text" value="" /> etc 

И у меня есть другая страница php для обработки данных $_POST ,

 $pg_title = null; $pg_subtitle = null; $pg_description = null; $pg_backdate = null; if(isset($_POST['pg_title']) && !empty($_POST['pg_title']) ) $pg_title = $_POST['pg_title']; if(isset($_POST['pg_subtitle']) && !empty($_POST['pg_subtitle']) ) $pg_subtitle = $_POST['pg_subtitle']; if(isset($_POST['pg_description']) && !empty($_POST['pg_description']) ) $pg_description = $_POST['pg_description']; if(isset($_POST['pg_backdate']) && !empty($_POST['pg_backdate']) ) $pg_backdate = $_POST['pg_backdate']; 

Каждый раз, когда мне нужно будет проверить, задано ли значение $_POST определенного поля ввода, а not empty , в противном случае его переменная будет иметь значение null , так что я не буду вводить пустое пространство в свой db.

Я обнаружил, что isset и !empty в if-условии очень повторяются, когда у меня есть длинный список переменных для обработки.

Есть ли функция php по умолчанию, чтобы « сократить » процесс выше? Или мне нужно написать функцию определения пользователя, чтобы справиться с этим?

Или, может быть, есть еще один способ сделать это?

Благодарю.

РЕДАКТИРОВАТЬ:

Большое спасибо за помощь.

Просто добавочный код на моей php-странице, который обрабатывает данные $ _POST,

 $sql = " UPDATE root_pages SET pg_url = ?, pg_title = ?, pg_subtitle = ?, pg_backdate = ?, pg_description = ?, ... updated_by = ? WHERE pg_id = ? "; $result = $connection->run_query($sql,array( $pg_url, $pg_title, $pg_subtitle, $pg_backdate, $pg_description, ... $pg_id )); 

как вы видите, что в моем запросе всегда присутствуют $pg_subtitle, $pg_backdate, $pg_description, etc . д. поэтому, если я получаю $pg_subtitle = '' вместо $pg_subtitle = null когда в нем нет данных, у моей записи db будет пустое место для этого столбца.

Благодаря 🙂

Вы можете использовать простую функцию

 function post_value_or($key, $default = NULL) { return isset($_POST[$key]) && !empty($_POST[$key]) ? $_POST[$key] : $default; } 

Затем используйте:

 $pg_title = post_value_or('pg_title'); // OR with a default $pg_title = post_value_or('pg_title', 'No Title'); 

isset && !empty избыточно. Конструкция empty языка в основном сокращается !isset($foo) || !$foo !isset($foo) || !$foo , причем !empty эквивалентен isset($foo) && $foo . Таким образом, вы можете сократить код, оставив проверку isset .

Гораздо проще:

 $values = array('pg_title' => null, 'pg_subtitle' => null, …); $values = array_merge($values, $_POST); // use $values['pg_title'] etc. 

Если вы не хотите, чтобы ваши значения по умолчанию были перезаписаны значениями false , например '' , вы можете сделать что-то вроде этого:

 $values = array_merge($values, array_filter($_POST)); 

Просто имейте в виду, что '0' ложно .

empty($var) является аббревиатурой для !( isset($var) && $var ) .

Итак !empty($_POST['...']) будет достаточно для вашей ситуации – вызов isset который у вас в настоящее время является избыточным.

Определенная пользователем функция, я боюсь. Но они достаточно короткие. У меня есть кто-то, лежащий где-то, если вы хотите взглянуть, но это действительно тривиально, как вы можете себе представить.

Обновить:

Вот один, который я нашел:

 define('PARAM_INT', 0); define('PARAM_STR', 1); function get_param($name, $default = null, $type = PARAM_INT) { $value = $default; if (isset($_POST[$name])) { $value = $_POST[$name]; } else if (isset($_GET[$name])) { $value = $_GET[$name]; } switch($type) { case PARAM_INT: $value = (int)$value; break; case PARAM_STR: break; default: // error your heart out here } return $value; } 

Конечно, теперь все классные дети делают это с filter_var , но идея такая же.

+1 для array_merge() но я думаю, что тем не менее короткая форма для:

 if (isset($_POST['some_var']) and !empty($_POST['some_var'])) $some_var = $_POST['some_var']; else $some_var = NULL; 

должно быть:

 $some_var = $_POST['some_var'] ? $_POST['some_var'] : NULL; 

да, это вызывает уведомление об «неопределенном индексе», но оно проверяет как наличие, так и пустоту

EDIT: и, конечно, возвращает NULL, как и спросил OP.

Во время небольшого исследования я нашел интересную «функцию управления потоком» для этого случая, которую я никогда раньше не использовал: NULLIF ()

Таким образом, вы можете выполнить эту задачу без PHP. Просто оберните в него все переменные:

 NULLIF('".$_REQUEST['some_var']."', '') 

в вашем запросе вместо '".$_REQUEST['some_var']."'

Если переменная пуста или не существует, она будет равна NULLIF('', '') пока '' == '' вернет NULL. В противном случае он вернет первую переменную arg ==.

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

Я всегда делаю это нелюбимым. Но лучший подход заключается в том, чтобы преодолеть мантру микро оптимизации и использовать конструкцию синтаксиса, которая была разработана для этого @ .

Фактически я лгу. Я слишком часто использую isset() . (Но, по крайней мере, я знаю, что это не очень ярко.) И для новых проектов я теперь использую объектно-ориентированные суперглобалы , которые объединяют фильтрацию и неявные тесты isset в обертки $ _POST, $ _GET, $ _REQUEST. $_REQUEST->ascii["title"] или $_GET["raw"] больше не выводят отладочные сообщения.

Эта функция проверяет, установлена ​​ли переменная, не пуста, в конце концов, если имеет какое-либо значение.

 /** * @param var - testing variable * @param value * @return boolean */ function is(&$var, $value = null){ if(!is_null($value)){ return IsSet($var) && $var == $value; } return IsSet($var) && !empty($var); } echo $_GET['id']; // this produce Warning echo is($_GET['id'])?'1':'0'; // return false echo $_GET['id']; // after first using function is(), will not be produce Warning!!! is($_GET['id']); // return false IsSet($_GET['id']); // return false $_GET['id'] = 7; is($_GET['id'], 7); // return true; 

У меня недостаточно комментариев для комментариев. Однако предположение о том, что владкрасы использовали:

 $some_var = $_POST['some_var'] ? $_POST['some_var'] : NULL; 

не соответствует E_ALL. Вы должны проверять ключи массива перед доступом к ним, используя либо empty (), либо isset (), как предложили другие. Специально для ввода пользователем.

Кроме того, его второе предложение использовать функцию MySQL «NULLIF ()» следующим образом:

 NULLIF('".$_REQUEST['some_var']."', '') 

еще хуже. Вставка несанкционированного ввода пользователем непосредственно в SQL-запрос является первичным вектором для атаки SQL-инъекций.

Это интересный вопрос, и я жду ответов.

Однако, небольшой трюк, вы можете сделать inline:

 $pg_title = isset($_POST['pg_title']) && !empty($_POST['pg_title']) ? $_POST['pg_title'] : null;