0
votes

I'm trying to get into PDO details. So I coded this:

<?php
namespace news\system\worker;
use news\data\news\NewsEditor;
use wcf\data\object\type\ObjectTypeCache;
use wcf\system\database\util\PreparedStatementConditionBuilder;
use wcf\system\search\SearchIndexManager;
use wcf\system\user\activity\point\UserActivityPointHandler;
use wcf\system\worker\AbstractRebuildDataWorker;
use wcf\system\WCF;

/**
 * Worker actions for news entries.
 * 
 * @author  Pascal Bade
 * @copyright   2013 voolia.de
 * @license Creative Commons CC-BY-ND <http://creativecommons.org/licenses/by-nd/3.0/deed.de>
 * @package de.voolia.news
 */
class NewsDataWorker extends AbstractRebuildDataWorker {
    /**
     * @see \wcf\system\worker\AbstractRebuildDataWorker::$objectListClassName
     */
    protected $objectListClassName = 'news\data\news\NewsList';

    /**
     * @see \wcf\system\worker\AbstractWorker::$limit
     */
    protected $limit = 250;

    /**
     * @see \wcf\system\worker\AbstractRebuildDataWorker::initObjectList
     */
    protected function initObjectList() {
        parent::initObjectList();

        $this->objectList->sqlOrderBy = 'news.newsID';
    }

    /**
     * @see \wcf\system\worker\IWorker::execute()
     */
    public function execute() {
        parent::execute();

        if (!count($this->objectList)) {
            return;
        }

        if (!$this->loopCount) {
            // remove the activity points
            UserActivityPointHandler::getInstance()->reset('de.voolia.news.activityPointEvent.news');

            // remove the entry from search index
            SearchIndexManager::getInstance()->reset('de.voolia.news.entry');
        }

        // get news attachments
        $attachmentObjectType = ObjectTypeCache::getInstance()->getObjectTypeByName('com.woltlab.wcf.attachment.objectType', 'de.voolia.news.entry');
        $sql = "SELECT      COUNT(*) AS attachments
            FROM        wcf".WCF_N."_attachment
            WHERE       objectTypeID = ?
            AND     objectID = ?";
        $attachments = WCF::getDB()->prepareStatement($sql);

        // calculate the cumulative likes
        $conditions = new PreparedStatementConditionBuilder();
        $conditions->add("objectID IN (?)", array($this->objectList->getObjectIDs()));
        $conditions->add("objectTypeID = ?", array(ObjectTypeCache::getInstance()->getObjectTypeIDByName('com.woltlab.wcf.like.likeableObject', 'de.voolia.news.likeableNews')));

        $sql = "SELECT  objectID,
                cumulativeLikes
            FROM    wcf".WCF_N."_like_object
            ".$conditions;
        $statement = WCF::getDB()->prepareStatement($sql);
        $statement->execute($conditions->getParameters());
        $likes = array();
        while ($row = $statement->fetchArray()) {
            $likes[$row['objectID']] = $row['cumulativeLikes'];
        }

        // update the news entries
        $userItems = array();
        foreach ($this->objectList as $news) {
            // new EntryEditor
            $editor = new NewsEditor($news);

            // update search index
            SearchIndexManager::getInstance()->add('de.voolia.news.entry', $news->newsID, $news->message, $news->subject, $news->time, $news->userID, $news->username, $news->languageID);

            // news data
            $newsData = array();

            // likes
            $newsData['cumulativeLikes'] = (isset($likes[$news->newsID])) ? $likes[$news->newsID] : 0;

            // attachments
            $attachments->execute(array($attachmentObjectType->objectTypeID, $news->newsID));
            $row = $attachments->fetchArray();
            $newsData['attachments'] = $row['attachments'];

            if ($news->userID) {
                if (!isset($userItems[$news->userID])) {
                    $userItems[$news->userID] = 0;
                }
                $userItems[$news->userID]++;
            }

            $editor->update($newsData);
        }

        // update activity points
        UserActivityPointHandler::getInstance()->fireEvents('de.voolia.news.activityPointEvent.news', $userItems, false);
    }
}

But i receive this

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

Somebody who can shed a light for this?

1
I am afraid you have to take out 9 of 10 parts of this code, isolating the only problem spot. Your code is modern and fancy, but do you really expect someone would read it and evaluate it in their mind to find an error for you? - Your Common Sense
Yeah, you do not even mark the line of code where you get this error. This way it is hopeless to find the cause. - Shadow

1 Answers

-1
votes

I receive this error:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

Stacktrace:

0 /var/www/clients/client1/web5/web/wcf/lib/data/DatabaseObjectEditor.class.php(68): wcf\system\database\Database->prepareStatement('UPDATE\tnews1_ne...')

1 /var/www/clients/client1/web5/web/news/lib/system/worker/NewsDataWorker.class.php(108): wcf\data\DatabaseObjectEditor->update(Array)

2 /var/www/clients/client1/web5/web/wcf/lib/acp/action/WorkerProxyAction.class.php(93): news\system\worker\NewsDataWorker->execute()

3 /var/www/clients/client1/web5/web/wcf/lib/action/AbstractAction.class.php(49): wcf\acp\action\WorkerProxyAction->execute()

4 /var/www/clients/client1/web5/web/wcf/lib/action/AJAXInvokeAction.class.php(63): wcf\action\AbstractAction->__run()

5 /var/www/clients/client1/web5/web/wcf/lib/system/request/Request.class.php(58): wcf\action\AJAXInvokeAction->__run()

6 /var/www/clients/client1/web5/web/wcf/lib/system/request/RequestHandler.class.php(139): wcf\system\request\Request->execute()

7 /var/www/clients/client1/web5/web/acp/index.php(10): wcf\system\request\RequestHandler->handle('wbb', true)

8 {main}