为啥当我得到我的数据时似乎未定义/为空?我正在使用 jQuery.post() 从 JS 向 PHP 发送数据

Posted

技术标签:

【中文标题】为啥当我得到我的数据时似乎未定义/为空?我正在使用 jQuery.post() 从 JS 向 PHP 发送数据【英文标题】:Why when I get my data seems undefined/empty? I'm sending data with jQuery.post() from JS to PHP为什么当我得到我的数据时似乎未定义/为空?我正在使用 jQuery.post() 从 JS 向 PHP 发送数据 【发布时间】:2021-09-19 19:28:20 【问题描述】:

我的问题:我正在使用 jQuery 的 $.post 方法向我的 php 发送数据。出于某种原因,data 似乎未定义。

让我解释一下我的代码的结构...

1.我有以下带有 onClick 功能的按钮:

$data->acción = "<div class='text-center'><div class='btn-group'><button id='modificar_$data->id' class='btn btn-primary btn-sm btnEditar' value='edit'><i class='material-icons'>edit</i></button><button id='deleteID_$data->id' onclick='Delete($data->id, $tableName, $idName)' class='btn btn-danger btn-sm btnBorrar'><i class='material-icons' value='delete'>delete</i></button></div></div>";

相同的代码缩进以获得更好的可读性:

$data->acción = "
    <div class='text-center'>
        <div class='btn-group'>
            <button 
                id='modificar_$data->id' 
                class='btn btn-primary btn-sm btnEditar' 
                value='edit'
            >
                <i class='material-icons'>edit</i>
            </button>
            <button 
                id='deleteID_$data->id' 
                onclick='Delete($data->id, $tableName, $idName)' 
                class='btn btn-danger btn-sm btnBorrar'
            >
                <i class='material-icons' value='delete'>delete</i>
            </button>
        </div>
    </div>
";

2。我的Delete() 函数:

function Delete(id, tableName, idName) 
    if (confirm("¿Estás seguro que deseas borrar el registro con ID " + id + "?") == true) 
        
        console.log("First parameter: " + id + "\nSecond parameter: " + tableName + "\nThird parameter: " + idName); // I GET MY FUNCTION PARAMETERS.
        console.log("<?=SITE_URL_ADMIN?>/alexcrudgenerator/crud/res/?action=deleteRegistro&tabla=" + tableName + "&nombre_campo=" + idName + "&id=" + id); // I GENERATE MY POST URL CORRECTLY.
            
        $.post("<?=SITE_URL_ADMIN?>/alexcrudgenerator/crud/res/?action=deleteRegistro&tabla=" + tableName + "&nombre_campo=" + idName + "&id=" + id, function(data) 
            console.log("My data: " + data);
            if(data == 1) 
                console.log("Data OK");
                //$().hide();
            
            else if (data == '') 
                console.log("Data empty");
            
            else if (data == null) 
                console.log("Data null");
            
            else if (data) 
                console.log("Data exist");
            
            else 
                console.log("Other reasons");
            
        );
    

3.所以你可以看到console.log() 返回的内容:

为什么没有定义data

编辑:这是我的完整代码:(我不想上传完整代码以免造成混淆,我尝试将其最小化并压缩)。

<?php

    use GuzzleHttp\json_decode;
    include_once(DIR_PLUGINS.'/alexcrudgenerator/main.php');

    $test = new GenerateCrud($_POST['tableName'], $_POST['id'], $_POST['tableFields']);

    $action = $_POST['action'];
    if(empty($action))
        $GET = get_vars_for_get();
        $action = $GET['action'];
    
    
    switch($action)

        case 'datosTabla': // OK.

            //print_r($_POST['action']);
            $res = json_decode($_POST['datos']);
            echo json_encode($res, JSON_UNESCAPED_UNICODE);

            break;

        case 'deleteRegistro':
            //die("Hola");
            $tableName = $_POST['tableName']; // Nombre de la tabla de la base de datos (String).
            $id = $_POST['id'];               // ID (int).
            $idName = $_POST['idName'];       // Nombre del campo ID (String).
            
            echo $tableName;

            //echo deleteRegistro($tableName, $id, $idName);
            
            break;

        case 'showtable': // OK.

            $res = getEntireTable($_POST['tableName'], $_POST['id'], $_POST['tableFields']);
            $tableName = $_POST['tableName'];
            $tableName = json_encode($tableName);

            //$field = json_decode($_POST['tableFields'],1)[0];
            //$field = json_encode($field);
            
            $idName = $_POST['id'];
            $idName = json_encode($idName);

            foreach ($res as $data)                
                $data->acción = "<div class='text-center'><div class='btn-group'><button id='modificar_$data->id' class='btn btn-primary btn-sm btnEditar' value='edit'><i class='material-icons'>edit</i></button><button id='deleteID_$data->id' onclick='Delete($data->id, $tableName, $idName)' class='btn btn-danger btn-sm btnBorrar'><i class='material-icons' value='delete'>delete</i></button></div></div>";
                $resultados['data'][] = $data;
            

            $resultados = json_encode($resultados); // 7 PROPIEDADES

            foreach(json_decode($_POST['tableFields']) as $columnsDB)
                $fields[] = array('data'=>$columnsDB);
            

            $fields[]['data'] = 'acción';
            $fields = json_encode($fields);
            
?>
            <head>
                <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
            </head>

            <div class="container caja">
                <div class="row">
                    <div class="col-lg-12 col-sm-12">
                        <div>
                            <table id="tablaUsuarios" class="table table-striped table-bordered table-condensed hover" style="width:100%" >
                                <thead class="text-center">
                                    <tr>
                                        <?php
                                            foreach (json_decode($_POST['tableFields']) as $columnsTH)
                                                 echo '<th>' . strtoupper($columnsTH) . '</th>';
                                            
                                            echo '<th>ACCIÓN</th>';
                                        ?>
                                    </tr>
                                </thead>
                                <tbody>
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>
            </div>

            <script>

                function Delete(id, tableName, idName)
                    if (confirm("¿Estás seguro que deseas borrar el registro con ID " + id + "?") == true) 
                        
                        console.log("First parameter: " + id + "\nSecond parameter: " + tableName + "\nThird parameter: " + idName); // I GET MY DATA CORRECTLY.
                        console.log("<?=SITE_URL_ADMIN?>/alexcrudgenerator/crud/res/?action=deleteRegistro&tabla=" + tableName + "&nombre_campo=" + idName + "&id=" + id); // I GET MY DATA CORRECTLY.

                        $.post("<?=SITE_URL_ADMIN?>/alexcrudgenerator/crud/res/?action=deleteRegistro&tabla=" + tableName + "&nombre_campo=" + idName + "&id=" + id, function(data)
                            
                            console.log("Typeof: " + typeof(data));
                            console.log("My data: " + data);
                            console.log("My data: ", data);
                            console.log("[" + data + "]")
                            
                            if(data == 1)
                                console.log("Data OK");
                                //$().hide();
                            
                            else if (data == '')
                                console.log("Data empty");
                            
                            else if (data == null) 
                                console.log("Data null");
                            
                            else if (data) 
                                console.log("Data exist");
                            
                            else 
                                console.log("Other reasons");
                            
                        );
                    
                

                $(document).ready(function() 
                    var datos= <?=$resultados?>;
                    var dynamicColumns = <?=$fields?>;
                    datos = JSON.stringify(datos);

                    $('#tablaUsuarios').DataTable(
                        "language": "url": "https://cdn.datatables.net/plug-ins/1.10.25/i18n/Spanish.json",
                        "paging": true,
                        "lengthChange": true,
                        "searching": true,
                        "info": true,
                        "autoWidth": true,
                        "scrollX": true,

                        "ajax":
                            "url": '<?=SITE_URL_ADMIN?>/alexcrudgenerator/crud/res/',
                            "method": 'POST',
                            "data":action: "datosTabla", datos: datos
                        ,

                        "columns": dynamicColumns
                    );
                )
            </script>
<?php
        break;

?>

【问题讨论】:

也许用console.log(data);看看输出是否符合预期? data 不是未定义的,这就是问题所在。你有东西。 如果我尝试打印数据,我只会看到空白。 @DuchyWare @nitrin0 我编辑了我的代码和图像,检查一下,我的data 似乎是空的,对吧? “我的数据似乎是空的,对吧? ” - 不,它没有,它似乎包含文本 No data。因为如果这不是您的服务器响应的内容,那么确切的文本应该来自哪里?它不包含在任何地方的 JS 代码中。 【参考方案1】:

如果您想取回数据,请使用$.get

$.get("<?=SITE_URL_ADMIN?>/alexcrudgenerator/crud/res/?action=deleteRegistro&tabla=" + tableName + "&nombre_campo=" + idName + "&id=" + id, function(result)
    console.log(result);
);

【讨论】:

不幸的是我必须使用 POST。我正在创建一个 CRUD 表,并且我有一个巨大的案例,其中评估了 POST 发送的 action。感谢您的回答! 请注意,POST 可以/也将返回响应。无需使用 GET 来“取回数据”。【参考方案2】:

您在函数 Delete() 中提供的 URL 完全错误,

<?=SITE_URL_ADMIN?>/alexcrudgenerator/crud/res/?action=deleteRegistro&tabla=" + tableName + "&nombre_campo=" + idName + "&id=" + id

此 URl 适用于 GET 方法不发布,用于发布您不需要将数据放入 URL 的任何内容。

$.post("<?=SITE_URL_ADMIN?>/alexcrudgenerator/crud/res/",  
            action: "deleteRegistro",
            id: id,
            tableName: tableName,
            field: field
        , function (data, status)
                if (status === 'error') 
                    console.log("Not deleted");
                
                else if (status === 'success') 
                    console.log("Deleted successfully");                                
                
                if(data != '') console.log("The response is" + data);
                else console.log("There is not response");
            );

这里的function(data, status) 用于错误处理,其中data 是来自URL 的响应,status 是发送到URL 的数据状态。

您必须小心提供条件if(data == 1),其中data 是来自 URL 的响应,因此它不是布尔值。

另一方面,在发布数据的地方处理请求非常重要,因此请检查一次。

有关$.post()的更多信息,请访问here

【讨论】:

以上是关于为啥当我得到我的数据时似乎未定义/为空?我正在使用 jQuery.post() 从 JS 向 PHP 发送数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 JSON 响应在 forEach 上崩溃? TypeError 未定义

为啥我总是在这个 ajax 帖子到 php 时得到未定义的响应?

为啥我的输入变量属性未定义(Angular)

为啥当我使用箭头函数 onClick 时我的变量未定义?

为啥当我使用“require”时我的变量未定义? [复制]

为啥我的 Graphql 项目抛出错误:字段类型必须是输出类型但得到:未定义