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

Posted

技术标签:

【中文标题】致命错误:在非对象上调用成员函数 fetch()?【英文标题】:Fatal error: Call to a member function fetch() on a non-object? 【发布时间】:2012-05-14 09:34:45 【问题描述】:

我收到以下消息返回给我

致命错误:运行以下命令时调用非对象上的成员函数 fetch()。不过,这似乎是零星的,有什么想法吗?

    $cc_transaction_conn = new PDO('mysql:host='.$server.';dbname='.$db2use, $dbuser, $dbpass);
    $cc_transaction_query = $cc_transaction_conn->query("CALLgenInsCCTransactionLog('".$vmcnum."',
                                                                                     ".$_SESSION[val].",
                                                                                    'Enrollment',
                                                                                    'Processor',
                                                                                    'Merchant',
                                                                                    'Auth',
                                                                                    '".$card_expiration_month."',
                                                                                    '".$card_expiration_year."',
                                                                                    ".$_SESSION[enrollment_fee].",
                                                                                    '".strtoupper($_SESSION[forename])."',
                                                                                    '".strtoupper($_SESSION[surname])."',
                                                                                    '".strtoupper($_SESSION[house_number])."',
                                                                                    '".strtoupper($_SESSION[street])."',
                                                                                    '".strtoupper($_SESSION[flat_number])."',
                                                                                    '".strtoupper($_SESSION[town])."',
                                                                                    '".strtoupper($billing_post_code)."',
                                                                                    '".$ip_address."',
                                                                                    @cc_insert_id)");
        $cc_transaction_result = $cc_transaction_query->fetch();
        $cc_insert_id = $cc_transaction_result['cc_insert_id'];
        $_SESSION[cc_insert_id] = $cc_insert_id;
        $cc_transaction_conn = NULL;

这是存储过程:

    CREATE DEFINER=`reliantuksite`@`%` PROCEDURE `genInsCCTransactionLog`(
                        vmc VARCHAR(16),
                        application_id INT UNSIGNED,
                        reas_description VARCHAR(50),
                        in_processor_name VARCHAR(50),
                        merc_name VARCHAR(50),
                        trans_type_description VARCHAR(50),
                        card_expiration_month VARCHAR(2),
                        card_expiration_year VARCHAR(4),
                        amount DECIMAL(6,2),
                        forename VARCHAR(50),
                        surname VARCHAR(50),
                        house_number VARCHAR(255),
                        street VARCHAR(255),
                        flat_number VARCHAR(75),
                        town VARCHAR(50),
                        postal_code VARCHAR(10),
                        ip_address VARCHAR(32),
                        OUT cc_insert_id INT)
    BEGIN

    DECLARE proc_id TINYINT;
    DECLARE pay_reason_id TINYINT;
    DECLARE merc_account_id INT;
    DECLARE trans_type_id TINYINT;
    SELECT processor_id INTO proc_id FROM cc_processor WHERE processor_name = in_processor_name;
    SELECT payment_reason_id INTO pay_reason_id FROM payment_reason WHERE reason_description = reas_description;
    SELECT merchant_account_id INTO merc_account_id FROM cc_merchant_account WHERE merchant_name = merc_name;
    SELECT transaction_type_id INTO trans_type_id FROM transaction_type WHERE transaction_type_description = trans_type_description;
    INSERT INTO
        cc_transaction_log 
            (transaction_sent_date,
            vmc_number,
            application_id,
            processor_id,
            payment_reason_id,
            merchant_account_id,
            transaction_type_id,
            card_expiration_month,
            card_expiration_year,
            amount,
            billing_forename,
            billing_surname,
            billing_house_number,
            billing_street,
            billing_flat_number,
            billing_town,
            billing_postal_code,
            host_ip)
    VALUES
        (NOW(),
        vmc,
        application_id,
        proc_id,
        pay_reason_id,
        merc_account_id,
        trans_type_id,
        card_expiration_month,
        card_expiration_year,
        amount,
        forename,
        surname,
        house_number,
        street,
        flat_number,
        town,
        postal_code,
        ip_address);
    SELECT LAST_INSERT_ID() INTO cc_insert_id;
    SELECT cc_insert_id;
END;;

【问题讨论】:

错误信息有什么不明白的地方? 做一些错误检查。 var_dump($cc_transaction_conn->errorInfo) ...和 ​​RTFM(阅读 FINE 手册)- PDO::query() 返回一个 PDOStatement 对象,或 FALSE 失败 【参考方案1】:

PDO::query(),如手册中所述,如果查询失败,可以返回PDOStatment 对象或FALSE。如果您尝试在非对象上调用方法 - FALSE,当然它将无法生成您收到的错误消息。

所以,检查query() 结果是否为假,然后调用fetch()

【讨论】:

对不起,我不是故意要成为一个(n?)#@!$,我只是有点生气,因为像你这样不阅读手册和/或谷歌的懒人错误消息。 懒惰当然不是我自称的,但是,你有权发表你自己的意见。仅供参考,我两者都做了,但由于某种原因,我只是没有得到它。就像我说的感谢您的帮助,我很感激。

以上是关于致命错误:在非对象上调用成员函数 fetch()?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

Zend_Mail generateMessage() 导致致命错误:在非对象上调用成员函数 getContent()

致命错误:在非对象上调用成员函数 fetchALL() - 在 Microsoft Access 数据库上使用 PDO

sql注入登录表单错误