我有一个表单,我想用它来跟踪啤酒的批次。因为酿造过程需要几周甚至几个月的时间,我不能一次完成表格。当我第一次为啤酒创建记录时,我的大多数值都设置为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();
?>
您需要在绑定数据之前验证它。比如
if(!empty($_POST['EndOfPrimary'])) {
$eop = $_POST['EndOfPrimary'];
} else {
$eop = NULL;
}
然后绑定
$STH->bindParam(':EndOfPrimary', $eop,PDO::PARAM_STR,10);
编辑:您还可以使用此验证来检查字段是否为空之外的更多内容。看起来您可能希望输入日期,因此您可能需要检查用户是否实际输入了日期,如果没有,则将他们发送回表单,并提供一些有用的消息,说明他们在哪里犯了错误。这是我用来验证日期的regexp。
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;
}
要干净利落地完成这个任务,请使用两个步骤:
在呈现给用户的表单中,维护已更改字段的列表。例如,当用户修改输入字段中的数据时,使用Javascript将该字段的内容复制到要提交的隐藏表单中。然后当用户点击"提交"时,只发送隐藏表单的内容,而不是原始表单的所有字段的内容。
在PHP脚本中,根据提供的字段构建查询。您的查询现在将只包含已修改的字段。这样,当您执行UPDATE
语句时,未更改的字段将不受影响。
对不起,乔治,我猜你对他想做的事情太复杂了。
实际上,当您使用_POST['somevar']
时,如果字段为空,则得到一个EMPTY字符串。并将空字符串保存到数据库中,因此该字段不再为NULL
$STH->bindParam(':EndOfPrimary', isset($_POST['EndOfPrimary'])?$_POST['EndOfPrimary']:null ,PDO::PARAM_STR,10);