将数组从AJAX传递到PHP,然后将数据作为JSON传回

时间:2017-06-05 20:31:01

标签: php json

我有一个奇怪的问题,我的PHP / JSON数据是由PHP返回的。这是我的PHP:

            <?php
            /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
            * Easy set variables
            */

            /* Array of database columns which should be read and sent back to DataTables. Use a space where
            * you want to insert a non-database field (for example a counter or static image)
            */

            // add your columns here!!!
                $aColumns = array( 'Action', 'TimeOccurred', 'UserName', 'IPv4From', 'ShareName', 'FullFilePath', 'NewPathName', 'FromServer' );
                //$aColumns = $_POST['selcolumns'];
                //$aColumns = explode("-", $aColumns);

                foreach ($aColumns as $col) {
                    file_put_contents( '../php/php-debug.txt', $col." ", FILE_APPEND );
                }

                $server = "";
                $database = array("Database" => "");
                $conn = sqlsrv_connect($server, $database); 
                if ($conn === false) die("<pre>".print_r(sqlsrv_errors(), true));



            /* Indexed column (used for fast and accurate table cardinality) */
                $sIndexColumn = "GUID";

            /* DB table to use */
                $sTable = $_POST['table'];

            /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
            * If you just want to use the basic configuration for DataTables with PHP server-side, there is
            * no need to edit below this line
            */

            /*
            * Local functions
            */
                function fatal_error ( $sErrorMessage = '' ) {
                    header( $_SERVER['SERVER_PROTOCOL'] .' 500 Internal Server Error' );
                    die( $sErrorMessage );
                }

            /* Ordering */
                $sOrder = "";
                if ( isset( $_POST['order'] ) ) {
                    $sOrder = "ORDER BY ";
                    if ( $_POST['columns'][0]['orderable'] == "true" ) {
                        $sOrder .= "".$aColumns[ intval( $_POST['order'][0]['column'] ) ]." ".
                        ($_POST['order'][0]['dir']==='asc' ? 'asc' : 'desc');
                    }
                }

            /* escape function */
                function mssql_escape($data) {
                    if(is_numeric($data))
                    return $data;
                    $unpacked = unpack('H*hex', $data);
                    return '0x' . $unpacked['hex'];
                }

            /* Filtering */
                $sWhere = "";
                if ( isset($_POST['search']['value']) && $_POST['search']['value'] != "" ) {
                    $sWhere = "WHERE (";
                    for ( $i=0 ; $i<count($aColumns) ; $i++ ) {
                        $sWhere .= $aColumns[$i]." LIKE '%".addslashes( $_POST['search']['value'] )."%' OR ";
                    }
                    $sWhere = substr_replace( $sWhere, "", -3 );
                    $sWhere .= ')';
                }

            /* Individual column filtering */
                for ( $i=0 ; $i<count($aColumns) ; $i++ ) {
                    if ( isset($_POST['columns'][$i]) && $_POST['columns'][$i]['searchable'] == "true" && $_POST['columns'][$i]['search']['value'] != '' ) {
                        if ( $sWhere == "" ) {
                            $sWhere = "WHERE ";
                        }
                        else {
                            $sWhere .= " AND ";
                        }
                        $sWhere .= $aColumns[$i]." LIKE '%".addslashes($_POST['columns'][$i]['search']['value'])."%' ";
                    }
                }

            /* Add the custom Date/Time filter */

                if ( $sWhere == "" ) {
                    $sWhere = "WHERE (TimeOccurred >= "."'".$_POST['datestart']."'"." AND TimeOccurred <= "."'".$_POST['dateend']."')";
                }
                else {
                    $sWhere .= " AND (TimeOccurred >= "."'".$_POST['datestart']."'"." AND TimeOccurred <= "."'".$_POST['dateend']."')";
                }

            /* Paging */
                $top = (isset($_POST['start']))?((int)$_POST['start']):0 ;   
                $limit = (isset($_POST['length']))?((int)$_POST['length'] ):5;
                $sQuery = "SELECT TOP $limit ".implode(', ', $aColumns)." FROM $sTable $sWhere ".(($sWhere=="")?" WHERE ":" AND ")." $sIndexColumn NOT IN ( SELECT TOP $top $sIndexColumn FROM $sTable $sOrder ) $sOrder";
                $rResult = sqlsrv_query($conn, $sQuery);
                if($rResult === false){
                    die(sqlsrv_errors(SQLSRV_ERR_ERRORS));
                }

            /* Data set length after filtering */
                $sQueryCnt = "SELECT * FROM $sTable $sWhere";
                $rResultCnt = sqlsrv_query($conn, $sQueryCnt, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
                $iFilteredTotal = sqlsrv_num_rows( $rResultCnt );

            /* Total data set length */
                $sQuery = "SELECT COUNT(GUID) FROM $sTable";
                $rResultTotal = sqlsrv_query($conn, $sQuery, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
                $aResultTotal = sqlsrv_fetch_array($rResultTotal, SQLSRV_FETCH_NUMERIC);
                $iTotal = $aResultTotal[0];

            /* Output */
                $output = array(
                    "draw" => intval($_POST['draw']),
                    "recordsTotal" => $iTotal,
                    "recordsFiltered" => $iFilteredTotal,
                    "data" => array()
                );

                while ( $aRow = sqlsrv_fetch_array( $rResult, SQLSRV_FETCH_ASSOC) ) {
                    $row = array();
                    for ( $i=0 ; $i<count($aColumns) ; $i++ ) {
                        $row[$aColumns[$i]] = $aRow[ $aColumns[$i] ];
                    }
                    $output['data'][] = $row;
                }

                echo json_encode( $output );

            ?>

让我陷入困境的代码部分:

            $aColumns = array( 'Action', 'TimeOccurred', 'UserName', 'IPv4From', 'ShareName', 'FullFilePath', 'NewPathName', 'FromServer' );
            //$aColumns = $_POST['selcolumns'];
            //$aColumns = explode("-", $aColumns);

            foreach ($aColumns as $col) {
                file_put_contents( '../php/php-debug.txt', $col." ", FILE_APPEND );
            }

如果我按原样保留我的代码并运行整个过程,我会按预期恢复数据并且一切正常。我也在我的php-debug.txt中获得了这个输出:

操作TimeOccurred UserName IPv4From ShareName FullFilePath NewPathName FromServer

如果我将这些代码行修改为:

            //$aColumns = array( 'Action', 'TimeOccurred', 'UserName', 'IPv4From', 'ShareName', 'FullFilePath', 'NewPathName', 'FromServer' );
            $aColumns = $_POST['selcolumns'];
            $aColumns = explode("-", $aColumns);

            foreach ($aColumns as $col) {
                file_put_contents( '../php/php-debug.txt', $col." ", FILE_APPEND );
            }

我没有按预期收回数据。我收到一条警告,声明无效的JSON响应,在我的php-debug.txt中,我得到了这样的内容:

操作TimeOccurred UserName IPv4From ShareName FullFilePath NewPathName FromServer

让我疯狂的是阵列具有相同的值,但它不起作用。第二次在php-debug.txt的末尾有一个额外的空间,不知道它来自哪里或是否是问题。

希望有人能指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

我弄明白了这个问题。由于某种原因,我的数组中添加了一个额外的元素,但它是一个空元素,因此当我打印时,那里什么都没有。我把它添加到我的代码array_pop($ aColumns);而现在,这解决了问题。虽然它是一种肮脏的锻炼,但我不禁想到最终会出现一个场景,即最后一个元素不是空白而且是我需要的东西。很想找出更清洁的解决方案。