JavaScript 变量传递到新的变量对象 POSTing as undefined to another page

JavaScript variables passed into new variable object POSTing as undefined to another page

我有一个名为 SQLFailover.php 的页面,其中显示了一个包含两行的 table。每行都有一个切换按钮。第一行上的切换按钮将设置为主要,该行上的服务器名称将由代码前面完成的 SQL 查询确定。第二行的切换将设置为辅助,并将从相同的 SQL 查询中获取服务器名称。当切换任一按钮时,我需要按钮触发 post 到 SQLAction.php。该页面将调用 powershell 脚本,该脚本将更新 table 中的服务器名称,然后使用 header() cmd 重定向回 SQLFailover.php。当 SQLFailover.php 重新加载时,注释为“从 SQL Table 获取当前主服务器和辅助服务器”的部分将执行查询,检索要显示的主服务器和辅助服务器,这在这一点上,将被更改为稍后将添加到 SQLAction.php 页面的 powershell。我遇到的问题是,当我当前的脚本 POST 到操作页面时,键 => 值对未定义。请帮助我了解这是如何发生的并更正我的代码。谢谢。

SQLFailover.php

<link href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
 <div class="portlet-body">
        <div class="table-scrollable">
            <table class="table table-hover">
                <thead>
                    <tr>
                        <th class="all"> Location </th>
                        <th class="all"> Status </th>
                    </tr>
            </thead>
            <tbody>
                <?php $UserSession = $_SESSION['jigowatt']['username'];?>
                <script> var UserSession = '<?=$UserSession?>';</script>
                <?php
                $env = "CERT";
                if (isset($env)) {
                    if ($env === 'CERT') {
                        
                        $stageEnvironmentType = "CERT";
                        $SQLFileName = "AGL_C_ 01\C01,10995";
                        $serverName = $SQLFileName; 
                    
                        }elseif($env === 'PROD') {
                        
                        $stageEnvironmentType = "PROD";
                        $SQLFileName = "AGL_P_ 01\P01,11111";
                        $serverName = $SQLFileName; 

                    }

                    //SQLServer Connection
                    $connectionInfo = array( "Database"=>"master");
                    $conn = sqlsrv_connect( $serverName, $connectionInfo );

                    if( $conn === false ) {
                        die( print_r( sqlsrv_errors(), true));
                    }else{
    //get current primary server and secondary server from SQL Table
                        $sql = file_get_contents('SQLSelect.sql');
                        $stmt = sqlsrv_query( $conn, $sql);

                        if( $stmt === false ) {
                            die( print_r( sqlsrv_errors(), true));
                        }

                        while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
                            $conn_current_PrimaryReplica = $row['conn_current_PrimaryReplica'];
                            $conn_new_PrimaryReplica = $row['conn_new_PrimaryReplica'];
                            ?>
                            <tr>
                                <td> <?php echo $conn_current_PrimaryReplica;?> </td>
                                <td> 
                                    <input data-server-name="<?php echo "$conn_new_PrimaryReplica";?>" class="toggle-event" checked type="checkbox" data-toggle="toggle" data-on="Primary" data-onstyle="success" data-off="Secondary" data-offstyle="danger" data-size="small" />
                                </td>
                            </tr>
                            <tr>
                                <td> <?php echo $conn_new_PrimaryReplica; ?> </td>
                                <td>
                                    <input data-server-name="<?php echo "$conn_current_PrimaryReplica";?>" class="toggle-event" type="checkbox" data-toggle="toggle" data-on="Primary" data-onstyle="success" data-off="Secondary" data-offstyle="danger" data-size="small" />    
                                </td>
                            </tr>
                            <?php
                      }
                      
                      sqlsrv_free_stmt($stmt);
                       
                    }
                }
                ?>
            </tbody>
        </table>
    </div>
</div>

<script>
     $(function() {
        $('.toggle-event').change(function() {
            var serverName = $(this).data('server-name');
            var mode = $(this).prop('checked');
            var username = '<?=$UserSession?>';
        
            var payload = {
              server: serverName,
              username: username
            };
            var form = document.createElement('form');
            form.style.visibility = 'hidden'; 
            form.method = 'POST'; 
            form.action = '/SQLAction.php';
            for (key in Object.keys(payload)) {
            var input = document.createElement('input');
            input.name = key;
            input.value = payload[key];
            form.appendChild(input); 
            }
            document.body.appendChild(form);
            form.submit(); 
          })
    })
</script>

下面是 SQLAction.php 页面。

<?php
echo "<b>begin POST values</b><br><br>";
foreach ($_POST as $key => $value) {
echo "<tr>";
    echo "<td>";
    echo $key;
    echo "</td>";
    echo " : ";
    echo "<td>";
    echo $value;
    echo "</td>";
    echo "</tr>";
    echo "<br>";
}
echo "<b>end of POST values</b><br><br>";

header('refresh:5; / SQLFailover.php ');
?>

您的代码的对象键迭代似乎不正确(至少它看起来是非标准的)并且发现提取的值未定义。 (我测试了你的代码,它生成了未定义的值)

请通过 Object.keys(obj).forEach 构造迭代您的对象键,语法如下:

Object.keys(obj).forEach(key => {
//  console.log(key, obj[key]);
});

因此,对于您的情况,请更改块

 for (key in Object.keys(payload)) {
            var input = document.createElement('input');
            input.name = key;
            input.value = payload[key];
            form.appendChild(input); 
            }

Object.keys(payload).forEach(key => {

            var input = document.createElement('input');
            input.name = key;
            input.value = payload[key];
            form.appendChild(input); 
});

该页面现在正在处理对函数中 for 行的更改。

<script>
$(function() {
    $('.toggle-event').change(function() {
        var serverName = $(this).data('server-name');
        var mode = $(this).prop('checked');
        var username = '<?=$UserSession?>';
        
        var payload = {
            server: serverName,
            mode: mode,
            username: username
        };
        var form = document.createElement('form');
        form.style.visibility = 'hidden';
        form.method = 'POST';
        form.action = 'SNFailover/SQLAction.php';
        $.each(Object.keys(payload), function(index, key) {
        var input = document.createElement('input');
            input.name = key;
            input.value = payload[key];
            form.appendChild(input)
        });
        document.body.appendChild(form);
        form.submit();
    });
})