3

我有一个表格,我正试图用它来跟踪啤酒批次。由于酿造过程需要数周甚至数月,我无法一次完成所有表格。当我第一次为啤酒创建记录时,我的大部分值都设置为 NULL。当我检索记录并尝试更新它时,它还会将我的所有 NULL 值更新为零。如何仅将更改的值从我的表单发送到数据库,以便将其余的值保留为 NULL?

下面是我的更新代码示例(请原谅任何 PDO 违规行为 - 这是我第一次尝试使用 PDO)。

    <?php
//Connect to Database
try {
    $DBH = new PDO('mysql:host=localhost; dbname=dbname', 'user', 'password');
    }
catch (PDOException $e) {
    echo $e->getMessage();
    exit();
}
//Build Update SQL Query
$update = "UPDATE brewlog
          SET
            BrewDate = :BrewDate,
            EndOfPrimary = :EndOfPrimary,
            EndOfSecondary = :EndOfSecondary,
            PackagingDate = :PackagingDate,
            AnticipatedOG = :AnticipatedOG,
          WHERE ID = :ID";
//Prepare Query, Bind Parameters, Excute Query
$STH = $DBH->prepare($update);
$STH->bindParam(':ID', $_POST['ID'],PDO::PARAM_INT);
$STH->bindParam(':BrewDate', $_POST['BrewDate'],PDO::PARAM_STR,10);
$STH->bindParam(':EndOfPrimary', $_POST['EndOfPrimary'],PDO::PARAM_STR,10);
$STH->bindParam(':EndOfSecondary', $_POST['EndOfSecondary'],PDO::PARAM_STR,10);
$STH->bindParam(':PackagingDate', $_POST['PackagingDate'],PDO::PARAM_STR,10);
$STH->bindParam(':AnticipatedOG', $_POST['AnticipatedOG'],PDO::PARAM_INT);
$STH->execute();
?>
4

3 回答 3

4

您可能希望在绑定数据之前对其进行验证。说类似

if(!empty($_POST['EndOfPrimary'])) {
   $eop = $_POST['EndOfPrimary'];
} else {
   $eop = NULL;
}

然后绑定

$STH->bindParam(':EndOfPrimary', $eop,PDO::PARAM_STR,10);

编辑:您还可以使用此验证来检查该字段是否留空。看起来您可能想要输入一个日期,因此您可能会检查用户是否实际输入了一个日期,如果没有,则将他们发送回表单,并提供一些关于他们犯错的有用信息。这是我用来验证日期的正则表达式。

function pcre_date($subject) {
return preg_match('/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/', $subject);
/*
 *  matches 01/01/1984, 1/1/1984, but NOT 1/1/84
 *  wants mm/dd/yyyy
 */
} // returns 0 for non valid, 1 for valid

然后我会用它来验证

if(!empty($_POST['EndOfPrimary'])) {
    if(pcre_date($_POST['EndOfPrimary'])) {
        $eop = $_POST['EndOfPrimary'];
    } else {
        $form_errors[] = "Please format date as mm/dd/yyyy.";
    }
} else {
    $eop = NULL;
}
于 2013-05-17T20:42:41.820 回答
2

要干净地完成此操作,请使用两个步骤:

在呈现给用户的表单中,维护已更改字段的列表。例如,当用户修改输入字段中的数据时,使用 Javascript 将该字段的内容复制到要提交的隐藏表单中。然后当用户点击“提交”时,只发送隐藏表单的内容,而不是包含所有字段的原始表单的内容。

在您的 PHP 脚本中,根据提供的字段构建您的查询。您的查询现在将仅包含已修改的字段。这样,当您执行UPDATE语句时,未更改的字段将保持不变。

于 2013-05-17T20:40:43.170 回答
0

对不起乔治,我猜你对他想要做的事情要复杂得多。

实际上,当您使用 时_POST['somevar'],如果该字段为空白,您会得到一个 EMPTY 字符串。并将空字符串保存到数据库中,因此该字段不再为 NULL

如果没有捕获任何值,确保字段在数据库中保持为 NULL 的最简单方法是:

$STH->bindParam(':EndOfPrimary', isset($_POST['EndOfPrimary'])?$_POST['EndOfPrimary']:null ,PDO::PARAM_STR,10);
于 2013-05-17T20:46:35.800 回答