AJAX将数据保存到文档上的数据库准备就绪,未保存任何数据

时间:2012-01-31 作者:Morne Zeelie

我写了一个插件,可以收集文档就绪状态的统计信息。

请记住,我的数据库表已经创建。

我添加了以下代码来执行ajax代码

add_action( \'wp_head\', \'zkr_stats_ajax\' );
function zkr_stats_ajax(){
?>
        <script type=\'text/javascript\' >
        jQuery(document).ready(function() {
        //jQuery(window).load(function() {

                //set data varialbel with values


                var data = {
                        action: \'action_stats\',
                        zkr_filename: \'<?php echo $_SERVER[\'PHP_SELF\']; ?>\',
                        zkr_ip: \'<?php echo $_SERVER[\'REMOTE_ADDR\']; ?>\',
                        zkr_referer: \'<?php if(isset($_SERVER[\'HTTP_REFERER\'])){ echo $_SERVER[\'HTTP_REFERER\'];}else{ } ?>\',
                        zkr_browser: \'<?php echo $_SERVER[\'HTTP_USER_AGENT\']; ?>\',
                        zkr_method: \'<?php echo $_SERVER[\'REQUEST_METHOD\']; ?>\'


                };

                var ajaxurl = \'<?php admin_url(\'admin-ajax.php\'); ?>\'; // set the admin ajax url
                jQuery.post(ajaxurl, data, function(response) {

                });               

        });

        </script>
<?php
}
然后有一个函数处理从上述ajax发送的数据,并将数据存储到mysql数据库表中。

add_action(\'wp_ajax_nopriv_action_stats\', \'zkr_stats_update\'); //ajax callback
function zkr_stats_update(){
        global $wpdb;

        if(isset($_POST)){
        $filename = $_POST[\'zkr_filename\'];

        $ip = $_POST[\'zkr_ip\'];
        $referer = $_POST[\'zkr_referer\'];
        $browser = $_POST[\'zkr_browser\'];
        $method = $_POST[\'zkr_method\'];



            $table_name = $wpdb->prefix . "zkr_stats";
            $row = $wpdb->get_results( "SELECT * FROM ".$table_name." WHERE ip = \'$ip\' ");
            if($wpdb->num_rows == 0){

                $num = 1;

                $wpdb->query( $wpdb->prepare( "INSERT INTO ". $wpdb->prefix ."zkr_stats(ip, filename, referer, browser, method, timestamp, number) VALUES(\'".$ip."\', \'".$filename."\', \'".$referer."\', \'".$browser."\', \'".$method."\', NOW(), \'".$num."\')" )) or wp_die( \'Could not save data!\' ); //insert new data if the current ip was not used before
            }
            elseif($wpdb->num_rows == 1){

            foreach($row as $rows){
            $num = $rows->number + 1;
            }
            $wpdb->query( $wpdb->prepare( "UPDATE ".$table_name." SET number = \'".$num."\' WHERE ip = \'".$ip."\'" ))or wp_die( \'Could not update data!\' ); //update visit data for old ip

            }
        }





}
现在,当页面加载时,我可以在firebug中看到数据是通过ajax发布的,但没有保存任何内容。

只有当我将函数zkr\\u stats\\u update()添加到主题的标题中时,它才会保存,但随后它会保存两个,一个是空的,一个是带数据的。

我做错了什么?

谢谢各位

3 个回复
SO网友:kaiser

您使用的方式$wpdb->prepare 没有任何帮助。您必须正确准备这些值,然后像sprintf%s%d.

哦,我不相信“与WP ajax合作超过一年”。在这种情况下,您还可以了解nopriv 公用挂钩:)

add_action( \'wp_ajax_nopriv_action_stats\', ...

SO网友:Chris_O

我认为问题是if(isset($_POST)) 返回false,并且没有执行任何代码。

尝试删除它,或者更好地创建一个响应变量来回显Ajax,以便您可以在Firebug中检查它。

if(isset($_POST)){
    $response = \'Post returned true\';

// Your database code

  } else { $response = \'Post returned false\'; }

echo $response;

die(1);

SO网友:Morne Zeelie

好的,我已经解决了这个问题。

我不得不将ajaxurl更改为MyAjax。ajaxurl

                jQuery.post(MyAjax.ajaxurl, data, function(response) {

                });               
在我的php代码中,我必须添加以下内容

function my_scripts_method() {
    wp_enqueue_script(  \'jquery\'  );
    // declare the URL to the file that handles the AJAX request (wp-admin/admin-ajax.php)
    wp_localize_script( \'my-ajax-request\', \'MyAjax\', array( \'ajaxurl\' => admin_url( \'admin-ajax.php\' ) ) );
}    
add_action(\'wp_enqueue_scripts\', \'my_scripts_method\');
如果不做上述事情,任何事情都不起作用,最重要的部分是wp_localize_script 部分

我希望这能帮助其他人,当他们陷入困境时?

谢谢大家的帮助,即使是你,你也不能完全帮助我:)

结束