【问题标题】:Is there an easy way to skip updating a field to an empty value in a database?有没有一种简单的方法可以跳过将字段更新为数据库中的空值?
【发布时间】:2011-12-26 22:44:46
【问题描述】:

这从用户填写带有可选输入的表单开始。这些值通过 AJAX 传递到另一个 PHP 页面以插入到数据库中。如果特定输入为空,我不想更新存储在数据库中的数据。除了编写大量if 语句之外,有没有办法检查输入值是否为空?如果为空,如何写语句让MySQL不更新数据库中的对应字段?

if(isset($_POST['f_name']) && isset($_POST['m_name']) && isset($_POST['l_name']) && isset($_POST['alt_name'])){
    $fname = $_POST['f_name'];
    $mname = $_POST['m_name'];
    $lname = $_POST['l_name'];
    $altname = $_POST['alt_name'];

如果某些 $_POST 条目为空,则不应将它们放入数据库中。我这样说是因为如果数据库中已经存在一个值,我不想用空值覆盖该值。

【问题讨论】:

标签: php


【解决方案1】:

在这种情况下,您也不允许人们只输入blank space / &bnsp;

<?php
$empty = FALSE;

foreach ($_POST as $key)
{
    if (!isset($key) || strlen(trim($key)) != 0)
    {
      $empty = TRUE;
    }
}

if (!$empty)
{
    $fname = $_POST['f_name'];
    $mname = $_POST['m_name'];
    $lname = $_POST['l_name'];
    $altname = $_POST['alt_name'];
}
?>

【讨论】:

  • if(!empty) 适用于所有变量?我希望能够插入所有没有空格的变量。我是否也将查询更新放入 if(!empty) 中?
  • 所以我可以输入UPDATE user SET fname = '$fname', mname = '$mname', lname = '$lname', altname = '$altname';并且每个设置的参数只有在没有空输入时才有效?
  • 是的..但不要忘记先验证输入!!
  • @EnricoPallazzo:嘿,我有同样的问题,我正在使用 CodeIgniter。将帮助我如何在 CodeIgniter 模型中使用此代码,我正在使用存储过程来存储/更新数据。
【解决方案2】:

嗯...您可以使用 foreach 来检查所有值。

$empty = FALSE;
   foreach ($_POST as $key) {
    if (!isset($key)) {
      $empty = TRUE;
       break;
   }
}

if (!$empty) {
$fname = $_POST['f_name'];
    $mname = $_POST['m_name'];
    $lname = $_POST['l_name'];
    $altname = $_POST['alt_name'];
}

【讨论】:

  • 在这种情况下,您还允许人们只使用 space / &amp;nbsp;。而且,您在第 3 行缺少 )
  • 是的,感谢您指出这一点。 if ($key == '') 可能会解决这个问题。除非我又错过了什么
  • @Mr.Pallazzo:在空格的情况下,该值不为空,并且在问题的上下文中,不应被过滤。
  • @adlawson 这是我随处可见的常见错误。我怀疑是否有人将&lt;space&gt; 作为他们的名字、中间名或姓氏。
  • @Darvex if (!isset(trim($key))) 有点没用。如果你使用trim(),你需要像这样使用它:strlen(trim($key)) != 0。首先删除空格,如果剩余字符串的长度等于0,它将返回 false。
【解决方案3】:

我通常使用速记 if 语句(也称为三元运算符)来做这样的事情。您也许可以像这样编写 SQL 查询:

$query = "UPDATE my_table SET f_name = ".(!empty($fname) ? "'$fname'" : 'f_name').", m_name = ".(!empty($mname) ? "'$mname'" : 'm_name').", ";
//etc.. etc.. 

【讨论】:

  • 你有一个 SQL 注入漏洞。
  • 更不用说使用f_name = f_name 的查询(或任何东西,真的)是非常讨厌的。
  • 值不应直接插入到语句中。相反,使用位置参数构建语句并使用准备好的语句。
  • @SLaks 显然我会在上面发布的行之前处理这个问题。我发布的解决方案只是一个用于演示逻辑的小 sn-p 示例。 @adlawson 在这种情况下它很好,我用它来简单地设置一个字段的值等于它自己,以防用户提供的值为空。
猜你喜欢
  • 2019-03-10
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2010-11-14
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
相关资源
最近更新 更多