如何通过使用默认情况下已在数据库中设置的值来防止“未定义索引”?

问题描述

我正在为网站管理面板,该面板将更改网站设置。一切都按预期方式进行,但提交某些值时得到的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':
        ...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...