无需表格即可收集和发送数据的更短方式

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_combinearray_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 哇,他们现在变得如此简单

【讨论】:

以上是关于无需表格即可收集和发送数据的更短方式的主要内容,如果未能解决你的问题,请参考以下文章

动态获取当前方法名称的更短方法[重复]

无需用户操作即可发送 ios 推送消息

Apps 脚本允许用户将数据发送到他们无法查看的电子表格?

在 Angular 应用程序中处理过滤值的更优雅的方式

流星一次或“静态”发布,无需收集跟踪

使用Scrapy Spiders无需下载即可处理图像