【问题标题】:How would one skip empty field values when submitting a form using PHP?使用 PHP 提交表单时如何跳过空字段值?
【发布时间】:2018-01-10 06:49:17
【问题描述】:

我有一个表单,它使用 PHP 从 MySQL 数据库中回显特定用户的值。我试图弄清楚如何允许用户提交表单以更新他们的用户信息,但让表单跳过他们没有填写的任何字段。

当前更新声明

if (!isset($_POST['btnLogin'])) {
    $db = DB();
    $stmt = "UPDATE users SET fName = :fName, 
                              lName = :lName, 
                              emailAddress = :emailAddress 
                              WHERE user_id = $user->user_id";
    $query = $db->prepare($stmt);
    $query->bindParam(':fName', $_POST['fName'], PDO::PARAM_STR);
    $query->bindParam(':lName', $_POST['lName'], PDO::PARAM_STR);
    $query->bindParam(':emailAddress', $_POST['emailAddress'], PDO::PARAM_STR);
    $query->execute();
};

表单回显用户信息

<form class="form-horizontal" action="profile.php" method="post">
                <div class="form-group">
                    <label class="col-lg-3 control-label">First name:</label>
                    <div class="col-lg-8">
                        <input class="form-control" type="text" name="fName" placeholder="<?php echo $user->fName ?>"/>
                    </div>
                </div>
                <div class="form-group">
                    <label class="col-lg-3 control-label">Last name:</label>
                    <div class="col-lg-8">
                        <input class="form-control" type="text" name="lName" placeholder="<?php echo $user->lName ?>">
                    </div>
                </div>
                <div class="form-group">
                    <label class="col-lg-3 control-label">Email:</label>
                    <div class="col-lg-8">
                        <input class="form-control" type="email" name="emailAddress" placeholder="<?php echo $user->emailAddress?>">
                    </div>
                </div>
                <div class="form-group">
                    <label class="col-md-3 control-label">Username:</label>
                    <div class="col-md-8" style="margin-top: 7px;">
                        <?php echo $user->username ?>
                    </div>
                </div>
                <div class="form-group">
                    <label class="col-md-3 control-label"></label>
                    <div class="col-md-8">
                        <input class="btn btn-primary" name="btnUpdate" value="Save Changes" type="button">
                        <span></span>
                        <input class="btn btn-default" value="Cancel" type="reset">
                    </div>
                </div>
            </form>

目前这似乎根本不会更新数据库。如果我将表单完全留空并提交,则数据库中存在的值现在为空。即,只是空白列。

我一直在查看有关如何执行此操作的其他示例,但我似乎无法弄清楚这一点。任何帮助将不胜感激。

为了确保我实际上更新了正确的用户,我确保我的 $user-&gt;user_id 语句实际上从数据库中返回了正确的 user_id 以进行更新。

更新

目前这就是我拥有更新语句/代码的方式

if(!empty(['btnUpdate'])) {
$stmt = "UPDATE users SET fName = IF(:fName = '', fName, :fName), 
                lName = IF(:lName = '', lName, :lName), 
                emailAddress = IF(:emailAddress = '', emailAddress, :emailAddress)
        WHERE user_id = $user->user_id";
$db = DB();
$query = $db->prepare($stmt);
$query->bindParam("fName", $fName, PDO::PARAM_STR);
$query->bindParam("lName", $lName, PDO::PARAM_STR);
$query->bindParam("emailAddress", $emailAddress, PDO::PARAM_STR);
$query->execute();
}

使用&lt;?php var_dump($_POST) ?&gt; 提交表单后返回0,我仍然得到空的数据库列

【问题讨论】:

  • $_POST['$fName'] 是名称上的拼写错误。您还应该绑定$user-&gt;user_id。如果设置了$fName,则应该不加引号或用双引号。
  • 我不确定我是否完全理解您的评论。我看到 fName 上的错字。如果我只是抓取user_id而不提交,是否需要绑定?
  • 您的代码中还有其他拼写错误:您的命名占位符在bindParam() 中使用时,必须以: 开头,即$query-&gt;bindParam(':lName'...)。您在 $_POST 对象中引用对象的方式也不正确:例如,$_POST['$fName'] 应该是 $_POST['fName']
  • @Terry 没有必要了。
  • 您需要动态构建查询。使用empty 函数(除非0 是您的某些字段的有效值)。你应该到处绑定,不要在查询中放变量。

标签: php mysql forms


【解决方案1】:

这不会忽略空字段,但更用户友好的解决方案是将数据库值粘贴到每个输入的 value 属性中。这样,如果字段为空,您就不必跳过这些字段,并且用户在编辑数据时不会感到困惑。如果您不希望他们能够编辑该值,只需包含 readonly 属性即可。

如果您不想这样做,您可以创建动态查询或使用 if 语句来决定使用哪个值,表单的还是数据库的。

【讨论】:

    【解决方案2】:

    您可以让查询检查该值是否为空,并重用现有值。

    $stmt = "UPDATE users SET fName = IF(:fName = '', fName, :fName), 
                              lName = IF(:lName = '', lName, :lName), 
                              emailAddress = IF(:emailAddress = '', emailAddress, :emailAddress)
                              WHERE user_id = $user->user_id";
    

    您还可以动态构建查询和参数。

    $sets = array();
    $params = array();
    foreach (array('fName', 'lName', 'emailAddress') as $field) {
        if (!empty($_POST[$field])) {
            $sets[] = "$field = :$field";
            $params[":$field"] = $_POST['field'];
        }
    }
    if (!empty($sets)) {
        $sets_string = implode(', ', $sets)
        $stmt = "UPDATE users SET $sets_string WHERE user_id = :id";
        $params[":id"] = $user->user_id;
        $query = $db->prepare($stmt);
        $query->execute($params);
    }
    

    【讨论】:

    • 我假设我应该根据数据库中的当前值设置每个输入的值?
    • 看起来您已经在这样做了。如果他们不修改该字段,他们只会将其设置为相同的值,这应该不是问题。为什么需要跳过任何内容?
    • 我不是 100% 确定我在这里做错了什么。我尝试了查询检查路线,但是当我提交表单时,我仍然会在数据库中显示空白值。
    • 试试var_dump($_POST)看看实际的帖子值是多少。
    • 它正在返回 0
    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2014-09-09
    • 2015-08-20
    • 1970-01-01
    相关资源
    最近更新 更多