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

时间:2014-04-23 14:01:06

标签: php phpexcel

我最近将我的网站从共享主机帐户移动到我提到的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&s;和名称,但我想到的是一行左右 下面是$ 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 

3 个答案:

答案 0 :(得分:1)

错误很明显 - 当你ISN&#39;一个对象时,你正试图将某些东西用作对象:

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

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

答案 1 :(得分:0)

看起来好像你没有用户对象。您可以使用第二个查询获取数据集,该数据集在第一个查询中不存在,或者您没有使用第一个查询获取任何用户。使用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的对象。

答案 2 :(得分:0)

您的第二个查询包含一个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);
}

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