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

How do I prevent `undefined index` by using values already set in a database by default?

我正在为我的网站开发一个管理面板,它将更改网站设置。一切都按照预期的方式工作,除了我在提交一些值时收到的 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”,但我对如何在我的代码中使用它感到有点困惑。

你有一系列来自数据库的设置,所以我想你有类似的东西

$options['cms_and_posting'] = 1;

然后您可以使用 foreach():

foreach (array_keys($options) as $key) {
    if (array_key_exists($key, $_POST)) {
        $options[$key] = $_POST[$key];
    }
}

请注意,在这里,您没有检查值是什么。通常你的配置 table 会像

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':
        ...

您可以使用空合并运算符。

 <?php
    
  if(!empty($_POST)) {
    $_POST['cms_and_posting'] = $_POST['cms_and_posting'] ?? $youdbvalue1;
    $_POST['google_verify'] =   $_POST['google_verify'] ?? $youdbvalue2;
  }

?>