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

Posted

技术标签:

【中文标题】如何通过默认使用已在数据库中设置的值来防止“未定义索引”? [复制]【英文标题】:How do I prevent `undefined index` by using values already set in a database by default? [duplicate] 【发布时间】:2021-01-14 06:46:23 【问题描述】:

我正在为我的网站创建一个管理面板,该面板将更改网站设置。除了提交一些值时我收到的 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”的东西,但我对如何在我的代码中使用它感到有些困惑。

【问题讨论】:

听说过“null coalescing operator”吗? @mickmackusa 我没有,请给我更多信息。 @mickmackusa 你能否根据我上面的代码给我一个例子? 我觉得你的问题不清楚。我在我的手机上。 (因为现在是凌晨 3 点,我要回去睡觉了)我不知道你提到的数字是哪几行。请阅读如何发布minimal reproducible example。 您可以使用默认值预先填充 html 表单。但如果该字段可以是可选的,则需要使用 isset()。就是这样。 【参考方案1】:

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

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

?>

【讨论】:

在这种情况下为什么不能使用 (bool)? @lucas 当一个页面可以通过引用预先存在的页面来解决时,请投票关闭而不是回答。这样 Stack Overflow 就不需要存储多余的页面了。【参考方案2】:

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

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

【讨论】:

请帮我解决这个问题。 ***.com/questions/64081641/…

以上是关于如何通过默认使用已在数据库中设置的值来防止“未定义索引”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式连接到已在 Android 手机中设置的 ***

如何使用hapi.js读取已在浏览器中设置的cookie

如何将已在 MySQL 中设置的变量返回给 PHP

样式化数据网格

返回 url 发布到 PayPal 将覆盖已在 paypal 商家帐户中设置的返回 url

如何获取一个元素没有在style和样式表中设置的样式的值?