重力形式根据 mysql 表值验证字段条目值

时间:2021-07-18 03:35:06

标签: mysql wordpress gravityforms

基本上,我有一张桌子,里面有 800 万个促销代码。参赛者将在重力表格上输入代码,然后将查询数据库中的代码,一旦出现该代码,该代码将被标记为已使用,并且参赛者应被重定向到参赛表格。如果不是,表单应该告诉用户代码无效。这是我从其他来源提取的代码,因为我不是编码员。但是,当我提交正确的代码时,它说不正确。任何帮助将不胜感激,请记住我不是程序员

add_filter( 'gform_field_validation_4', 'validate_code' );
function validate_code($validation_result){
    $form = $validation_result['form'];
    foreach( $form['fields'] as &$field ) {
    if ( strpos( $field->cssClass, 'validate-code' ) === false ) {
        continue;
        }
    }
    $field_value = rgpost( "input_1" );
    $is_valid = is_code( $field_value );
    $validation_result['is_valid'] = false;
    $field->failed_validation = true;
    $field->validation_message = 'The code you have entered is not valid. Please enter another.';
    $validation_result['form'] = $form;
    return $validation_result;
}
function is_code($code){
    $info = 'mysql response';
require_once(ABSPATH . '/wp-config.php');
    $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        echo 'Unable to connect to server, please use the back button in your browser and resubmit the form';
        exit();
    }
    $code = mysqli_real_escape_string($conn, $_POST['codes']);
    $sql_check = mysqli_query($conn, "SELECT * FROM entrycode WHERE codes = '$code' AND valid = 0");
    $sql_checkrows = mysqli_num_rows($sql_check);
    if ($sql_checkrows > 0) {
        $sql_update = "UPDATE entrycode SET used = 1 WHERE codes ='$code'";
        if (mysqli_query($conn, $sql_update)) {
            $info = mysqli_affected_rows($conn) . " Row updated.\n";
            $info = 'success';
            return true;
    } else {
        return false;
        }
        mysql_close($conn);
    }
}
add_filter('gform_confirmation_4', 'valid_invitation_confirmation', 10, 4);
function valid_invitation_confirmation($confirmation, $form, $lead, $ajax){
    // customize this URL - I send the code in the query string
    $success_url = 'https://sample.com/enter' . '/?code=' . $lead[1];
    $confirmation = array('redirect' => $success_url);
    return $confirmation;
    }

3 个答案:

答案 0 :(得分:0)

更新了验证代码的功能:

function is_code_valid($thiscode){
    global $wpdb;

    // Get match count (consider using transient ref table).
    $matched_codes = $wpdb->get_var(
        $wpdb->prepare(
            "
                SELECT sum(meta_value)
                FROM $wpdb->entrycode
                WHERE codes = %s
                AND valid = 0
            ",
            $thiscode
        )
    );

    // If matches found , update table count?.
    if ( !empty ( $matched_codes ) ) {
        $wpdb->query( $wpdb->prepare( 
            "
                UPDATE $wpdb->entrycode 
                SET used = %d
                WHERE codes = %s
            ",
            1, 
            $thiscode
        ) );        
        return true;
    }

    return false;

}

答案 1 :(得分:0)

所以我修改了 Phill 的代码,我不再收到错误,但是代码没有被验证,事实上,我输入的任何代码都是有效的。,我不知所措。我的表是这样结构的

入口代码表

<头>
ID 代码 使用过
34 98j65XF16 O
add_filter('gform_validation_4_1', 'validate_code');
function validate_code($validation_result){
    // this assumes the code is entered in field one on your form
    // change this input_ number if it's a different field
    if($is_code_valid($_POST['input_1'])){
        $validation_result['is_valid'] = false;
        foreach($validation_result['form']['fields'] as &$field){
        // field 1 is the field where we want to show the validation message 
            if($field['id'] == 1){
                $field['failed_validation'] = true;
                $field['validation_message'] = 'The code you entered is invalid: please try again.';
                break;
            }
        }
    }
    return $validation_result;
}
// use this function to validate codes 
function is_code_valid($thiscode){
    global $wpdb;

    // Get match count (consider using transient ref table).
    $matched_codes = $wpdb->get_var(
        $wpdb->prepare(
            "
                SELECT sum(meta_value)
                FROM $wpdb->entrycode
                WHERE codes = %s
                AND valid = 0
            ",
            $thiscode
        )
    );

    // If matches found , update table count?.
    if ( $matched_codes > 0) {
        $wpdb->query( $wpdb->prepare( 
            "
                UPDATE $wpdb->entrycode 
                SET used = %d
                WHERE codes = %s
            ",
            1, 
            $thiscode
        ) );        
        return true;
    }

    return false;

}


// doing this here because the redirect URL does not support variables or shortcodes
// change the 70 here to your form ID
add_filter('gform_confirmation_4', 'valid_invitation_confirmation', 10, 4);
function valid_invitation_confirmation($confirmation, $form, $lead, $ajax){
    // customize this URL - I send the code in the query string
    $success_url = 'https://demo.com/enter' . '/?code=' . $lead[1];
    $confirmation = array('redirect' => $success_url);
    return $confirmation;
}

 

答案 2 :(得分:0)

我的这段代码仍然没有使用验证代码检查数据库,所有代码都返回无效的代码消息

 add_filter('gform_validation_2', 'validate_code');
    GFCommon::log_debug( __METHOD__ . '(): The POST => ' . print_r( $_POST, true ) );
    function validate_code($validation_result){
        // this assumes the code is entered in field one on your form
        // change this input_ number if it's a different field
        if(!is_code_valid($_POST['input_1'])){
            $validation_result['is_valid'] = false;
            foreach($validation_result['form']['fields'] as &$field){
            // field 1 is the field where we want to show the validation message 
                if($field['id'] == 1){
                    $field['failed_validation'] = true;
                    $field['validation_message'] = 'The code you entered is invalid: please try again.';
                    break;
                }
            }
        }
        return $validation_result;
    }
    function is_code_valid($thiscode){
           GFCommon::log_debug( __METHOD__ . '(): The POST => ' . print_r( $_POST, true ) ); 
            global $wpdb;
            // Get match count (consider using transient ref table).
            
            $matched_codes = $wpdb->get_var(
                $wpdb->prepare(
                    "
                        SELECT sum(meta_value)
                        FROM $wpdb->entrycode
                        WHERE codes = %s
                        AND valid = 0
                    ",
                    $thiscode
                )
            );
        
            // If matches found , update table count?.
            if ( !empty ( $matched_codes ) ) {
                $wpdb->query( $wpdb->prepare( 
                    "
                        UPDATE $wpdb->entrycode 
                        SET used = %d
                        WHERE codes = %s
                    ",
                    1, 
                    $thiscode
                ) );        
                return true;
            }
        
            return false;
        
    }
    
    // doing this here because the redirect URL does not support variables or shortcodes
    // change the 70 here to your form ID
    add_filter('gform_confirmation_2', 'valid_invitation_confirmation', 10, 4);
    function valid_invitation_confirmation($confirmation, $form, $lead, $ajax){
        // customize this URL - I send the code in the query string
        $country = ($_POST['input_3']);
        $success_url = 'https://sample.com/enter' . '/?code=' .$lead[1] .'&country=' .$country;
        $confirmation = array('redirect' => $success_url);
        return $confirmation;
    }