使用 For Each -- Checkboxes 使用 JSON 对象更新 MySQL
Posted
技术标签:
【中文标题】使用 For Each -- Checkboxes 使用 JSON 对象更新 MySQL【英文标题】:Updating MySQL with JSON object using For Each -- Checkboxes 【发布时间】:2016-01-22 02:37:30 【问题描述】:我正在尝试使用 QueryBuilder 和以下代码使用这些复选框值更新表 (auth_users),但它不适用于我表单上的复选框。
我认为它不起作用可能是因为 $key,"'".$value."'" 不等于数据库字段名称和正确值,但实际上等于 "name":"checked" 而不是 "mb" :"1"
我可能错了。我基本上并试图弄清楚如何遍历这个 JSON 对象并为特定的 $id 更新一行中的值。如果选中该框,它将更新“1”,否则将更新“0”。
我为数据库中的每条记录更新了 26 个复选框值。 数据库表结构 uName,uFname,uLName,uSecurityLevel,mb,mc,ms,mi,ml,mp,mo,mst,si,ei,ai,ci,ali,hli .... 等 ...(请参阅下面的 JSON 对象中的数据)
查询功能:
function getCheckBoxRights()
var cbr = new Array();
$(".rchk").each(function(i,e)
// loop through each checkbox and discover if it is checked,
// and if so value = 1 else value = 0
if($(e)[0].checked) cbr.push("name":$(e).attr('name'),"checked":"1");
else cbr.push("name":$(e).attr('name'),"checked":"0");
);
console.log(cbr);
return JSON.stringify(cbr);
这将为复选框的状态返回以下 JSON 对象:
["name":"ai","checked":"1","name":"hi","checked":"1",
"name":"hhi","checked":"1","name":"pii","checked":"1",
"name":"li","checked":"1","name":"gi","checked":"1",
"name":"si","checked":"1","name":"ci","checked":"1",
"name":"ei","checked":"1","name":"voi","checked":"0",
"name":"hli","checked":"1","name":"gli","checked":"1",
"name":"sli","checked":"1","name":"usli","checked":"1",
"name":"ali","checked":"1","name":"cli","checked":"1",
"name":"mb","checked":"1","name":"mc","checked":"0",
"name":"md","checked":"0","name":"mi","checked":"1",
"name":"ml","checked":"0","name":"mp","checked":"0",
"name":"mo","checked":"0","name":"ms","checked":"0",
"name":"mst","checked":"0","name":"mu","checked":"0"]
AJAX 调用:
$.ajax(
dataType:'JSON',
type:'POST',
cache:false,
url:'dump.php',
data:'myaction=updatec&t=auth_users&id='+data.uID+'&jsonc='+getCheckBoxRights()
);
var jsonc = getCheckBoxRights();
console.log('!!!!!!!!!!!!');
console.log('CheckBox JSON Object:'+jsonc);
console.log('!!!!!!!!!!!!');
console.log('ID of record to update: '+data.uID);
DUMP.PHP 文件:
case "updatec":
if(!isset($id)) break;
$jsonc = urldecode($jsonc);
$jsonc = stripslashes($jsonc);
updatec($jsonc,$t,$id);
break;
function updatec($jsonc,$table,$id)
$tables = array("auth_users");
if(!in_array($table,$tables)) return false;
$updateQuery = new UpdateQuery($table);
$datac = json_decode($jsonc);
foreach($datac as $key=>$value)
$updateQuery->addItem($key,"'".$value."'");
$updateQuery->addCondition("uID",$id);
$query = $updateQuery->generateQuery();
$bool = TableFunctions::executeQuery($query);
$p = new stdClass();
$p->ok = 0;
$p->uID = $id; // the id of the record we updated
if($bool) $p->ok = 1;
echo json_encode($p);
我在想也许我可以像这样解码数据然后执行更新?
$updatechk = json_decode($jsonc, true);
foreach($updatechk['name'] as $key => $updatechk['checked'] as $value)
if($value)
//how to use json array to insert data in Database
mysql_query("UPDATE auth_users SET ".$key." = '".$value."' WHERE uID = '". $id ."'");
这看起来是正确的方法吗?我只是有点迷茫,试图实现这一点,任何帮助都会很棒。
复选框 html(每个请求)
<div id="inventoryRights" style="display:none;float:right;width:43.3%;"><strong><u>Inventory Rights</u></strong><p>
<input type="checkbox" id="ai" name="ai" data-table="auth_users" class="rchk json-input" data-prop="ai"> Active
<input type="checkbox" id="hi" name="hi" data-table="auth_users" class="rchk json-input" data-prop="hi"> Hold
<input type="checkbox" id="hhi" name="hhi" data-table="auth_users" class="rchk json-input" data-prop="hhi"> Hold Indefinately
<input type="checkbox" name="pii" id="pii" data-table="auth_users" class="rchk json-input" data-prop="pii"> Pending
<input type="checkbox" id="li" name="li" data-table="auth_users" class="rchk json-input" data-prop="li"> Link<p>
<input type="checkbox" id="gi" name="gi" data-table="auth_users" class="rchk json-input" data-prop="gi"> Greeny
<input type="checkbox" name="si" id="si" data-table="auth_users" class="rchk json-input" data-prop="si"> Sold
<input type="checkbox" id="ci" name="ci" data-table="auth_users" class="rchk json-input" data-prop="ci"> Cancelled
<input type="checkbox" id="ei" name="ei" data-table="auth_users" class="rchk json-input" data-prop="ei"> Edit
<input type="checkbox" name="voi" data-table="auth_users" class="rchk json-input" data-prop="voi"> View Only<p>
<strong><u>Default Views</u></strong><p>
<input type="checkbox" name="hli" id="hli" data-table="auth_users" class="rchk json-input" data-prop="hli"> Hold List
<input type="checkbox" name="gli" id="gli" data-table="auth_users" class="rchk json-input" data-prop="gli"> Greeny List
<input type="checkbox" id="sli" name="sli" data-table="auth_users" class="rchk json-input" data-prop="sli"> Sold List
<input type="checkbox" id="usli" name="usli" data-table="auth_users" class="rchk json-input" data-prop="usli"> Unsold List<p>
<input type="checkbox" name="ali" id="ali" data-table="auth_users" class="rchk json-input" data-prop="ali"> Archived List
<input type="checkbox" name="cli" data-table="auth_users" class="rchk json-input" id="cli" data-prop="cli"> Cancelled List</div>
<div id="allowableRights" style="display:none;padding:5px;width:55%;"> <strong><u>System Rights</u></strong><p>
<input type="checkbox" id="mb" name="mb" data-table="auth_users" class="rchk json-input" data-prop="mb"> Manage Bedrooms
<input type="checkbox" id="mc" name="mc" data-table="auth_users" class="rchk json-input" data-prop="mc"> Manage Companies
<input type="checkbox" name="md" data-table="auth_users" id="md" class="rchk json-input" data-prop="md"> Manage Descriptions
<input type="checkbox" name="mi" data-table="auth_users" class="rchk json-input" id="mi" data-prop="mi"> Manage Inventory<p>
<input type="checkbox" id="ml" name="ml" data-table="auth_users" class="rchk json-input" data-prop="ml"> Manage Locations
<input type="checkbox" id="mp" name="mp" data-table="auth_users" class="rchk json-input" data-prop="mp"> Manage Properties
<input type="checkbox" name="mo" id="mo" data-table="auth_users" class="rchk json-input" data-prop="mo"> Manage Owners<p>
<input type="checkbox" name="ms" data-table="auth_users" class="rchk json-input" id="ms" data-prop="ms"> Manage Sleeps
<input type="checkbox" id="mst" name="mst" data-table="auth_users" class="rchk json-input" data-prop="mst"> Manage States
<input type="checkbox" id="mu" name="mu" data-table="auth_users" class="rchk json-input" data-prop="mu"> Manage Users</div>
这是管理员选择管理用户时的样子(所有数据都从数据库中提取并填充字段和复选框。)
【问题讨论】:
哇,没有一个缩进...? :-/ 由于我试图对数据 URL 中的 $jsonc 进行 urldecode,也许我需要使用?返回 encodeURIComponent(JSON.stringify(cbr));对缩进或缺少缩进感到抱歉。 添加缩进...抱歉。 我可以看看你的 HTML 吗 :) 目前的工作方式是用户点击特定用户的“管理”。表单向上滑动,该用户的所有数据已经在表单字段中(效果很好)。它只是当我去更改复选框值并更新记录时,它不会循环遍历相应的更改并更新数据库。它正在更新“文本”字段值和文本区域,但不是复选框,以澄清。 【参考方案1】:我终于弄明白了。 =) 下面显示了工作代码。问题是 2 部分。一是我只循环了一次JSON对象,二是JSON对象的形成不正确。
这是工作代码: 在 DUMP.PHP 中
case "updatec":
if(!isset($id)) break;
updatec($jsonc,$table,$id)
break;
function updatec($jsonc,$table,$id)
$updateQuery = new UpdateQuery($table);
$datac = json_decode($jsonc,true);
foreach ($datac as $key => $jsons)
foreach($jsons as $key => $value)
$updateQuery->addItem($key,"'".$value."'");
并且在函数重写中:
function getCheckBoxRights()
var cbr = new Array();
$(".rchk").each(function(i,e)
//get type and info, then setup an object to push onto the array
if($(e)[0].checked)
var datatype = $(e).attr('name'),
info = "1",
obj = ;
obj[datatype] = info;
cbr.push(obj);
else
var datatype = $(e).attr('name'),
info = "0",
obj = ;
obj[datatype] = info;
cbr.push(obj);
);
console.log(cbr);
return JSON.stringify(cbr);
感谢您至少回复并允许我再次查看所有代码并尝试创建一种新方法来执行此操作。 Jquery/AJAX 可能具有挑战性,但学习很棒!
【讨论】:
以上是关于使用 For Each -- Checkboxes 使用 JSON 对象更新 MySQL的主要内容,如果未能解决你的问题,请参考以下文章
Groovy集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )
如何在 terraform 中正确使用 for_each 中的 each.value?