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

WordPress自定义插件表单数据无法插入MySQL数据库求助

WordPress插件表单提交数据无法插入数据库的问题修复

我开发了一款WordPress自定义插件,实现激活时自动在MySQL数据库创建数据表,停用插件时删除该表。目前数据表可正常创建,但用户填写表单提交后,数据无法插入数据库。以下是插件核心代码文件:

第一个代码文件(主插件文件)

<?php
/*
 * Plugin Name:       NFTP Get Quote
 * Plugin URI:        https://example.com/plugins/the-basics/
 * Description:       Handle the basics with this plugin.
 * Version:           1.10.3
 * Requires at least: 5.2
 * Requires PHP:      7.2
 * Author:            Isha Bhutto
 * Author URI:        https://www.upwork.com/freelancers/~01a72e9e83e6dd47a2
 * License:           GPL v2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Update URI:        https://example.com/my-plugin/
 * Text Domain:       nftp_get_quote
 * Domain Path:       /languages
 */

if (function_exists('ngq_get_quote_form')) {

} else {
    function ngq_get_quote_form()
    {
        $actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        ob_start();
        ?>
        <!DOCTYPE html>
        <html>
        <head>
            <title>Get a Quote</title>
        </head>
        <body>
            <div class="form-container">
                <h2>Get a Quote</h2>
                <form action="<?php echo plugins_url('form_submittion.php', __FILE__); ?>" method="post">
                    <input type="hidden" name="current_path" value="<?php echo $actual_link; ?>">
                    <label for="name">Your Name</label>
                    <input type="text" id="name" name="name" placeholder="Enter your name" required>

                    <label for="email">Your Email</label>
                    <input type="email" id="email" name="email" placeholder="Enter your email" required>

                    <label for="message">Message</label>
                    <textarea id="message" name="message" placeholder="Enter your message" rows="4" required></textarea>

                    <button type="submit" name="quote-submit">Submit</button>
                </form>
            </div>
        </body>
        </html>
        <?php
        return ob_get_clean();
    }
}

add_shortcode("nftp_get_quote_form", "ngq_get_quote_form");

// ADD CSS FILE
function utm_user_scripts()
{
    $plugin_url = plugin_dir_url(__FILE__);
    wp_enqueue_style('nftp_get_quote', $plugin_url . "style.css");
}
add_action('wp_enqueue_scripts', 'utm_user_scripts');

// ADD HOOKS
register_activation_hook(__FILE__, 'activate');
register_deactivation_hook(__FILE__, 'deactivate');

function activate()
{
    global $wpdb;
    $table = $wpdb->prefix . 'quotetable';

    // 检查表是否存在,不存在则创建
    if ($wpdb->get_var("show tables like '$table'") != $table) {
        $sql1 = "CREATE TABLE $table (
            `sno` int(11) NOT NULL,
            `name` varchar(100) NOT NULL,
            `email` varchar(100) NOT NULL,
            `msg` text NOT NULL
          ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;";

        $sql2 = "ALTER TABLE $table 
        ADD PRIMARY KEY (`sno`);";

        $sql3 = "ALTER TABLE $table 
        MODIFY `sno` int(11) NOT NULL AUTO_INCREMENT;";

        $wpdb->query($sql1);
        $wpdb->query($sql2);
        $wpdb->query($sql3);
    }
}

function deactivate()
{
    global $wpdb;
    $table = $wpdb->prefix . 'quotetable';
    $sql = "DROP TABLE $table";
    $wpdb->query($sql);
}
?>

第二个代码文件(form_submittion.php)

<?php 
require ('../../../wp-load.php');

global $wpdb;
$table = $wpdb->prefix . 'quotetable';

if (isset($_POST['quote-submit'])) {
    $name = $_POST['name'];
    $email = $_POST['email'];
    $msg = $_POST['message'];

    $wpdb->insert($table, Array('name' => $name, 'email' => $email, 'message' => $msg));

    $current_path = $_POST['current_path'];
    ?>
    <script>
        window.location = '<?php  echo $current_path;?>';
    </script>
    <?php    
}
?>

问题原因及修复方案

1. 核心错误:字段名不匹配

创建数据表时,消息字段的名称是msg,但插入数据时用的是message,两者不一致导致数据无法写入。直接修改form_submittion.php中的插入语句即可:

$wpdb->insert($table, Array('name' => $name, 'email' => $email, 'msg' => $msg));

2. 优化提交方式(推荐)

直接加载wp-load.php不是WordPress规范的做法,存在安全风险,建议改用admin-post动作处理提交:

  • 修改主插件文件中的表单action:
    <form action="<?php echo admin_url('admin-post.php'); ?>" method="post">
        <input type="hidden" name="action" value="nftp_submit_quote">
        <?php wp_nonce_field('nftp_quote_submit', 'nftp_quote_nonce'); ?>
        <!-- 其他字段保持不变 -->
    </form>
    
  • 删除form_submittion.php,在主插件文件中添加提交处理函数:
    function nftp_handle_quote_submission() {
        if (!isset($_POST['quote-submit'])) return;
        // 安全验证
        if (!wp_verify_nonce($_POST['nftp_quote_nonce'], 'nftp_quote_submit')) {
            wp_die('安全验证失败');
        }
        global $wpdb;
        $table = $wpdb->prefix . 'quotetable';
        // 清理用户输入
        $name = sanitize_text_field($_POST['name']);
        $email = sanitize_email($_POST['email']);
        $msg = sanitize_textarea_field($_POST['message']);
        // 插入数据
        $wpdb->insert($table, [
            'name' => $name,
            'email' => $email,
            'msg' => $msg
        ]);
        // 跳转回原页面
        wp_redirect($_POST['current_path']);
        exit;
    }
    add_action('admin_post_nftp_submit_quote', 'nftp_handle_quote_submission');
    add_action('admin_post_nopriv_nftp_submit_quote', 'nftp_handle_quote_submission');
    

3. 数据安全优化

添加输入清理和验证,避免SQL注入和恶意内容提交,上述优化代码中已包含sanitize_text_field、sanitize_email等处理函数。

内容的提问来源于stack exchange,提问作者Isha Bhutto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:47:09