Project

General

Profile

Bug #92493

Updated by Sybille Peters over 2 years ago

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


 *Note for reproducing* : You can also reproduce this in the backend in an installation with many pages. You don't have to check broken links at all. Just load the list on a page with many subpages (and "Show this level" "infinite") (to get the "Prepared statement contains too many placeholders" exception).  

 However, you will not see this exception message. This broken link list will just not be displayed. 

 To see the message, use debugger and then load the list. You can set a breakpoint in LinkvalidatorReport::renderContent(). 

 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/htdocs/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): 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