You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress如何使用$wpdb创建数据表并存储自定义表单提交数据

WordPress自定义RSVP表单提交入库实现方案

首先修正你现有表单的两个基础问题:单选按钮缺少value属性会导致提交后无法获取选中值,同时需要补充WordPress原生安全校验字段,修正后的表单直接替换原有代码即可:

<div class="my-form">
    <h2>WILL YOU ATTEND?</h2>
    <?php if (isset($_GET['attend_status'])): ?>
        <div class="form-notice">
            <?php echo $_GET['attend_status'] === 'success' ? '提交成功,感谢你的反馈!' : '提交失败,请检查填写内容后重试'; ?>
        </div>
    <?php endif; ?>
    <form action="" autocomplete="off" method="POST">
        <?php wp_nonce_field('attend_form_submit', 'attend_nonce'); ?>
        <input class="input" type="text" spellcheck="false" name="name" placeholder="Name" required>
        <input class="input" type="email" spellcheck="false" name="email" placeholder="E-mail" required>

        <label class="ans">Yes
            <input type="radio" name="attend_ans" value="1">
            <span class="checkmark"></span>
        </label>

        <label class="ans">No
            <input type="radio" name="attend_ans" value="0">
            <span class="checkmark"></span>
        </label>
        <button type="submit" name="attend_submit_btn"> SUBMIT </button>
   </form>
</div>

说明:action属性留空即可,表单会默认提交到当前页面,不需要填写特殊地址;wp_nonce_field是WordPress自带的CSRF安全校验字段,必须添加。


第一步:创建存储提交数据的自定义数据表

不要每次提交表单都执行建表逻辑,会严重拖慢站点性能。推荐把建表逻辑绑定到主题激活钩子,仅在主题启用时执行一次。将以下代码添加到当前主题的functions.php文件中:

// 主题激活时创建RSVP表单存储表
function create_attend_form_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'attend_records'; // 自动拼接WordPress表前缀,例如最终表名为wp_attend_records
    $charset_collate = $wpdb->get_charset_collate();

    // 建表语句
    $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        name varchar(100) NOT NULL,
        email varchar(100) NOT NULL,
        will_attend tinyint(1) NOT NULL DEFAULT 0,
        submit_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY  (id)
    ) $charset_collate;";

    // 引入WordPress建表依赖文件
    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta($sql);
}
add_action('after_switch_theme', 'create_attend_form_table');

如果不想通过切换/重启主题触发建表,也可以在表单处理逻辑前添加表存在判断,若表不存在则执行上述建表逻辑即可。


第二步:编写表单提交处理逻辑

将以下代码同样添加到functions.php文件中,逻辑覆盖安全校验、数据清洗、入库操作、提交后跳转防重复提交全流程:

// 处理RSVP表单提交请求
function handle_attend_form_submit() {
    // 判断是否为目标表单提交
    if (!isset($_POST['attend_submit_btn'])) {
        return;
    }

    global $wpdb;
    $table_name = $wpdb->prefix . 'attend_records';

    // 安全校验:验证nonce合法性
    if (!isset($_POST['attend_nonce']) || !wp_verify_nonce($_POST['attend_nonce'], 'attend_form_submit')) {
        wp_redirect(add_query_arg('attend_status', 'error', wp_get_referer()));
        exit;
    }

    // 数据校验与清洗
    $name = sanitize_text_field($_POST['name'] ?? '');
    $email = sanitize_email($_POST['email'] ?? '');
    $will_attend = intval($_POST['attend_ans'] ?? -1);

    // 必填项合法性判断
    if (empty($name) || !is_email($email) || !in_array($will_attend, [0,1])) {
        wp_redirect(add_query_arg('attend_status', 'error', wp_get_referer()));
        exit;
    }

    // 插入数据,$wpdb->insert会自动做SQL转义,避免注入风险
    $insert_result = $wpdb->insert(
        $table_name,
        [
            'name' => $name,
            'email' => $email,
            'will_attend' => $will_attend,
            'submit_time' => current_time('mysql')
        ],
        ['%s', '%s', '%d', '%s']
    );

    // 跳转回表单页,携带提交状态,避免用户刷新重复提交
    if ($insert_result) {
        wp_redirect(add_query_arg('attend_status', 'success', wp_get_referer()));
    } else {
        wp_redirect(add_query_arg('attend_status', 'error', wp_get_referer()));
    }
    exit;
}
add_action('init', 'handle_attend_form_submit');

注意事项

  • 所有用户输入必须使用WordPress自带的sanitize_*系列函数清洗,禁止直接读取$_POST原始值入库
  • 禁止手动拼接SQL语句,优先使用$wpdb->insert()方法,该方法会自动做转义处理,从根源避免SQL注入风险
  • 表单处理完成后必须执行重定向,否则用户刷新页面会触发重复提交
  • 后续查看提交数据时,可以直接通过数据库管理工具访问{你的站点表前缀}attend_records表,也可以自行开发后台管理页面对提交记录做增删改查操作

内容的提问来源于stack exchange,提问作者Zeddy Emy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:36:37