【问题标题】:PHPExcel Fatal error: Call to a member function put() on a non-objectPHPExcel 致命错误:调用非对象上的成员函数 put()
【发布时间】:2014-04-23 14:01:05
【问题描述】:

我最近将我的网站从共享主机帐户转移到了我提到的 VPS,因为我认为这可能与它有关。无论如何,我正在使用 PHPExcel https://phpexcel.codeplex.com 生成一个 Excel 表,其中包含从 mysql 表中提取的内容。 该脚本在共享主机帐户上运行良好,但现在突然不起作用,而是显示一个错误,指出致命错误:调用非对象上的成员函数 put() 文件和它所引用的行号看起来像下面这样

$user->put($dateProcessed, $amount);


   //below is the code for the page

/**
 * @author Gary Drocella
 * @date 01/10/2014
 * Description: Performs data mining and generates a spread sheet from database.
 */

    $todaydate = date('Y-m-d');

require_once '/home/***/public_html/reports/User.php';
require_once '/home/****/public_html/reports/SpreadsheetGenerator.php';

$dbh = Connection::getConnection();
mysql_select_db("*****", $dbh);


$resultSet = mysql_query("SELECT sys_userprofiles.uid, sys_userprofiles.f_name, 
                              sys_userprofiles.l_name,  sys_userprofiles.acctstatus_id,
                              sys_userlogins.acct_status 
                              FROM sys_userprofiles, sys_userlogins WHERE 
                              sys_userprofiles.acctstatus_id NOT IN(0, 11, 23, 26, 28, 
                              30) AND sys_userprofiles.uid = sys_userlogins.uid AND 
                              sys_userlogins.acct_status = 'active' AND  
                              sys_userlogins.u_level = 2", $dbh);
$userTable = array();

/* Create a user Table */

while($row =mysql_fetch_row($resultSet)) {
    $uid = $row[0];
    $fName = $row[1];
    $lName = $row[2];

    $currUser = new User($uid, $fName, $lName);
    $userTable[$uid] = $currUser;

}

/* Populate user (date,amount) maps */

$resultSet = mysql_query("SELECT DISTINCT uid, str_to_date(paymentdate, '%Y-%m-%d') AS date_processed, SUM(amount) AS total
                          FROM sys_userpayschedule WHERE uid IN (SELECT uid FROM sys_userlogins WHERE acct_status = 'active' AND u_level = 2) 
                          AND str_to_date(paymentdate, '%Y-%m-%d') >= curdate() AND str_to_date(paymentdate, '%Y-%m-%d') <= DATE_ADD(curdate(), interval 6 MONTH) 
                          GROUP BY date_processed, uid ORDER BY date_processed", $dbh);

while($row=mysql_fetch_row($resultSet)) {
    $uid = $row[0];
    $dateProcessed = $row[1];
    $amount = $row[2];

    $user = $userTable[$uid];
    $user->put($dateProcessed, $amount);
}
$spreadSheetGen = new SpreadsheetGenerator();
$spreadSheetGen->generate($userTable);

再一次,除了将所有文件从共享主机帐户移动到 VPS 之外,我什么也没做。所以我想知道他们是否可能是某种服务器端模块,我可能需要在共享主机帐户上安装它以使其正常工作?我仔细检查了所有文件实际上都已移动并位于正确的位置以匹配共享主机帐户上的内容。如果需要,我可以发布完整的页面代码。

有什么建议吗??

如果我做一个 var_dump($user);从我的第二个查询中,我得到一个输出,其中包含 urserid 和名称,但我想到一行左右 下面是 $user 的 var_dump

object(User)#240 (5) { ["uid":"User":private]=> string(5) "10489" ["firstName":"User":private]=> string(5) "Helen" ["lastName":"User":private]=> string(12) "Throckmorton" ["dateTotalTable":"User":private]=> NULL ["dateTable"]=> array(0) { } } object(User)#258 (5) { ["uid":"User":private]=> string(5) "10516" ["firstName":"User":private]=> string(7) "Russell" ["lastName":"User":private]=> string(8) "Demedina" ["dateTotalTable":"User":private]=> NULL ["dateTable"]=> array(0) { } } object(User)#2269 (5) { ["uid":"User":private]=> string(5) "13201" ["firstName":"User":private]=> string(7) "Orlando" ["lastName":"User":private]=> string(14) "Lewis-Maryland" ["dateTotalTable":"User":private]=> NULL ["dateTable"]=> array(0) { } } object(User)#2270 (5) { ["uid":"User":private]=> string(5) "13203" ["firstName":"User":private]=> string(17) "Latrinda S" ["lastName":"User":private]=> string(5) "Clark" ["dateTotalTable":"User":private]=> NULL ["dateTable"]=> array(0) { } } NULL 

【问题讨论】:

  • $user 不是对象......或者这就是你的错误试图告诉你的...... var_Dump($user)
  • @Dieter 说了什么。另外,请提供负责创建$user的代码。
  • PHPExcel 是用于读取/写入 Excel 文件的特定库;但我从这段代码中看不到任何证据表明您实际上正在使用 PHPExcel 库....如果是,那么您正在使用某种包装器。
  • 但是 PHPExcel 库中的任何地方都没有 put() 方法;并且您在代码中对 put() 的引用与写入电子表格没有任何关系

标签: php phpexcel


【解决方案1】:

错误很明显 - 你试图将某物用作对象,但它不是对象:

$user = $userTable[$uid];
$user->put($dateProcessed, $amount);

这很可能意味着$uid 中的任何内容都在查找$userTable 中不存在的数组元素,因此$user 将为空。然后,您尝试使用 null 作为对象,然后繁荣。这是你的错误。

【讨论】:

    【解决方案2】:

    好像你那里没有用户对象。您可以使用第二个查询获取数据集,该数据集在第一个查询中不存在,或者您在第一个查询中根本没有获取任何用户。使用var_dump($user) 并在两个while 循环中打印出用户ID。我想你会发现错误。我没有看到任何其他问题。

    除此之外:您应该删除 mysql_query 并使用 mysqli 或 PDO。 mysql_ 已弃用并将被删除。

    对您最新编辑的补充:您已经注意到,不包括一个用户。看来,您在第二个查询中选择了一个用户,而您在第一个查询中没有选择。让我们稍微分析一下您的查询:

    SELECT ... WHERE 
                              sys_userprofiles.acctstatus_id NOT IN(0, 11, 23, 26, 28, 
                              30) AND sys_userprofiles.uid = sys_userlogins.uid AND 
                              sys_userlogins.acct_status = 'active' AND  
                              sys_userlogins.u_level = 2
    

    在此处选择所有用户,不包括 acctstatus_ids 为 0、11、23、26、28 和 30 的用户。

    SELECT ... WHERE uid IN (SELECT uid FROM sys_userlogins WHERE acct_status = 'active' AND u_level = 2)...
    

    在这里(在子查询中)选择所有用户,不包括任何用户 ID。因此,您的第二个查询返回的用户数可能比您的第一个查询多。这可能是你的问题。你填充 您的用户查询基于您的第一个选择,然后您想根据您的第二个选择添加详细信息。但是,如果第二个查询返回的用户数比第一个查询多,您的代码将尝试向不存在的对象添加详细信息。因此,您会收到错误 Call to a member function put() on a non-object the file,因为 $user 不是此特定 id 的对象。

    【讨论】:

    • 感谢您的回复。
    【解决方案3】:

    您的第二个查询包含一个 uid,它不包含在您的第一个查询中。所以看看你的 var_dump():你有 4 个用户对象和 1 个 NULL(最后一个)。并且在最后一条记录上引发错误。 我建议改变:

    $user = $userTable[$uid];
    $user->put($dateProcessed, $amount);
    

    进入这个:

    if ($user = $userTable[$uid]) {
      $user->put($dateProcessed, $amount);
    }
    

    更安全的版本是:

    if (isset($userTable[$uid]) && $user = $userTable[$uid]) {
      $user->put($dateProcessed, $amount);
    }
    

    ...不会收到无效索引警告...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2012-05-30
      • 2016-08-30
      • 2015-02-06
      • 2012-05-14
      • 2013-11-19
      相关资源
      最近更新 更多