PHP多个表单,同一页,是否设置($_POST[])不起作用?

时间:2020-09-14 作者:Michael

我有一个网页,上面有一个网络研讨会列表,还有一个显示“表单”按钮的快捷码;注册;。表单只需更新用户的WordPress配置文件并将其重定向到页面即可。我不明白为什么我不能让它工作:

/*
 * Usage: [enroll_form_button redirect="#" webinar="ABC"]
 */
if (!function_exists(\'enroll_form_button_function\')) {
    function enroll_form_button_function($atts){
        $atts = shortcode_atts(array(\'redirect\' => \'#\', \'webinar\' => \'\',), $atts);
        $redirect_to = $atts[\'redirect\'];
        $webinar_code = $atts[\'webinar\'];
        
        $results .=\'<form id="form-\'.$webinar_code.\'" method="post" action="\'.$redirect_to.\'">
            <input type="submit" value="Enroll" name="form-\'.$webinar_code.\'" >
        </form>\';
        
        if (isset($_POST[\'form-\'.$webinar_code])){
            update_user_meta( get_current_user_id(), $webinar_code, \'true\');
        }
        return $results;
    }
    add_shortcode(\'enroll_form_button\', \'enroll_form_button_function\');
} else {
    echo "enroll_form_button_function is not available.<br />\\n";
}
参数、重定向和更新用户配置文件的函数工作正常,但if语句似乎不起作用。如果我从If语句中删除该函数,它将更新用户配置文件中的所有网络研讨会,而不仅仅是他们提交的网络研讨会。所以,我需要识别表单,只调用该表单的操作。我错过了什么?

1 个回复
最合适的回答,由SO网友:sMyles 整理而成

我在这里看到了一些问题。

1)您正在对$results (即$results .= 应该是$results =)

2)你假设$webinar_code 将始终可用。如果重定向到的页面不完全相同,则情况不会如此,或者如果重定向到的页面具有短代码但属性不同,则会更新错误的页面。

我会这样做:

add_shortcode( \'enroll_form_button\', \'enroll_form_button_function\' );

function enroll_form_button_function( $atts ) {

    $atts         = shortcode_atts( array( \'redirect\' => \'#\', \'webinar\' => \'\', ), $atts );
    $redirect_to  = $atts[\'redirect\'];
    $webinar_code = $atts[\'webinar\'];

    $results = "<form id=\\"form-{$webinar_code}\\" method=\\"post\\" action=\\"{$redirect_to}\\"><input type=\\"submit\\" value=\\"{$webinar_code}\\" name=\\"webinar_code\\" /></form>";

    return $results;
}

add_action( \'wp\', \'check_enroll_form_submit\' );

function check_enroll_form_submit(){

    if( ! isset( $_POST[\'webinar_code\'], $_POST[\'webinar_nonce\'] ) ){
        return;
    }

    $webinar_code = sanitize_text_field( $_POST[\'webinar_code\'] );
    update_user_meta( get_current_user_id(), $webinar_code, \'true\' );
}
我在这里做了几件事:

移动检查以将用户的元更新到wp 操作已清理发送的值$_POST (即使你知道它是安全的,但保持对任何类型的$_POST $_GET$_REQUEST 数据)

  • 不要在名称中传递值,只需在值中传递它(我认为您对该部分考虑过多)
  • 相关推荐

    如何使用PHP函数触发WP CLI DB导出?

    我想使用WP-CLI导出数据库-使用wp db export - 创建备份。我还需要使用cron来控制备份计划。WP-CLI安装在我的托管主机上,我可以通过SSH, 但我不能用cron 直接在我的服务器上。为了使用我自己的cron作业来安排备份,我需要使用插件WP Crontrol来添加和编辑cron 工作;该插件使用函数作为add_action, i、 e。my_backup_cron 开火my_backup_function:这是插件使用的格式:add_action( \'my_backup_cron