我有一个HTML表单,它使用jQuery序列化方法和ajax将使用PHP的结果发布到sqlite数据库中。我已经将jQuery设置为每分钟运行一次,作为一个自动保存功能,这样用户就可以稍后返回以完成他们开始的操作。由于自动保存,我不能强制要求所有输入。
它99%的时间都有效。但是,在少数情况下,即使输入字段中有数据,应用程序有时也会将空白数据发布到数据库中。我已检查以确保所有HTML输入字段都具有name属性。你知道为什么它在大多数时候都有效,但在少数随机情况下却无效吗?
我希望我有更多的报告为什么它一直不起作用。我自己还没能复制这个bug,我只是在做用户报告。但我知道表单在数据库中张贴空白,因为当我进入数据库时,它会显示",而不是">null"。所以我知道数据库正在接收一些东西,但它没有接收到用户键入的数据。
HTML
<form action="" method="post" id="evaluationForm">
<!-- this input is disabled since this user can't edit it -->
<label for="FirstName">First Name</label>
<input type="text" name="FirstName" value="<?php echo htmlspecialchars($data['FirstName']);?>" disabled >
<label for="WorkHabitsCommentsSuper">Comments </label><br>
<textarea name="WorkHabitsCommentsSuper" placeholder="Comments are optional">
<?php echo htmlspecialchars($data['WorkHabitsCommentsSuper']);?>
</textarea>
<label for="GoalsSuper">More Comments</label>
<textarea name="GoalsSuper" required>
<?php echo htmlspecialchars($data['GoalsSuper']);?>
</textarea>
<!-- and a whole bunch more fields but you get the idea -->
</form>
JavaScript
function saveEval() {
var datastring = $("form").serialize();
$.ajax({
type: "POST",
url: "autosave-s.php",
data: datastring,
success: function(text) {
if (text == "success") {
alert('It saved. Hooray!');
} else {
alert('Oh no. Something went wrong.');
}
}
});
}
window.onload = function() {
setInterval("saveEval()", 60000)
}
PHP
$db = new PDO('sqlite:evals.sqlite');
$sql = "UPDATE table SET
WorkHabitsCommentsSuper = :WorkHabitsCommentsSuper,
GoalsSuper = :GoalsSuper";
$query = $db->prepare($sql);
$query->execute(array(
':WorkHabitsCommentsSuper' => $_POST['WorkHabitsCommentsSuper'],
':GoalsSuper' => $_POST['GoalsSuper']
));
echo "success";
if(!in_array("",$_POST)){
$db = new PDO('sqlite:evals.sqlite');
$sql = "UPDATE table SET
WorkHabitsCommentsSuper = :WorkHabitsCommentsSuper,
GoalsSuper = :GoalsSuper";
$query = $db->prepare($sql);
$query->execute(array(
':WorkHabitsCommentsSuper' => $_POST['WorkHabitsCommentsSuper'],
':GoalsSuper' => $_POST['GoalsSuper']
));
echo "success";
}else{
echo "Empty";
}
这将检查过帐数据是否为空(如果为空,则任何字段都不会更新(,并将发送"空"响应,以便对空数据过帐发出警报。