PHP试图获取非对象的属性-不确定原因

PHP试图获取非对象的属性-不确定原因,php,Php,我试图使用PDO和jQueryAjax从数据库中生成应付账款列表的DataTable,但我在PHP文件中不断遇到这个错误。我不确定我的代码有什么问题 错误消息显示: [28-Jun-2016 16:33:12 Asia/Manila] PHP Notice: Trying to get property of non-object in ** on line 121 pay_controller.php中的第121行是: if($allPayList->res == 0) { echo

我试图使用PDO和jQueryAjax从数据库中生成应付账款列表的DataTable,但我在PHP文件中不断遇到这个错误。我不确定我的代码有什么问题

错误消息显示:

[28-Jun-2016 16:33:12 Asia/Manila] PHP Notice:  Trying to get property of non-object in ** on line 121
pay_controller.php中的第121行是:

if($allPayList->res == 0) { echo ""; }
这是pay_controller.php

<?PHP
class PayController {

public function pay() {

    if (empty($_GET['sid']))
    return call('home', 'expire');

    $getSessionData = SessionData::getData($_GET['sid']);

    if($getSessionData->res = 0)
    {
        return call('home', 'expire');
    }
    date_default_timezone_set('Asia/Manila');
    $dtnow = date('Y-m-d H:i:s');
    $sexpire = date('Y-m-d H:i:s', strtotime($getSessionData->ssend));

    if($sexpire < $dtnow)
    {
        return call('home', 'expire');
    }

    $getMenu = MENU::getMenu();
    $menuid = 3;

    require_once('views/pay.php');

}

public function currentpay() {

    $curPayList = Payables::getCurrentPayable();

    echo "
        <div class='col-md-12'>
            <table id='currentpay' class='display' cellspacing='0' width='100%'>
                <thead>
                    <tr>
                        <th>Sequence</th>
                        <th>Date</th>
                        <th>Vendor</th>
                        <th>Reference No.</th>
                        <th class='text-right'>Amount</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody>
        ";

        if($curPayList->res == 0) {
            echo "";
        }
        elseif($curPayList->res == 1) {

            echo "<tr>
                    <td>" . $curPayList->seq . "</td>
                    <td>" . $curPayList->pdate . "</td>
                    <td>" . $curPayList->vendor . "</td>
                    <td>" . $curPayList->refno . "</td>
                    <td class='text-right'>" . number_format($curPayList->amount,2) . "</td>
                    <td>
                        <a OnClick='showCurPayDetails(". $curPayList->seq .")' class='btn btn-sm btn-default'>
                        <span class='fa-stack fa-fw'>
                          <i class='fa fa-square-o fa-stack-2x'></i>
                          <i class='fa fa-eye fa-stack-1x'></i>
                        </span>
                        VIEW DETAILS
                    </a>
                    </td>
                </tr>";
        }
        elseif($curPayList->res > 1) {
            foreach($curPayList as $cPL) {
                echo "<tr>
                        <td>" . $cPL->seq . "</td>
                        <td>" . $cPL->pdate . "</td>
                        <td>" . $cPL->vendor . "</td>
                        <td>" . $cPL->refno . "</td>
                        <td class='text-right'>" . number_format($cPL->amount,2) . "</td>
                        <td>
                            <a OnClick='showCurPayDetails(". $cPL->seq .")' class='btn btn-sm btn-default'>
                            <span class='fa-stack fa-fw'>
                              <i class='fa fa-square-o fa-stack-2x'></i>
                              <i class='fa fa-eye fa-stack-1x'></i>
                            </span>
                            VIEW DETAILS
                        </a>
                        </td>
                    </tr>";
            }
        }

            echo "
                </tbody>
            </table>
        </div>
        ";
}

public function allpay() {

    $allPayListing = Payables::getAllPurchase();

    echo "
        <div class='col-md-12'>
            <table id='allpay' class='display' cellspacing='0' width='100%'>
                <thead>
                    <tr>
                        <th>Sequence</th>
                        <th>Date</th>
                        <th>Vendor</th>
                        <th>Reference No.</th>
                        <th class='text-right'>Amount</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody>
        ";

        if($allPayListing->res == 0) {

            echo "";

        }
        elseif($allPayListing->res == 1) {
            echo "<tr>
                    <td>" . $allPayList->seq . "</td>
                    <td>" . $allPayList->pdate . "</td>
                    <td>" . $allPayList->vendor . "</td>
                    <td>" . $allPayList->refno . "</td>
                    <td class='text-right'>" . number_format($allPayList->amount,2) . "</td>
                    <td>
                        <a OnClick='showCurPayDetails(". $allPayList->seq .")' class='btn btn-sm btn-default'>
                        <span class='fa-stack fa-fw'>
                          <i class='fa fa-square-o fa-stack-2x'></i>
                          <i class='fa fa-eye fa-stack-1x'></i>
                        </span>
                        VIEW DETAILS
                    </a>
                    </td>
                </tr>";
        }
        elseif($allPayListing->res > 1) {
            foreach($allPayListing as $aPL) {
                echo "<tr>
                        <td>" . $aPL->seq . "</td>
                        <td>" . $aPL->pdate . "</td>
                        <td>" . $aPL->vendor . "</td>
                        <td>" . $aPL->refno . "</td>
                        <td class='text-right'>" . number_format($aPL->amount,2) . "</td>
                        <td>
                            <a OnClick='showCurPayDetails(". $aPL->seq .")' class='btn btn-sm btn-default'>
                            <span class='fa-stack fa-fw'>
                              <i class='fa fa-square-o fa-stack-2x'></i>
                              <i class='fa fa-eye fa-stack-1x'></i>
                            </span>
                            VIEW DETAILS
                        </a>
                        </td>
                    </tr>";
            }
        }

    echo "
                </tbody>
            </table>
        </div>
        ";
}

public function error() {

    require_once('404.php');

}

public function expire(){

    require_once('expire.php');
 }
}
?>

您正在获取的数据可能不存在于联接表中。在数据表中应用引用键时,请确保从获取中跳过该数据,或者添加“ON DELETE CASCADE”或“ON UPDATE SET NULL”选项。

正如@arkascha所要求的,我们需要查看函数
getAllPurchase()
,我猜它在某些情况下可能返回
NULL
或其他一些非对象结果。因为它不返回对象,所以不能对从该方法返回的任何内容调用任何属性或方法,这些内容存储在案例中的
$allPayList
中,这就是PHP在错误消息中告诉您的原因

简单的“修复”方法是使用
isset($allPayList->res)
测试
$allPayList->res
!空($allPayList->res)
,如果其中任何一个返回true,那么您才能真正调用
$allPayList->res


更好的解决方法是确保在
getAllPurchase()
中更好地返回有意义的内容,即返回对象的空实例,以便始终存在可用的
res
属性,并且该属性可能是
true
false
或者可能是
null
,对于那些想知道的人来说,这个问题的正确答案和问题的解决方案是,“mod_pay.php”文件中用于初始化所讨论对象的多个条件之一实际上返回了这些对象的数组,因此不能使用
if($allPayList->res==0){echo”“;}
作为对象直接访问


如果不了解系统的意图,我就无法真正提供处理从数据库返回的多条记录的最合适方法。

$allPayList是一个数组,您可以将其用作对象

首先用print\u r()方法检查$allPayList中的所有变量。
然后您将很容易找到数组的层次结构。

尝试使用适当的方法从类getAllPurchase()方法返回值。 在代码中,静态方法getAllPurchase()在某些情况下返回应付款类的对象(实例),在另一种情况下返回应付款类的对象数组

因此,使用一种方法检查$allPayListing变量是对象数组还是类对象中的返回值:

使用以下代码绕过第121行发生的错误:

    if(!is_array($allPayListing))
    {
        if(isset($allPayListing->res) && $allPayListing->res == 0) {
            echo "";    
        }
    }

我终于解决了。谢谢你的帮助

事实证明,由于
getAllPurchase()
函数返回2条记录,因此该条件创建了一个对象数组。因为它是一个数组,所以不能作为对象读取

第一个函数
getCurrentPayment()
函数只返回1条记录,因此条件创建一个对象

这是更新后的工作代码

public function allpay() {

    $allPayListing = Payables::getAllPurchase();

    echo "
        <div class='col-md-12'>
            <table id='allpay' class='display' cellspacing='0' width='100%'>
                <thead>
                    <tr>
                        <th>Sequence</th>
                        <th>Date</th>
                        <th>Vendor</th>
                        <th>Reference No.</th>
                        <th class='text-right'>Amount</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody>
        ";

        if(!is_array($allPayListing)) {
            if(isset($allPayListing->res) && $allPayListing->res == 0) {
                echo "";    
            }
            else {

                echo "<tr>
                        <td>" . $allPayList->seq . "</td>
                        <td>" . $allPayList->pdate . "</td>
                        <td>" . $allPayList->vendor . "</td>
                        <td>" . $allPayList->refno . "</td>
                        <td class='text-right'>" . number_format($allPayList->amount,2) . "</td>
                        <td>
                            <a OnClick='showCurPayDetails(". $allPayList->seq .")' class='btn btn-sm btn-default'>
                            <span class='fa-stack fa-fw'>
                              <i class='fa fa-square-o fa-stack-2x'></i>
                              <i class='fa fa-eye fa-stack-1x'></i>
                            </span>
                            VIEW DETAILS
                        </a>
                        </td>
                    </tr>";
            }
        }
        else {

            foreach($allPayListing as $aPL) {
                echo "<tr>
                        <td>" . $aPL->seq . "</td>
                        <td>" . $aPL->pdate . "</td>
                        <td>" . $aPL->vendor . "</td>
                        <td>" . $aPL->refno . "</td>
                        <td class='text-right'>" . number_format($aPL->amount,2) . "</td>
                        <td>
                            <a OnClick='showCurPayDetails(". $aPL->seq .")' class='btn btn-sm btn-default'>
                            <span class='fa-stack fa-fw'>
                              <i class='fa fa-square-o fa-stack-2x'></i>
                              <i class='fa fa-eye fa-stack-1x'></i>
                            </span>
                            VIEW DETAILS
                        </a>
                        </td>
                    </tr>";
            }

        }

    echo "
                </tbody>
            </table>
        </div>
        ";
}
公共函数allpay(){
$allPayListing=应付账款::getAllPurchase();
回声“
序列
日期
小贩
参考号。
数量
行动
";
如果(!is_数组($allPayListing)){
如果(设置($allPayListing->res)&&$allPayListing->res==0){
回声“;
}
否则{
回声“
“$allPayList->seq。”
“$allPayList->pdate。”
“$allPayList->供应商。”
“$allPayList->refno”
.number\u格式($allPayList->amount,2)
查看详细信息
";
}
}
否则{
foreach($allPayListing作为$aPL){
回声“
“$aPL->seq。”
“$aPL->pdate。”
“$aPL->供应商。”
“$aPL->refno。”
.number\u格式($aPL->amount,2)
查看详细信息
";
}
}
回声“
";
}

我首先计算了
$allPayListing
的内容,然后抛出一个条件,如果它大于0或1,则表示它是一个数组。我必须先遍历数组才能访问对象。

那么:
$allPayList
是什么?但是您的条件之一会导致返回这些对象的数组?
$allPayList[]=新的所有应付款($aPR['seq'],$aPR['pdate'],$aPR['vendor'],$aPR['refno'],$aPR['amount'],$allPayResCount)正在创建数组吗?这是
elseif($allPayResCount>1)
condition@user3643369-是的,但是您将返回该数组并尝试将其用作对象。您可以调试并通知我们使用哪个条件实例化该对象吗?如果返回一个数组,您不能简单地使用
$allPayList->res
访问单个对象,而是必须为数组编制索引
getAllPurchase()
public function allpay() {

    $allPayListing = Payables::getAllPurchase();

    echo "
        <div class='col-md-12'>
            <table id='allpay' class='display' cellspacing='0' width='100%'>
                <thead>
                    <tr>
                        <th>Sequence</th>
                        <th>Date</th>
                        <th>Vendor</th>
                        <th>Reference No.</th>
                        <th class='text-right'>Amount</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody>
        ";

        if(!is_array($allPayListing)) {
            if(isset($allPayListing->res) && $allPayListing->res == 0) {
                echo "";    
            }
            else {

                echo "<tr>
                        <td>" . $allPayList->seq . "</td>
                        <td>" . $allPayList->pdate . "</td>
                        <td>" . $allPayList->vendor . "</td>
                        <td>" . $allPayList->refno . "</td>
                        <td class='text-right'>" . number_format($allPayList->amount,2) . "</td>
                        <td>
                            <a OnClick='showCurPayDetails(". $allPayList->seq .")' class='btn btn-sm btn-default'>
                            <span class='fa-stack fa-fw'>
                              <i class='fa fa-square-o fa-stack-2x'></i>
                              <i class='fa fa-eye fa-stack-1x'></i>
                            </span>
                            VIEW DETAILS
                        </a>
                        </td>
                    </tr>";
            }
        }
        else {

            foreach($allPayListing as $aPL) {
                echo "<tr>
                        <td>" . $aPL->seq . "</td>
                        <td>" . $aPL->pdate . "</td>
                        <td>" . $aPL->vendor . "</td>
                        <td>" . $aPL->refno . "</td>
                        <td class='text-right'>" . number_format($aPL->amount,2) . "</td>
                        <td>
                            <a OnClick='showCurPayDetails(". $aPL->seq .")' class='btn btn-sm btn-default'>
                            <span class='fa-stack fa-fw'>
                              <i class='fa fa-square-o fa-stack-2x'></i>
                              <i class='fa fa-eye fa-stack-1x'></i>
                            </span>
                            VIEW DETAILS
                        </a>
                        </td>
                    </tr>";
            }

        }

    echo "
                </tbody>
            </table>
        </div>
        ";
}