[英]HTML checkbox value submitting despite not being checked (PHP)
我真的不敢相信這么簡單的事情會引起如此頭痛。
<input type='checkbox' name="phoneConsent" id="phoneConsent" value="1">
無論是否選中此復選框,它仍將phoneConsent的值發布為“ 1”-是否不發布任何內容?
我認為這是問題所在:
// variables for data
$(this).find('[name]').each(function(index, value) {
var that = $(this),
name = that.attr('name'),
value = that.val();
// load loaded variables into array
form_data[name] = value;
});
如何指定未設置的復選框不應發布其值?
PHP:
$phoneConsent = (isset($_POST['phoneConsent'])) ? 1 : 0;
// Set up the data that is headed to the table
$data = Array(
'phoneConsent' => $phoneConsent
);
實際的HTML
<div class = "form-group">
<label for="phoneConsent" class='checkbox-inline <?php echo ($this_user[0]['subscription'] == 1 ? '' : 'disabledClass') ;?>'>
<input type='checkbox' name="phoneConsent" id="phoneConsent" value="1" <?php echo ($this_user[0]['phoneConsent'] == 1 ? ' checked ' : '') ;?> <?php echo ($this_user[0]['subscription'] == 1 ? '' : ' disabled ') ;?>>
Premium account holders: check this box to post your phone number to your teaching profile.
</label>
</div>
整個HTML表單
<form method="post" class = "multi-form teacher_account_form" id="personal_form" name="personal_form">
<div class ="form-group">
<label for="country">What country are you from?</label>
<!-- for selecting the country from db -->
<div id = "countryfromdb" class = "hidden"><?=$this_user[0]['country_prefix'];?></div>
<?php $form->select("country", "country_list") ;?>
</div>
<div class = "form-group">
<label for="chinese_name">What is your Chinese name?</label>
<input type = "text" class="form-control" name="chinese_name" id="chinese_name" value="<?=$this_user[0]['chinese_name']?>">
</div>
<div class = "form-group">
<label for="phone">What is your phone number?*</label>
<input type="text" class="form-control bfh-phone" data-format="+86 ddd dddd dddd" name="phone" id="phone" value="<?=$this_user[0]['phone']?>">
</div>
<div class = "form-group">
<label for="phoneConsent" class='checkbox-inline <?php echo ($this_user[0]['subscription'] == 1 ? '' : 'disabledClass') ;?>'>
<input type='checkbox' name="phoneConsent" id="phoneConsent" <?php echo ($this_user[0]['phoneConsent'] == 1 ? ' checked ' : '') ;?> <?php echo ($this_user[0]['subscription'] == 1 ? '' : ' disabled ') ;?>>
Premium account holders: check this box to post your phone number to your teaching profile.
</label>
</div>
<div class="form-group">
<button type="submit" class="btn btn-default btn-med account_submit" id="personal_submit" name="personal_submit">Update Personal</button>
</div>
<small style="color:red;">*Your phone number will NOT appear on your public profile without your permission.</small>
</form>
jQuery的
var which_button;
//$('.account_submit').click(function() {
$('form.teacher_account_form').on('submit', function(e) {
e.preventDefault();
which_button = $(this).attr('id');
// Create empty jQuery objects -
var $jsOutput = $([]);
var $jsForm = $([]);
// url to submit to
var ajaxURL = "/users/p_teacher_account_work";
// Assign jQuery selector objects
switch (which_button) {
case "pay_form":
$jsOutput = $('#pay_output');
$jsForm = $('#pay_form');
break;
case "edu_form":
$jsOutput = $('#edu_output');
$jsForm = $('#edu_form');
break;
case "image_form":
$jsOutput = $('#image_output');
$jsForm = $('#image_form');
break;
case "personal_form":
$jsOutput = $('#personal_output');
$jsForm = $('#personal_form');
break;
}
// empty data object
var form_data = {};
// variables for data
$(this).find('[name]').each(function(index, value) {
var that = $(this),
name = that.attr('name'),
value = that.val();
// load loaded variables into array
form_data[name] = value;
});
$.ajax({
type: 'post',
url: ajaxURL,
data: form_data,
beforeSend: function() {
//Display a loading message while waiting for the ajax call to complete
$jsOutput.html("Updating...");
},
success: function(response) {
$jsOutput.html(response);
}
});
return false;
});
console.log表單輸出
復選框已選中
Object {country: "AI", chinese_name: "", phone: "+86 1", phoneConsent: "on", personal_submit: ""} teacher_account.js:130
復選框未選中
Object {country: "AI", chinese_name: "", phone: "+86 1", phoneConsent: "on", personal_submit: ""} teacher_account.js:130
代碼終於可以工作了。 我很感激。 jQuery更新:
$(this).find('[name]').each(function(index, value) {
var that = $(this);
if(that.is(':checkbox'))
{
if(that.is(':checked'))
{
var name = that.attr('name');
}
}
else
{
name = that.attr('name');
}
var value = that.val();
// load loaded variables into array
form_data[name] = value;
});
問題出在您的jQuery .ajax()
處理程序中。 在“自然”表單提交中,不會發布該復選框,但是您自己自己收集了表單數據之后就通過ajax自己進行了發布。
在此:
// variables for data
$(this).find('[name]').each(function(index, value) {
var that = $(this),
name = that.attr('name'),
value = that.val();
// load loaded variables into array
form_data[name] = value;
});
您正在選擇具有['name']
,並將其值分配給form_data[]
復選框確實有名稱和值,所以你把名字:在form_data值對箱是否被選中。
之后,您立即執行以下操作:
$.ajax({
type: 'post',
url: ajaxURL,
data: form_data,
...(etc)
將data: form_data
發送到的位置data: form_data
作為帖子正文,其中包括復選框“ phoneConsent:1”對。
為避免這種情況,您必須更加智能地處理控件,檢查輸入控件的類型,僅在checked
控件時才發送復選框(或單選按鈕)數據。
嘗試以下代碼塊:
<html>
<head>
<title></title>
</head>
<?
if(isset($_POST['phoneConsent'])){
echo $_POST['phoneConsent'];
}
?>
<body bgcolor="#FFFFFF">
<form method="post" action="test.php">
<input type='checkbox' name="phoneConsent" id="phoneConsent" value="1">
<input type="submit" />
</form>
</body>
</html>
我認為您在html的此部分以外的地方還有其他問題。
您檢查值是否已設置,而不是值本身。 無論它是否未經檢查,它都會被發送出去。
更改$phoneConsent = (isset($_POST['phoneConsent'])) ? 1 : 0;
$phoneConsent = (isset($_POST['phoneConsent'])) ? 1 : 0;
到if(isset($_POST['phoneConsent'])) $phoneConsent = $_POST['phoneConsent']) == '1' ? 1 : 0;
if(isset($_POST['phoneConsent'])) $phoneConsent = $_POST['phoneConsent']) == '1' ? 1 : 0;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.