我在wordpress主题的ajax表单上使用simple-php-captcha(https://github.com/claviska/simple-php-captcha)脚本, 当它在localhost上运行时它工作正常,但当我在在线主机上传它时,验证码不匹配,每件事情都很好,验证码图像加载,会话被创建但是验证码显示在图片与提交表单时的图片不同。
的functions.php
require_once( get_template_directory() . '/libs/captcha/simple-php-captcha.php' );
require_once( get_template_directory() . '/inc/ajax/testimonial.php' );
的header.php
session_start();
$_SESSION['captcha'] = simple_php_captcha();
html表单
<form action="<?php echo admin_url("admin-ajax.php"); ?>" class="dw-ajax-form dw-form" method="post" id="send_testimonial">
<input type="text" name="name" placeholder="name">
<input type="text" name="job" placeholder="company / job">
<input type="text" name="email" placeholder="Email address">
<textarea type="textarea" name="comment" placeholder="your opinion about us"></textarea>
<div class="block captcha-image">
<img src="<?php echo $_SESSION['captcha']["image_src"]; ?>" alt="<?php echo $_SESSION['captcha']["code"]; ?>">
</div>
<input type="text" name="captcha" placeholder="enter the code above" autocomplete="off">
<input type="hidden" name="action" value="send_testimonial">
<?php wp_nonce_field( 'send_testimonial', 'send_testimonial_nonce' ); ?>
<input type="submit" value="send"> <span class="msg" style="margin-right:15px;"></span>
</form>
ajax函数(/inc/ajax/testimonial.php)
<?php
/**
* Testimonial Form Ajax Callbacks
*
* @package Wordpress
* @subpackage Learnfiles-shop Theme
* @author Dornaweb.com
*/
add_action( 'wp_ajax_send_testimonial', 'dw_send_testimonial' );
add_action( 'wp_ajax_nopriv_send_testimonial', 'dw_send_testimonial' );
function dw_send_testimonial() {
global $wpdb;
$message = '';
$name = strip_tags( htmlspecialchars( $_POST["name"] ) );
$job = strip_tags( htmlspecialchars( $_POST["job"] ) );
$email = strip_tags( htmlspecialchars( $_POST["email"] ) );
$comment = strip_tags( htmlspecialchars( $_POST["comment"] ) );
/* captcha */
$captcha_input = strtolower( strip_tags( htmlspecialchars( $_POST["captcha"] ) ) );
$captcha_code = strtolower( $_SESSION['captcha']['code'] );
/** Validation **/
if( !$_SESSION['captcha'] || !is_array( $_SESSION['captcha'] ) )
die( '<span class="error">Somethings wrong</span>' );
/******************************* IT ALWAYS GIVES ME THIS ERROR WHEN ONLINE , BUT IT WORKS ON LOCALHOST( i also tried it with "!=" operator ) **************/
if( $captcha_code !== $captcha_input )
die( '<span class="error">The entered code doesnt match</span>' );
/**********************************************************************************************************************************************************/
if ( !isset( $_POST['send_testimonial_nonce'] ) || ! wp_verify_nonce( $_POST['send_testimonial_nonce'], 'send_testimonial' ) )
die('<span class="error">Somethings wrong</span>');
if( empty( $comment ) )
die('<span class="error">Please enter your comment</span>');
if( empty( $name ) )
die('<span class="error">please enter your name</span>');
if( !empty( $email ) && !filter_var($email, FILTER_VALIDATE_EMAIL) )
die('<span class="error">the entered email doesnt look like an email address</span>');
if( empty( $name ) && empty( $comment ) )
die('<span class="error">please fill the form</span>');
/* send testimonial */
$testimonial = array(
'post_title' => $name,
'post_status' => 'pending',
'post_type' => 'testimonials',
'post_author' => 1
);
$post_id = wp_insert_post( $testimonial );
update_field( 'job', $job, $post_id );
update_field( 'email', $email, $post_id );
update_field( 'comment', $comment, $post_id );
// form is valid
if( empty( $message ) )
$message = '<span class="success">Your comment submitted! thank you.</span>';
echo $message;
wp_die();
}
编辑:
我在这里运行测试(抱歉页面是波斯语):http://test.dornaweb.ir/,页面中间有一个表单,当您点击它时,它会显示var_dump()
$_SESSION['captcha']
,正如您所看到的,图片中显示的代码与var_dump
数据中的代码不同,就像表单提交$ _SESSION时提前一步或某事一样像那样,奇怪的是当我在localhost上使用完全相同的主题时没有出错!!
答案 0 :(得分:2)
看起来有一些重复的请求(也可以从提供的access.log来判断)。这可能是由服务器上的丢失/不可访问文件引起的(在localhost上可以访问/访问,因此不会导致问题)。如果要求这样做,一些重写代码(在WP或.htaccess中的mod_rewrite中)会重写&#34;失败&#34;请求并将其发送到主脚本。然后,在主脚本中,会话数据被新的验证码覆盖......
这些问题有时难以发现。从:
开始寻找localhost和服务器之间的差异
通过跟踪生成的html代码中的每个链接并检查它们是否给出预期的响应来查找请求
也许您也可以将一些调试消息写入error.log或其他一些日志记录工具。这也可能有助于找到这个。
很抱歉,如果这对您没有任何帮助......