Project

General

Profile

Bug #92493

Updated by Sybille Peters over 3 years ago

 

 Exception: Prepared statement contains too many placeholders - {"exception":"Doctrine\\DBAL\\Driver\\Mysqli\\MysqliException: Prepared statement contains too many placeholders 

 h1. Scheduler task 

 h2. Reproduce (scheduler task) 

 # site with many pages (I have 40000) 
 # create scheduler task with start page and depth "infinite" 

 h2. Error in scheduler task 

 In the scheduler task it happens when the (old) number of broken links is calculated (before link checking is performed). Linkvalidator recursively fetches a list of all pages (depending on depth) and then performs a DB query on that 

 Problem is the way linkvalidator queries. It recursively collects a list of all pages from current page (depending on depth). And then performs a query on it with "WHERE record_pid in (223, 34, etc.). 

 While this may be efficient (in comparison to several queries) for small sites, it creates a problem for large sites. 

 h2. Exception (in scheduler task) 

 <pre><code class="text"> 
 Prepared statement contains too many placeholders - {"exception":"Doctrine\\DBAL\\Driver\\Mysqli\\MysqliException: Prepared statement contains too many placeholders in /var/www/mysite/htdocs/typo3_src-9.5.22/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/Mysqli/MysqliStatement.php:86 
 Stack trace: 
 #0 /var/www/mysite/htdocs/typo3_src-9.5.22/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/Mysqli/MysqliConnection.php(131): Doctrine\\DBAL\\Driver\\Mysqli\\MysqliStatement->__construct(Object(mysqli), 'SELECT `link_ty...') 
 #1 /var/www/mysite/htdocs/typo3_src-9.5.22/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(901): Doctrine\\DBAL\\Driver\\Mysqli\\MysqliConnection->prepare('SELECT `link_ty...') 
 #2 /var/www/mysite/htdocs/typo3_src-9.5.22/vendor/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php(206): Doctrine\\DBAL\\Connection->executeQuery('SELECT `link_ty...', Array, Array) 
 #3 /var/www/mysite/htdocs/typo3_src-9.5.22/typo3/sysext/core/Classes/Database/Query/QueryBuilder.php(191): Doctrine\\DBAL\\Query\\QueryBuilder->execute() 
 #4 /var/www/mysite/htdocs/typo3_src-9.5.22/typo3/sysext/linkvalidator/Classes/LinkAnalyzer.php(466): TYPO3\\CMS\\Core\\Database\\Query\\QueryBuilder->execute() 
 #5 /var/www/mysite/htdocs/typo3_src-9.5.22/typo3/sysext/linkvalidator/Classes/Task/ValidatorTask.php(351): TYPO3\\CMS\\Linkvalidator\\LinkAnalyzer->getLinkCounts(3) 
 #6 /var/www/mysite/htdocs/typo3_src-9.5.22/typo3/sysext/linkvalidator/Classes/Task/ValidatorTask.php(295): TYPO3\\CMS\\Linkvalidator\\Task\\ValidatorTask->checkPageLinks(3) 
 #7 /var/www/mysite/htdocs/typo3_src-9.5.22/typo3/sysext/scheduler/Classes/Scheduler.php(179): TYPO3\\CMS\\Linkvalidator\\Task\\ValidatorTask->execute() 
 #8 /var/www/mysite/htdocs/typo3_src-9.5.22/typo3/sysext/scheduler/Classes/Command/SchedulerCommand.php(145): TYPO3\\CMS\\Scheduler\\Scheduler->executeTask(Object(TYPO3\\CMS\\Linkvalidator\\Task\\ValidatorTask)) 
 #9 /var/www/mysite/htdocs/typo3_src-9.5.22/typo3/sysext/scheduler/Classes/Command/SchedulerCommand.php(99): TYPO3\\CMS\\Scheduler\\Command\\SchedulerCommand->loopTasks() 
 #10 /var/www/mysite/htdocs/typo3_src-9.5.22/vendor/symfony/console/Command/Command.php(255): TYPO3\\CMS\\Scheduler\\Command\\SchedulerCommand->execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) 
 #11 /var/www/mysite/htdocs/typo3_src-9.5.22/vendor/symfony/console/Application.php(1001): Symfony\\Component\\Console\\Command\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) 
 #12 /var/www/mysite/htdocs/typo3_src-9.5.22/vendor/symfony/console/Application.php(271): Symfony\\Component\\Console\\Application->doRunCommand(Object(TYPO3\\CMS\\Scheduler\\Command\\SchedulerCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) 
 #13 /var/www/mysite/htdocs/typo3_src-9.5.22/vendor/symfony/console/Application.php(147): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) 
 #14 /var/www/mysite/htdocs/typo3_src-9.5.22/typo3/sysext/core/Classes/Console/CommandRequestHandler.php(63): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) 
 #15 /var/www/mysite/htdocs4/typo3_src-9.5.22/typo3/sysext/core/Classes/Console/CommandApplication.php(48): TYPO3\\CMS\\Core\\Console\\CommandRequestHandler->handleRequest(Object(Symfony\\Component\\Console\\Input\\ArgvInput)) 
 #16 /var/www/mysite/htdocs/typo3_src-9.5.22/typo3/sysext/core/bin/typo3(23): /var/www/mysite/htdocs/typo3_src-9.5.22+patch+linkvalidator+logging/typo3/sysext/core/bin/typo3(23): TYPO3\\CMS\\Core\\Console\\CommandApplication->run() 
 #17 /var/www/mysite/htdocs/typo3_src-9.5.22/typo3/sysext/core/bin/typo3(24): {closure}() 
 #18 {main} 

 Next Doctrine\\DBAL\\Exception\\DriverException: An exception occurred while executing 'SELECT `link_type`, COUNT(`uid`) AS `nbBrokenLinks` FROM `tx_linkvalidator_link` WHERE ((`record_uid` IN (?, 
 </code></pre> 
 
 h2. Reproduce (linkvalidator report) 

 # Site with many pages 
 # In report choose all link types and depth "infinite" 



 h2. System 

 * TYPO3 Version: 9.5.22 - I added some log messages, so the line numbers may not be correct 
 * 40000 pages (not hidden and not deleted)

Back