【问题标题】:Two prepared statements on one page - first works, second fails一页上有两个准备好的语句 - 第一个有效,第二个失败
【发布时间】:2013-01-08 08:44:17
【问题描述】:

我将 MDB2 用于准备好的语句。我使用 PEAR MDB2 站点中基于名称的示例作为指南,这就是我目前所拥有的:

        $q = '
            UPDATE 
                abc_news 
            SET 
                newstitle       = :newstitle,  
                categoryid      = :categoryid,  
                facilityid      = :facilityid,  
                user_id_mod     = :user_id_mod,  
                user_id_add     = :user_id_add,  
                display         = :display,  
                locked          = :locked,  
                datemodified    = NOW()
            WHERE 
                newsid          = :newsid
        ';

        $types = array(
            'text', 
            'integer',
            'integer',
            'integer',
            'integer',
            'integer',
            'integer',
            'integer',
        );

        $res = $mdb2_dbx->prepare($q, $types,MDB2_PREPARE_MANIP);

        $data = array(
            'newstitle'     => $n_newstitle, 
            'categoryid'    => $n_categoryid, 
            'facilityid'    => $n_facilityid, 
            'display'       => 1, 
            'locked'        => 1, 
            'user_id_add'   => $n_user_id_add, 
            'user_id_mod'   => $n_user_id_mod, 
            'newsid'        => $newsid, 
        );
        $affected_rows = $statment->execute($data);
        if (PEAR::isError($res))
            die('error');
        $statement->free();


        $q = '
            UPDATE 
                abc_news_text 
            SET 
                newstext        = :newstext  
            WHERE 
                newsid          = :newsid
        ';

        $types = array(
            'text', 
            'integer',
        );

        $statment = $mdb2_dbx->prepare($q, $types,MDB2_PREPARE_MANIP);

        $data = array(
            'newstext'      => $n_newstext, 
            'newsid'        => $newsid, 
        );
        $affected_rows = $statment->execute($data);
        if (PEAR::isError($res))
            die('error');                   

        $statement->free();

第一个查询有效 - 一个自动递增的 $newsid 打印到屏幕上(它随着每次新提交而增加)。

直接在下面,我得到这个错误:

Fatal error: Call to undefined method MDB2_Error::execute() in news.php on line 160

第 160 行是第二个 $affected_rows = $statment->execute($data); 行。

我正在释放语句,两个预准备语句的语法似乎相同。

我在这里做错了什么?

【问题讨论】:

    标签: mysql prepared-statement mdb2


    【解决方案1】:

    那是因为您得到的是 MDB2_ERROR 对象而不是语句对象。您的 prepare() 显然没有用,而且您根本没有检查 prepare() 的成功以了解这一点。

    另外,我不确定您的第一个是如何工作的,因为您将prepare 结果设置为$res 变量而不是$statment。我还注意到您的变量名称 $statment 没有 e(不确定这是不是拼写错误)。

    【讨论】:

    • Type-o 在我的帖子中,代码在两个地方都有 $statement。我添加了错误检查并得到了这个:Catchable fatal error: Object of class MDB2_BufferedResult_mysqli could not be converted to string
    • 您能否更新问题中的代码以反映更改。从原始代码示例来看,您似乎错误地混合了$res$statement,并在execute() 之后检查prepare() 上的错误,这显然是一个无序操作。
    • 不需要 - 我在发布之前更改了一堆变量等,因为我不喜欢在公共网站上列出我的确切代码。问题出在我的查询中——我在 ...WHERE blah=:blah 位之前有一个尾随逗号。删除了逗号,一切都很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多