Интересно, есть ли какие-нибудь лучшие идеи для решения проблемы ниже,
У меня есть форма с несколькими полями ввода, например,
<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;