2

我有这个功能Utils.php

function GenerateMonthlyReport($connection, $month, $year, $objSheet)
 {     
     $months = array("Enero", "Febero", "Marzo", "Abril", "Mayo", "Junio" ,"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");       
     $fromDate = $year . "-" . $month . "-01";
     $toDate = "";

   if ($month != 12)
    $toDate = $year . "-" . ($month+1) . "-01";
  else
   $toDate = ($year+1) . "-01-01";

 etc..
}

然后在另一个文件中我使用这样的参数createReport.php调用这个函数$_POST

 include "Utils.php";
 include "Connect.php";
 require_once('PHPExcel/Classes/PHPExcel.php');

 checkLogin();

 // Connect to Db
 $connection = openDb(); 

 // Input Data
 $month =  mysqli_real_escape_string($connection, $_POST["month"]);
 $year =  mysqli_real_escape_string($connection, $_POST["year"]);

 $objPHPExcel = CreateEmptyWorkbook();
 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); // create the writer
 $objSheet = $objPHPExcel->getActiveSheet();

 GenerateMonthlyReport($connection, $month, $year, $objSheet);

问题:我传递给函数 GenerateMonthlyReport$year的参数在函数内部。$monthnull

但如果我做这样的事情:

 GenerateMonthlyReport($connection, "3", "2013", $objSheet);

它们被正确传递。

如果我回显$year$month变量,它们会显示值!

另外:这种奇怪的行为只发生在我从移动设备提交表单时。PC 浏览器不会发生这种情况。

编辑:这是表单 HTML 代码:

    <form id="reportForm" action="/service/createMonthlyReport.php"  method="post">
   <table border="1">
   <tr>
   <td>
     Seleccione Per&iacute;odo
   </td>
   <td>
      <label>Mes</label><br/>
       <select id="monthM" name="month" > 
             <?php for ($i=1; $i<=12; $i++) :?>
               <option value="<?php echo $i; ?>"   <?php echo date("n") != $i ? "" : "selected" ?>>
                 <?php echo $monthName = date("M", mktime(0, 0, 0, $i, 10)); ?>
               </option>          
             <?php endfor; ?>
            </select>
            </td>

        <td>
        <label>Anio</label><br/>
            <select id="yearM" name="year" > 
             <?php for ($i=-5; $i<=5; $i++) :?>
                 <?php $yearData = (date("Y") + $i); ?>
               <option value="<?php echo $yearData; ?>"  <?php echo date("Y") != $yearData ? "" : "selected" ?>>
                 <?php echo $yearData; ?>
               </option>
             <?php endfor; ?>
            </select>                   
        </td>
        <td>    

            <input type="submit" value="Descargar Reporte Mensual" id="submitBtn" class="crearBtn" />
            </td>
    </tr>
    </table>
   </form>

开放数据库代码:

function openDb() {
 $sever = "myserver";
 $database_name = "dbname";
 $user = "user";
 $pass = "mypass";

 $connection = new mysqli($server, $user, $pass, $database_name) or die("DB connection failed!");;
 $connection->set_charset("utf8");
 mysqli_query($connection, 'SET NAMES utf8');
 mysqli_query($connection, 'SET CHARACTER SET utf8');

 return $connection;
}
4

1 回答 1

1

您的 DB 编码是 UTF-8,但您可以通过使用 HTML 实体(如&iacute;. 我想知道 UTF-8 工作流程中的某些 ISO 8859-1 是否会破坏 PHP 或其扩展之一。确保您有正确header()的 UTF-8,并且所有内容(例如,隐藏的表单变量)都是正确的 UTF-8 编码的。

无论如何,一个null不应该出现的变量(在你的情况下是两个)可能是错误引用计数的结果。引用是一种底层机制,当一个变量的值被分配给另一个变量时,它不会被复制,但是两个变量都指向同一个值,它的引用计数为 2(或更多)。例如,如果引用计数在赋值时不增加,但在变量超出范围时减少,则它可能会在应该为 1 时变为 0,并且该值被错误地释放。

我想我已经看到了一个引用计数错误。它可能在数据库扩展中(可能是sybase扩展,但我不确定)。如果是这样,它可能在一个*_fetch_*()函数中。

尝试取出您的代码片段。尝试忽略数据库调用(包括checkLogin(),我猜),和/或PHPExcel部分,和/或其他,然后再进入有问题的函数(GenerateMonthlyReport())。

检查您的代码中是否有 PHP 引用 ( &)。如果是这样,请尝试不使用它们(它们本身还不错,但是在低级别上很复杂,它们更有可能触发上述类型的错误)。

为了排除名称冲突,还请尝试以下操作:重命名yearand monthto year0and month0in the form and in $_POST, $yearand $monthto $year1and $month1in main, and $yearand $monthto $year2and $month2in GenerateMonthlyReport()

于 2013-03-31T00:31:09.903 回答