WordPress表单验证后重定向遇解析错误求助
问题分析与解决方案
首先你代码里的语法错误是触发parser error的直接原因:
- 在错误提示的那行(
$ajax_handler->add_error_message( 'Incorrect Password! Please try again...),你遗漏了闭合的单引号,正确写法应为:$ajax_handler->add_error_message( 'Incorrect Password! Please try again...' );
除了语法错误,代码还有几个关键问题需要修正:
1. 数据库连接参数顺序错误
mysqli构造函数的参数顺序是「主机, 用户名, 密码, 数据库名」,你写反了用户名和数据库名:
// 错误写法 $conn = new mysqli("localhost","mydatabase","myuser","mypass"); // 正确写法 $conn = new mysqli("localhost","myuser","mypass","mydatabase");
2. 存在SQL注入风险
直接把用户输入的$email拼进SQL语句会引发严重的SQL注入漏洞,必须用预处理语句替代:
// 替换原查询代码 $stmt = $conn->prepare("SELECT * FROM tablename WHERE email = ?"); $stmt->bind_param("s", $email); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $stmt->close();
3. 密码验证逻辑不安全
直接明文对比密码极度危险,WordPress内置了密码哈希验证机制,应该用wp_check_password()函数:
// 假设用户表密码字段为哈希存储 if(wp_check_password($password, $row['password'])){ // 验证通过的逻辑 }
4. AJAX场景下重定向无效
Elementor Pro表单采用AJAX提交,直接用header('Location: ...')不会触发浏览器跳转,需通过ajax_handler返回跳转指令:
// 替换原header跳转代码 $ajax_handler->add_response_data( 'redirect_url', 'https://www.mywebsite.com' ); $ajax_handler->success(); exit;
修正后的完整代码
add_action( 'elementor_pro/forms/new_record', function( $record, $ajax_handler ) { $form_name = $record->get_form_settings( 'form_name' ); if($form_name=='userloginform'){ // 修正数据库连接参数顺序 $conn = new mysqli("localhost","myuser","mypass","mydatabase"); // 检查连接错误 if ($conn->connect_error) { $ajax_handler->add_error_message( '数据库连接失败,请稍后重试' ); return; } $raw_fields = $record->get( 'fields' ); $fields = []; foreach ( $raw_fields as $id => $field ){ $fields[ $id ] = $field['value']; } $email=trim($fields['email']); $password=trim($fields['pass']); // 使用预处理语句防止SQL注入 $stmt = $conn->prepare("SELECT * FROM tablename WHERE email = ?"); $stmt->bind_param("s", $email); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $stmt->close(); $conn->close(); if(!empty($row)){ // 使用WordPress内置函数验证密码(假设密码为哈希存储) if(wp_check_password($password, $row['password'])){ // AJAX场景下的正确重定向方式 $ajax_handler->add_response_data( 'redirect_url', 'https://www.mywebsite.com' ); $ajax_handler->success(); exit; }else{ $ajax_handler->add_error_message( '密码错误!请重试...' ); } }else{ $ajax_handler->add_error_message( '未找到该邮箱,请输入有效的邮箱地址...' ); } } } );
注意:修改代码中的数据库信息、表名,确保用户表的密码字段是通过WordPress的wp_hash_password()哈希存储的,否则wp_check_password()无法正常验证。
内容的提问来源于stack exchange,提问作者Muhammad Irfan
相关产品推荐
相关产品推荐

