PHPExcel致命错误:在非对象上调用成员函数put()


PHPExcel Fatal error: Call to a member function put() on a non-object

我最近把我的网站从一个共享托管帐户转移到了一个VPS,我提到了这个VPS,因为我认为它可能与此有关。无论如何,我正在使用PHPExcelhttps://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 = $userTable[$uid];
$user->put($dateProcessed, $amount);

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

看起来好像没有用户对象。要么用第二个查询获取数据集,而第一个查询中不存在该数据集,要么用第一个查询根本没有获取任何用户。使用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

在这里,您可以选择除帐户状态ID为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的对象。

您的第二个查询包含一个uid,而第一个查询中不包含该uid。因此,查看您的var_dump():您有4个users对象和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);
}

无法获取无效的索引警告。。。