PHP 传递参数以执行奇怪的行为

标签 php linux apache post

我在 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$month 在函数内部是 null

但是如果我这样做:

 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>

openDB代码:

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;
}

最佳答案

您的数据库编码是 UTF-8,但您通过使用 í 等 HTML 实体来避免代码中超过 128 个字符。我想知道您的 UTF-8 工作流程中的某些 ISO 8859-1 是否会破坏 PHP 或其扩展之一。确保您拥有适合 UTF-8 的 header(),并且所有内容(例如,隐藏的表单变量)都经过正确的 UTF-8 编码。

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

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

试着去掉你的代码片段。在到达您拥有的函数之前,尝试省略数据库调用(包括 checkLogin(),我猜)和/或 PHPExcel 部分和/或其他部分问题 (GenerateMonthlyReport())。

检查您的代码中是否有 PHP 引用 (&)。如果是这样,尽量不用它们(它们本身并不坏,但在低级别上很复杂,它们更容易触发上述类型的错误)。

为了排除名称冲突,还请尝试以下操作:将 yearmonth 重命名为 year0month0$_POST 中,$year$month$year1 $month1 在主体中,$year$month$year2$month2GenerateMonthlyReport() 中。

关于PHP 传递参数以执行奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15488535/

相关文章:

php - AWS SQS 不遵守 WaitTimeSeconds

php - RabbitMQ + PHP部署攻略

linux - 将命令输出存储到变量时如何保留换行符?

php - 超简单的 HTTP 套接字服务器,用 PHP 编写,表现出乎意料

java - Apache POI 未正确格式化单元格

php - 在 Yii2 中使用没有命名空间的类

php - 通过 PHP 访问文件属性

linux - 如何发现物理音频输入 channel 列表?

linux - 如何更改目录颜色?

java - Tomcat 前面的 Apache HTTPD 时 WebSocket 连接中断