问题描述
我正在为网站管理面板,该面板将更改网站设置。一切都按预期方式进行,但提交某些值时得到的PHP警告数量除外。我收到错误undefined index
。我知道您可以使用isset()
,但就我而言,那将非常混乱。如果未设置我的值,如何将数据库中的值用作默认值?
我的代码:
<?PHP
if(!empty($_POST)) {
$_POST['cms_and_posting'] = (bool) $_POST['cms_and_posting'];
$_POST['google_verify'] = (bool) $_POST['google_verify'];
}
?>
我听说过PHP中称为“ null-coalescing-operator”的内容,但是我对如何在代码中使用它感到困惑。
解决方法
您可以使用空合并运算符。
<?php
if(!empty($_POST)) {
$_POST['cms_and_posting'] = $_POST['cms_and_posting'] ?? $youdbvalue1;
$_POST['google_verify'] = $_POST['google_verify'] ?? $youdbvalue2;
}
?>
,
您从数据库中获得了一系列设置,所以我认为您有类似的东西
$options['cms_and_posting'] = 1;
然后您可以使用foreach()
:
foreach (array_keys($options) as $key) {
if (array_key_exists($key,$_POST)) {
$options[$key] = $_POST[$key];
}
}
请注意,此处您无需检查该值是什么。通常,您的配置表将类似于
varname varvalue vartype varregex varcomment
cms_and_posting 1 bool ^[01]$ Option
google_verify 1 bool ^[01]$ Option
user_email lserni@gmail.com email NULL Admin Email
pagesize 50 int ^\\d+$ Rows per page
...
您仍将运行foreach
周期,使用filter functions适当地验证每个条目:
switch($option['vartype']) {
case 'bool':
if (in_array($value,[ '1','Y','y','YES','ON',1 ],true)) {
$value = true;
} else if (in_array($value,[ '0','N','n','NO','OFF',0 ],true)) {
$value = false;
} else {
throw new \Exception("{$value} is not a valid boolean");
}
break;
case 'email':
...