无需表格即可收集和发送数据的更短方式
Posted
技术标签:
【中文标题】无需表格即可收集和发送数据的更短方式【英文标题】:shorter way to collect and send data without a form 【发布时间】:2021-03-24 06:01:44 【问题描述】:我在页面上有一些 (15) 个input, select, and textarea
标签 - 没有表单
需要收集它们的值并将它们插入数据库
这段代码工作正常,但我希望有办法缩短它
在客户端 - 可能是某种serialize
在服务器端 - 特别是在 execute
语句上 - 可能是某种循环
$('#btn_send').on('click', function()
let obj = ;
$('input, select, textarea').each(function()
let a = $(this).attr('name');
obj[a] = $(this).val();
);
let str = JSON.stringify(obj);
$.post('reg.php', fn: 'btn_send', args: [str], function(data)
console.log(data);
);
);
reg.php
function btn_send($str)
global $db;
$obj = json_decode($str);
// here are table columns
$a = "name,birth,gender,city,state,gmail,fb,tw,web,phone,occ,food,note,uname,pass";
$b = ':a' . str_replace(',', ', :a', $a);
$sq = "insert into members ($a) values ($b)";
$st = $db->prepare($sq);
$st->execute([
":aname" => $obj->name,
":agender" => $obj->gender,
//... and so on - 15 items
]);
echo 'success';
【问题讨论】:
如果代码有效并且您只是希望有人对其进行审查并提出改进建议,请将其发布到Code Review。当您遇到问题并需要帮助以使您的代码正常工作时,堆栈溢出是适用的。 【参考方案1】:根据您的代码示例,您的对象的元素看起来与表中的列具有相同的名称。在这种情况下,您可以通过将传入的 JSON 转换为数组而不是对象并利用 PDOStatement::execute
允许数组键在名称中不包含 :
的事实来简化代码:
$obj = json_decode($str, true);
// here are table columns
$cols = array_keys($obj);
$a = implode(',', $cols);
$b = ':a' . str_replace(',', ', :a', $a);
$sq = "insert into members ($a) values ($b)";
$st = $db->prepare($sq);
$st->execute($obj);
如果将来execute
的行为发生变化,您可以使用array_combine
和array_map
制作一个以:
开头的键的数组:
array_combine(array_map(function ($k) return ":$k"; , $cols), $obj)
然后,您可以将此数组传递给execute
,而不是$obj
。
【讨论】:
【参考方案2】:我什至不确定它是否可以编译,只是很无聊,这就是我将如何处理 15 项左右的部分。
function btn_send($str)
global $db;
$obj = json_decode($str);
// here are table columns
$a = "name,birth,gender,city,state,gmail,fb,tw,web,phone,occ,food,note,uname,pass";
$b = ':a' . str_replace(',', ', :a', $a);
$sq = "insert into members ($a) values ($b)";
$st = $db->prepare($sq);
$sqlArray = array();
foreach($obj as $key => $value)
$sqlArray[]= array(":a".$key => $value);
$st->execute($sqlArray);
echo 'success';
编辑:我看了尼克的回答,看来你甚至不需要做我做过的所有困难的事情,你可以通过 $obj
哇,他们现在变得如此简单
【讨论】:
以上是关于无需表格即可收集和发送数据的更短方式的主要内容,如果未能解决你的问题,请参考以下文章