2017-06-05 120 views
0

我遇到一个PHP PHP/JSON数据被PHP返回的奇怪问题。这是我的PHP:将数组从AJAX传递到PHP,然后将数据传回为JSON

  $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 
      /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
      * 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); 

      ?> 

已经我坚持代码的一部分作品。我也得到这个输出在我的PHP-DEBUG.TXT:

行动TimeOccurred用户名IPv4From共享名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用户名IPv4From共享名FullFilePath NewPathName FromServer

它快把我逼疯了阵列具有相同的值或者方式,但它不起作用。第二次在php-debug.txt结尾处有一个额外的空间,不确定它来自哪里或者是否是问题。

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

+0

尝试'var_dump($ aColumns);'在你的foreach之前,看看数据是否看起来像你认为应该的 – aynber

+0

这就是我看到的:array(1){[0] => string(0)“”}}不幸的是,我不知道在浏览器中打开该PHP文件,并将POST数据传递给数组。 –

+0

它在'$ _POST'中寻找变量。如果它不是来自一个表单,你会找出它应该来自哪里。 – aynber

回答

0

我想出了这个问题。出于某种原因,有一个额外的元素被添加到我的数组中,但它是一个空元素,所以当我打印时没有任何内容。我将此添加到我的代码array_pop($ aColumns);现在解决了这个问题。尽管这是一种肮脏的锻炼,我不禁想到,最终会出现一个场景,最后一个元素不是空白,而是我需要的东西。很想弄清楚一个更清洁的解决方案。