[TYPO3-core] RFC #12512: Cannot move multiple records with clipboard
Rupert Germann
rupi at gmx.li
Fri Nov 20 17:09:21 CET 2009
Hi Xavier,
many thanks for your detailed bug description.
The patch looks quite obvious. I'll try to reproduce it on a Postgres
installation when I'm back home tomorrow.
greets
rupert
Xavier Perseguers schrieb:
> Hi,
>
> This is an SVN patch request.
>
> Type: Bugfix, nobrainer
>
> Bugtracker reference:
> http://bugs.typo3.org/view.php?id=12512
>
> Branch: Trunk (at least) but I guess this bug is present in all branches
>
> Problem:
> When trying to move multiple records (e.g. news categories, but NOT
> pages) for a sysfolder/page to another one using clipboard #1-#3, the
> paste operation dies with a parsing error in the where clause.
>
> Only first record is actually moved, the others stay in the original
> sysfolder.
>
> When moving a single record with clipboard #1-#3, the error occurs but
> record is moved anyway.
>
>
> Analyze of the bug:
> Error occurs in t3lib_BEfunc::getRecordsByField() as second argument
> $theField is *empty*, this variable is used to create a query:
>
> $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
> '*',
> $theTable,
> $theField.'='.$GLOBALS['TYPO3_DB']->fullQuoteStr($theValue, $theTable).
> ($useDeleteClause ? t3lib_BEfunc::deleteClause($theTable).' ' :
> '').
> t3lib_BEfunc::versioningPlaceholderClause($theTable).' '.
> $whereClause, // whereClauseMightContainGroupOrderBy
> $groupBy,
> $orderBy,
> $limit
> );
>
> It's obvious that if $theField is empty, condition will start with a
> comparison operator (=) but without left hand member and won't ever be
> valid.
>
> How is it possible that $theField is (sometimes) empty might you ask?
> Well, when moving records with the clipboard, method
> t3lib_tcemain::moveRecord_raw() is called for each record to be moved.
> At line 3695, after having moved the record, it calls method
> moveL10nOverlayRecords() to move related translations. This is where the
> problem relies as seen in the enclosed patch as this latest method calls
> t3lib_BEfunc::getRecordsByField() with a possible empty value for
> $theField. Bing!!!
>
> Why was it never detected?
> As said, the query won't ever be valid if $theField is empty. But nobody
> ever saw the problem because the error is silently forgotten by a HTTP
> redirect or something of that kind when using MySQL. However, when using
> DBAL (and *not* using 'native' driver!), each and every query is
> properly parsed before being sent to the corresponding DBMS. And... yes!
> you read it right! DBAL showed me that Core had a problem :-)
>
> Solution:
> It's obvious: make sure $theField won't be empty before calling
> t3lib_BEfunc::getRecordsByField().
>
> I don't know how this patch will be reviewed as it is a bit tricky to
> reproduce without a DBAL environment that does not run on MySQL.
> However, even with MySQL, you may add debugging code into
> t3lib_BEfunc::getRecordsByField, filtering by $theTable and showing
> that, e.g., when moving tt_news categories (that is, records from table
> 'tt_news_cat'), the generated query is invalid when you try to move one
> or more records using clipboard #1-#3. I least, it seems easy for
> anybody to give a +1 by reading and "thinking" :-) Hopefully, this will
> be sufficient...
>
> Cheers.
>
More information about the TYPO3-team-core
mailing list