在Wordpress中使用JSON的Ajax parsererror

时间:2017-10-17 11:58:38

标签: php jquery json ajax wordpress

我正在为一所学校做一个应用程序网站,而我在尝试编辑学生时遇到困难。我希望用户单击特定学生的行,然后打开包含他的数据的表单。

我必须做一个ajax请求,所以我可以调用我的php函数(在我的db上进行查询的那个)并在表单中加载数据。这是我的ajax请求的jQuery代码:

//When you click in the table students, in some element whose class is edit ...
    $("#tblAlumnos").on("click", ".editar", function(event) {

    var rowID = $(this).parents('tr').attr('id');

    $.ajax({
        type: 'POST',
        url: '../ajax/',
        data: {'table': 'alumnos', 'action': 'carga', 'ids': rowID},
        dataType: 'json',
        success: function(result) {

            console.log(result.nombre);

        },

        error: function (jqXHR, exception) {
            if (jqXHR.status === 0) {
                alert('Not connect.\n Verify Network.');
            } else if (jqXHR.status == 404) {
                alert('Requested page not found. [404]');
            } else if (jqXHR.status == 500) {
                alert('Internal Server Error [500].');
            } else if (exception === 'parsererror') {
                alert('Requested JSON parse failed.');
                alert(jqXHR.status);
                alert(jqXHR);
            } else if (exception === 'timeout') {
                alert('Time out error.');
            } else if (exception === 'abort') {
                alert('Ajax request aborted.');
            } else {
                alert('Uncaught Error.\n' + jqXHR.responseText);
            }
        }
    });

});

ajax请求调用方法从我的db获取数据:

function cargaAlumno($ids) {

        require 'db.php';

        $sql = "SELECT * FROM Alumnos WHERE ID=$ids";
        $result = $conexion->query($sql);


        if ($result->num_rows > 0) {

            $row = $result -> fetch_assoc();

            $nombre = $row['Nombre'];
            $apellidos = $row['Apellidos'];
            $telefono = $row['Telefono'];
            $usuario = $row['Usuario'];
            $contrasena = $row['Contrasena'];

            $result = array();
            $result["nombre"] = $nombre;
            $result["apellidos"] = $apellidos;
            $result["telefono"] = $telefono;
            $result["usuario"] = $usuario;
            $result["contrasena"] = $contrasena;

            ChromePhp::warn($result);
            ChromePhp::warn(json_encode($result));
            echo json_encode($result);

        }

    }

此方法必须将JSON返回给ajax请求,但由于错误:parsererror,从未到达success方法。

我尝试过使用dataType:'json'(这是我有错误的时候)而没有它(它认为是html)。我也尝试过使用和不使用contentType以及我的php:header('Content-type:application / json; charset = utf-8')。

我的json编码看起来像这样:

{"nombre":"Susana","telefono":"56765336","usuario":"susa"}

我不知道我是否需要更多方法,因为我在Wordpress中使用它或者我的代码中有错误。

任何帮助将不胜感激。提前谢谢你:)

2 个答案:

答案 0 :(得分:0)

如果你在Wordpress中这样做,我会使用内置的wpdb来处理数据库连接和结果。像这样:

function cargaAlumno() {

    global $wpdb;
    $ids = $_POST['ids'];

    $sql = $wpdb->get_results( 
        $wpdb->prepare("
        SELECT * 
        FROM Alumnos
        WHERE id = '$ids'
        ")
    );

    echo json_encode($sql);

    exit();

    }

还要记住这会进入你的主题functions.php文件。

请记住将其挂钩到wp_ajax挂钩:

add_action( 'wp_ajax_nopriv_cargaAlumno', 'cargaAlumno' );
add_action( 'wp_ajax_cargaAlumno', 'cargaAlumno' );

然后在你的ajax:

$("#tblAlumnos").on("click", ".editar", function(event) {

    var rowID = $(this).parents('tr').attr('id');

    $.ajax({
        type: 'POST',
        url: ajaxurl, //this is a wordpress ajaxurl hook
        data: {'table': 'alumnos', 'action': 'cargaAlumno', 'ids': rowID}, // You didn't use the correct action name, it's your function name i.e. cargaAlumno 
        //dataType: 'json', dont need this
        success: function(result) {
           //Parse the data
            var obj = jQuery.parseJSON(result);
            console.log(obj[0].nombre); // I'm guessing nombre is your db column name

        },

        error: function (jqXHR, exception) {
            if (jqXHR.status === 0) {
                alert('Not connect.\n Verify Network.');
            } else if (jqXHR.status == 404) {
                alert('Requested page not found. [404]');
            } else if (jqXHR.status == 500) {
                alert('Internal Server Error [500].');
            } else if (exception === 'parsererror') {
                alert('Requested JSON parse failed.');
                alert(jqXHR.status);
                alert(jqXHR);
            } else if (exception === 'timeout') {
                alert('Time out error.');
            } else if (exception === 'abort') {
                alert('Ajax request aborted.');
            } else {
                alert('Uncaught Error.\n' + jqXHR.responseText);
            }
        }
    });

});

这个js文件需要添加到你的主题中才能与上面的重写函数一起工作()

如果您需要更多帮助或有任何其他问题,请告诉我。

答案 1 :(得分:0)

不确定您是否只提供代码的特定行或者这是完整的事情,无论如何,这绝对是 NOT 您应该如何处理WordPress中的AJAX请求:

  • 您应该将wp_ajax_用于需要身份验证的操作,或wp_ajax_nopriv_用于不需要身份验证的操作
  • 您应该为此功能创建操作,并使用admin-ajax.php
  • 通过admin_url()发送您的请求
  • 您应该使用wp_create_nonce()创建符号并使用wp_verify_nonce()
  • 进行验证,从而确保您的请求安全
  • 您应该在检查$_SERVER['HTTP_X_REQUESTED_WITH']
  • 时限制对AJAX文件的直接访问

由于您已经在functions.php中工作并且已建立数据库连接,因此无需要求db.php。

请改用以下方法:

global $wpdb;
$query = "SELECT * FROM table_name";
$query_results = $wpdb->get_results($query);

要进行整理,请遵循以下结构:

前端( php 文件):

<?php
$ajax_nonce = wp_create_nonce("change_to_action_name");
$ajax_link = admin_url('admin-ajax.php?action=change_to_action_name&nonce=' . $ajax_nonce);
?> 
<a class="do_ajax" href="#" data-ajax_link="<?php echo ajax_link; ?>" data-ajax_param="other_param">DO AJAX</a>
<input id="param" value="" />

脚本文件( js 文件):

$('.do_ajax').click(function () {
        var ajax_link = $(this).attr('data-ajax_link');
        var param = $(this).attr('data-ajax_param');

        if (ajax_link && param) {
            $.ajax({
                type: "post",
                dataType: "json",
                url: ajax_link,
                data: {
                    param: param,
                },
                success: function (response) {
                    if (response.type == "success") {

                    /*Get/updated returned vals from ajax*/
                    $('#param').val(response.new_param);
                        console.log('ajax was successful');

                    } else if (response.type == "error") {
                       console.log('ajax request had errors');
                    }else{
                        console.log('ajax request had errors');
                    }
                }
            });
        } else {
            console.log('ajax not sent');
        }
    });

函数文件( functions.php 文件):

add_action("wp_ajax_change_to_action_name", "change_to_action_name");
add_action("wp_ajax_nopriv_change_to_action_name", "change_to_action_name");
function change_to_action_name()
{
    if (!wp_verify_nonce($_REQUEST['nonce'], "change_to_action_name")) {
        exit("You think you are smart?");
    }

    $param = $_REQUEST['param'];

    /*php actions goes here*/
    $actions_success=0;
    if($actions_success){

    /*Query db and update vals here*/

        $new_param = "new_val";
        $result['new_param'] = $new_param;
        $result['type'] = "success";

    }else{
        $result['type'] = "error";
    }

    if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
        $result = json_encode($result);
        echo $result;
    } else {
        header("Location: " . $_SERVER["HTTP_REFERER"]);
    }
    die();
}

您当前的代码包含许多安全漏洞,因此建议您更新它并使用上述方法。

干杯!