View Issue Details

This bug affects 1 person(s).
 16
IDProjectCategoryView StatusLast Update
19111Bug reportsStatisticspublic2024-02-22 11:32
Reporterbabiel Assigned Tomfavetti  
PrioritynoneSeveritypartial_block 
Status closedResolutionno change required 
Product Version6.2.x 
Summary19111: Statistics export partially bricked
Description

Hello there,

we're experiencing some issues during statistics export after several updates that were performed using comfort updater. Precisely PDF export including statistics graphics doesn't work for us and export to excel at all. Export to HTML and to PDF, when statistics graphics are not included, seem to be working.

We patched from 5.4.8 to 6.2.6 and then to 6.2.7. On 6.2.7 the issues have been reported by out customer. I patched to 6.2.9, but the issues still persist. The major update was performed manually, for the updates to 6.2.7 and 6.2.9 the comfort updates was used.

During the major upgrade https://manual.limesurvey.org/Installation_security_hints/de#Setzen_von_Berechtigungen_auf_einem_selbstverwalteten_Linux-System has been considered. But this had blocked the comfort updates as it issued, that several files were not writeable. So I had to set the following file permissions additionally:

find application -type d -exec chmod 0750 {} \;
find application -type f -exec chmod 0640 {} \;
find tmp -type d -exec chmod 0750 {} \;
find tmp -type f -exec chmod 0640 {} \;
find upload -type d -exec chmod 0750 {} \;
find upload -type f -exec chmod 0640 {} \;
find assets -type d -exec chmod 0750 {} \;
find assets -type f -exec chmod 0640 {} \;
find docs -type d -exec chmod 0750 {} \;
find docs -type f -exec chmod 0640 {} \;
find locale -type d -exec chmod 0750 {} \;
find locale -type f -exec chmod 0640 {} \;
find tests/unit -type d -exec chmod 0750 {} \;
find tests/unit -type f -exec chmod 0640 {} \;
find themes/survey/fruity_twentythree -type d -exec chmod 0750 {} \;
find themes/survey/fruity_twentythree -type f -exec chmod 0640 {} \;

This way the comfort updater is happy, but I don't know if this bricked the statistics export utility.

Unfortunately no error is logged in vhost error or PHP logfile.

Steps To Reproduce

Steps to reproduce

Go to https://umfrage.bmz.de/index.php/admin/statistics/sa/index/surveyid/171834 ( just pick a survey ) and export to pdf, including statistics graphics, and to excel.

Expected result

export works

Actual result

both times popup
"java Script error
An error occured! Please reload the page!"

developer console show http 500 error on /index.php/admin/statistics/sa/index/surveyid/171834

TagsNo tags attached.
Bug heat16
Complete LimeSurvey version number (& build)LimeSurvey Community Edition Version 6.2.9+230925
I will donate to the project if issue is resolvedYes
BrowserVivaldi, Chrome, Firefox
Database type & versionMySQL 8.0.34
Server OS (if known)Debian 11
Webserver software & version (if known)Apache 2.4.56
PHP Version7.4.33

Relationships

has duplicate 19137 closedDenisChenu Statistics export partially bricked 

Users monitoring this issue

mfavetti

Activities

babiel

babiel

2023-09-29 09:18

reporter   ~77434

Please Close this as I reopened this Issue public https://bugs.limesurvey.org/view.php?id=19137

I coudn't find an edit button or something like that.

gabrieljenik

gabrieljenik

2023-10-09 18:53

manager   ~77589

Should 19137 be closed? or 19111?

babiel

babiel

2023-10-16 10:55

reporter   ~77729

Does nobody have a clue?

mfavetti

mfavetti

2023-10-26 11:08

developer   ~78034

i made this one public, your public duplicate was closed by mistake I think

mfavetti

mfavetti

2023-10-27 09:53

developer   ~78074

Last edited: 2023-10-27 09:58

ok from my testing

8.2
pdf - debug 0 - YES
pdf - debug 1 - NO
pdf - debug 2 - NO
html - debug 0 - YES
html - debug 1 - YES
html - debug 2 - YES
excel - debug 0 - YES
excel - debug 1 - YES
excel - debug 2 - NO

php 8.1
pdf - debug 0 - YES
pdf - debug 1 - NO
pdf - debug 2 - NO
html - debug 0 - YES
html - debug 1 - YES
html - debug 2 - YES
excel - debug 0 - YES
excel - debug 1 - YES
excel - debug 2 - YES

php 8.0 AND 7.4
pdf - debug 0 - YES
pdf - debug 1 - YES
pdf - debug 2 - YES
html - debug 0 - YES
html - debug 1 - YES
html - debug 2 - YES
excel - debug 0 - YES
excel - debug 1 - YES
excel - debug 2 - YES

YES = works as expected
NO = saw the js alert you described in report

mfavetti

mfavetti

2023-10-27 09:54

developer   ~78075

Last edited: 2023-10-27 09:59

testing on latest master branch 590c1ac76e2da298d01c34ac4e9fe7f9138e343d

I can see 4 different exports here

first three from selector near the top
1: HTML
2: PDF
3: Excel

and the last is a button on each html chart
4: HTML to PDF

1/2/3 see above
4 I cannot get to work at all (i suspect it is not compatible with the new charts)

@babiel
you say you're on php 7.4, can you double check that?
can you check on most recent release with debug 0?

babiel

babiel

2023-10-27 12:13

reporter   ~78086

@mfavetti
Thank you very much for your reply. I patched to 6.3.1 but the issue persists. Since we're only having this production system, I cannot patch to a commit of the master branch... I have to add, that around 2 weeks ago, the PDF export including images started to work again, after an update. Export to Excel still doesn't work though.

We're running on PHP7.4:
dpkg -l | grep php
ii libapache2-mod-php7.4 7.4.33-1+deb11u4 amd64 server-side, HTML-embedded scripting language (Apache 2 module)
ii php 2:7.4+76 all server-side, HTML-embedded scripting language (default)
ii php-common 2:76 all Common files for PHP packages
ii php-pear 1:1.10.12+submodules+notgz+20210212-1 all PEAR Base System
ii php-zip 2:7.4+76 all Zip module for PHP [default]
ii php7.4 7.4.33-1+deb11u4 all server-side, HTML-embedded scripting language (metapackage)
ii php7.4-cli 7.4.33-1+deb11u4 amd64 command-line interpreter for the PHP scripting language
ii php7.4-common 7.4.33-1+deb11u4 amd64 documentation, examples and common module for PHP
ii php7.4-curl 7.4.33-1+deb11u4 amd64 CURL module for PHP
ii php7.4-dev 7.4.33-1+deb11u4 amd64 Files for PHP7.4 module development
ii php7.4-fpm 7.4.33-1+deb11u4 amd64 server-side, HTML-embedded scripting language (FPM-CGI binary)
ii php7.4-gd 7.4.33-1+deb11u4 amd64 GD module for PHP
ii php7.4-json 7.4.33-1+deb11u4 amd64 JSON module for PHP
ii php7.4-mbstring 7.4.33-1+deb11u4 amd64 MBSTRING module for PHP
ii php7.4-mysql 7.4.33-1+deb11u4 amd64 MySQL module for PHP
ii php7.4-opcache 7.4.33-1+deb11u4 amd64 Zend OpCache module for PHP
ii php7.4-readline 7.4.33-1+deb11u4 amd64 readline module for PHP
ii php7.4-xml 7.4.33-1+deb11u4 amd64 DOM, SimpleXML, XML, and XSL module for PHP
ii php7.4-zip 7.4.33-1+deb11u4 amd64 Zip module for PHP

Is there anything else I can provide?

DenisChenu

DenisChenu

2023-10-30 08:43

developer   ~78115

i made this one public, your public duplicate was closed by mistake I think

I take by age , didn't ee public VS private ;)

But more clean to update status like you do.

It work always with debuig=0 according to @mfavetti

It's not the case for you @babiel ?

DenisChenu

DenisChenu

2023-10-30 08:45

developer   ~78116

Unfortunately no error is logged in vhost error or PHP logfile.

You can add more error log via LimeSurvey : https://manual.limesurvey.org/Optional_settings/en#Logging_settings

(maybe)

gabrieljenik

gabrieljenik

2023-10-30 19:39

manager   ~78155

So PDF didn't work on 6.2.9 but it worked on 6.3.1 ?

pdf - debug 1 - NO
pdf - debug 2 - NO
excel - debug 2 - NO
@mfavetti, with debug, which was the stack of the failure (I guess oicked up from the dev console as it was probably an ajax call)?

mfavetti

mfavetti

2023-11-03 09:43

developer   ~78232

debug 1/2 on 8.1/8.2, pdf warning/error is:

PHP error
html_entity_decode(): Passing null to parameter #2 ($flags) of type int is deprecated

/usr/share/nginx/html/master/application/libraries/admin/pdf.php(607)

595 return ($width / $count);
596 } else {
597 return false;
598 }
599 }
600 public function write_out($name)
601 {
602 $this->Output($name, "D");
603 }
604
605 public function delete_html($text)
606 {
607 $text = html_entity_decode((string) $text, null, 'UTF-8');
608 $text = str_replace("\t", ' ', $text);
609 return strip_tags($text);
610 }
611 /*
612

613 Create Answer PDF document, set metadata and set title
614
@param array $aSurveyInfo - Survey Information (preventing from passing to methods every time)
615 @param array $aPdfLanguageSettings - Pdf language settings
616
@param string $sSiteName - LimeSurvey site name (header and metadata)
617 @param string $sSurveyName - Survey name (header, metadata and title),
618
@param string $sDefaultHeaderString - TCPDF header string
619 * @return void

debug 2 on 8.2, excel warning/error is:
PHP error
Creation of dynamic property Spreadsheet_Excel_Writer_Parser::$ptg is deprecated

/usr/share/nginx/html/master/vendor/pear/spreadsheet_excel_writer/Spreadsheet/Excel/Writer/Parser.php(196)

184 $this->_ext_sheets = array();
185 $this->_references = array();
186 }
187
188 /*
189
Initialize the ptg and public function hashes.
190
191
@access private
192 */
193 protected function _initializeHashes()
194 {
195 // The Excel ptg indices
196 $this->ptg = array(
197 'ptgExp' => 0x01,
198 'ptgTbl' => 0x02,
199 'ptgAdd' => 0x03,
200 'ptgSub' => 0x04,
201 'ptgMul' => 0x05,
202 'ptgDiv' => 0x06,
203 'ptgPower' => 0x07,
204 'ptgConcat' => 0x08,
205 'ptgLT' => 0x09,
206 'ptgLE' => 0x0A,
207 'ptgEQ' => 0x0B,
208 'ptgGE' => 0x0C,

I cannot reproduce any error on 8.0/7.4 under any debug level

babiel

babiel

2023-11-03 10:51

reporter   ~78239

@mfavetti @DenisChenu

Can you tell me how to generate statistics exports using debug=0, or debug=1 or debug=2 ? Specifically, how to set debug=0 etc.?

Do I do this using https://manual.limesurvey.org/Optional_settings/en#Logging_settings ? I tried this, but no error is logged there.

Thanks for your help!

mfavetti

mfavetti

2023-11-03 10:53

developer   ~78240

same page you linked, search debug

babiel

babiel

2023-11-03 10:54

reporter   ~78241

I tried this, but no error is logged there.

So I edited application/config/config.php , restarted PHP FPM, but nothing is logged to tmp/runtime/application.log . I do think this works, but there is nothing to log...

mfavetti

mfavetti

2023-11-03 10:59

developer   ~78242

if you're still getting the error, go to statistics page, open the browser devtools, then click view statistics, then click ok on js alert then go to network in devtools, find the red one with 500 error and paste here the error under response tab

babiel

babiel

2023-11-03 11:15

reporter   ~78243

@mfavetti

Thank you! Using debug=1 the following error has been logged

2023/11/03 11:09:46 [error] [php] require_once(Console/Getopt.php): failed to open stream: No such file or directory (/opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/System.php:20)
Stack trace:
#0 /opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/System.php(20): require_once()
#1 /opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(582): include()
#2 /opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(433): Composer\Autoload{closure}()
#3 unknown(0): Composer\Autoload\ClassLoader->loadClass()
#4 unknown(0): spl_autoload_call()
#5 /opt/srv/www/htdocs/umfrage/vendor/pear/ole/OLE/PPS/Root.php(26): class_exists()
#6 /opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(582): include()
#7 /opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(433): Composer\Autoload{closure}()
#8 unknown(0): Composer\Autoload\ClassLoader->loadClass()
#9 unknown(0): spl_autoload_call()
#10 /opt/srv/www/htdocs/umfrage/vendor/pear/spreadsheet_excel_writer/Spreadsheet/Excel/Writer/Workbook.php(46): class_exists()
#11 /opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(582): include()
#12 /opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(433): Composer\Autoload{closure}()
#13 unknown(0): Composer\Autoload\ClassLoader->loadClass()
#14 unknown(0): spl_autoload_call()
#15 /opt/srv/www/htdocs/umfrage/vendor/pear/spreadsheet_excel_writer/Spreadsheet/Excel/Writer.php(34): class_exists()
#16 /opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(582): include()
#17 /opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(433): Composer\Autoload{closure}()
#18 unknown(0): Composer\Autoload\ClassLoader->loadClass()
#19 /opt/srv/www/htdocs/umfrage/application/helpers/admin/statistics_helper.php(3835): spl_autoload_call()
#20 /opt/srv/www/htdocs/umfrage/application/controllers/admin/Statistics.php(475): statistics_helper->generate_statistics()
#21 unknown(0): Statistics->run()
#22 /opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/actions/CAction.php(115): ReflectionMethod->invokeArgs()
#23 /opt/srv/www/htdocs/umfrage/application/core/SurveyCommonAction.php(83): Statistics->runWithParamsInternal()
#24 /opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/CController.php(308): Statistics->runWithParams()
#25 /opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/CController.php(286): AdminController->runAction()
#26 /opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/CController.php(265): AdminController->runActionWithFilters()
#27 /opt/srv/www/htdocs/umfrage/application/controllers/AdminController.php(202): AdminController->run()
#28 /opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/CWebApplication.php(282): AdminController->run()
#29 /opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/CWebApplication.php(141): LSYii_Application->runController()
#30 /opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/base/CApplication.php(185): LSYii_Application->processRequest()
#31 /opt/srv/www/htdocs/umfrage/index.php(161): LSYii_Application->run()
REQUEST_URI=/index.php/admin/statistics/sa/index/surveyid/838741

Please find the browser devtools output attached in LimeSurvey_excel_export_error.html

LimeSurvey_excel_export_error.html (36,482 bytes)   
<!DOCTYPE html
	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>PHP warning</title>

	<style type="text/css">
		/*<![CDATA[*/
		html,
		body,
		div,
		span,
		applet,
		object,
		iframe,
		h1,
		h2,
		h3,
		h4,
		h5,
		h6,
		p,
		blockquote,
		pre,
		a,
		abbr,
		acronym,
		address,
		big,
		cite,
		code,
		del,
		dfn,
		em,
		font,
		img,
		ins,
		kbd,
		q,
		s,
		samp,
		small,
		strike,
		strong,
		sub,
		sup,
		tt,
		var,
		b,
		u,
		i,
		center,
		dl,
		dt,
		dd,
		ol,
		ul,
		li,
		fieldset,
		form,
		label,
		legend,
		table,
		caption,
		tbody,
		tfoot,
		thead,
		tr,
		th,
		td {
			border: 0;
			outline: 0;
			font-size: 100%;
			vertical-align: baseline;
			background: transparent;
			margin: 0;
			padding: 0;
		}

		body {
			line-height: 1;
		}

		ol,
		ul {
			list-style: none;
		}

		blockquote,
		q {
			quotes: none;
		}

		blockquote:before,
		blockquote:after,
		q:before,
		q:after {
			content: none;
		}

		:focus {
			outline: 0;
		}

		ins {
			text-decoration: none;
		}

		del {
			text-decoration: line-through;
		}

		table {
			border-collapse: collapse;
			border-spacing: 0;
		}

		body {
			font: normal 9pt "Verdana";
			color: #000;
			background: #fff;
		}

		h1 {
			font: normal 18pt "Verdana";
			color: #f00;
			margin-bottom: .5em;
		}

		h2 {
			font: normal 14pt "Verdana";
			color: #800000;
			margin-bottom: .5em;
		}

		h3 {
			font: bold 11pt "Verdana";
		}

		pre {
			font: normal 11pt Menlo, Consolas, "Lucida Console", Monospace;
		}

		pre span.error {
			display: block;
			background: #fce3e3;
		}

		pre span.ln {
			color: #999;
			padding-right: 0.5em;
			border-right: 1px solid #ccc;
		}

		pre span.error-ln {
			font-weight: bold;
		}

		.container {
			margin: 1em 4em;
		}

		.version {
			color: gray;
			font-size: 8pt;
			border-top: 1px solid #aaa;
			padding-top: 1em;
			margin-bottom: 1em;
		}

		.message {
			color: #000;
			padding: 1em;
			font-size: 11pt;
			background: #f3f3f3;
			-webkit-border-radius: 10px;
			-moz-border-radius: 10px;
			border-radius: 10px;
			margin-bottom: 1em;
			line-height: 160%;
		}

		.source {
			margin-bottom: 1em;
		}

		.code pre {
			background-color: #ffe;
			margin: 0.5em 0;
			padding: 0.5em;
			line-height: 125%;
			border: 1px solid #eee;
		}

		.source .file {
			margin-bottom: 1em;
			font-weight: bold;
		}

		.traces {
			margin: 2em 0;
		}

		.trace {
			margin: 0.5em 0;
			padding: 0.5em;
		}

		.trace.app {
			border: 1px dashed #c00;
		}

		.trace .number {
			text-align: right;
			width: 2em;
			padding: 0.5em;
		}

		.trace .content {
			padding: 0.5em;
		}

		.trace .plus,
		.trace .minus {
			display: inline;
			vertical-align: middle;
			text-align: center;
			border: 1px solid #000;
			color: #000;
			font-size: 10px;
			line-height: 10px;
			margin: 0;
			padding: 0 1px;
			width: 10px;
			height: 10px;
		}

		.trace.collapsed .minus,
		.trace.expanded .plus,
		.trace.collapsed pre {
			display: none;
		}

		.trace-file {
			cursor: pointer;
			padding: 0.2em;
		}

		.trace-file:hover {
			background: #f0ffff;
		}

		/*]]>*/
	</style>
</head>

<body>
	<div class="container">
		<h1>PHP warning</h1>

		<p class="message">
			require_once(Console/Getopt.php): failed to open stream: No such file or directory </p>

		<div class="source">
			<p class="file">/opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/System.php(20)</p>
			<div class="code">
				<pre><span class="ln">08</span>  * @package    System
<span class="ln">09</span>  * @author     Tomas V.V.Cox &lt;cox@idecnet.com&gt;
<span class="ln">10</span>  * @copyright  1997-2009 The Authors
<span class="ln">11</span>  * @license    http://opensource.org/licenses/bsd-license.php New BSD License
<span class="ln">12</span>  * @link       http://pear.php.net/package/PEAR
<span class="ln">13</span>  * @since      File available since Release 0.1
<span class="ln">14</span>  */
<span class="ln">15</span>
<span class="ln">16</span> /**
<span class="ln">17</span>  * base class
<span class="ln">18</span>  */
<span class="ln">19</span> require_once &#039;PEAR.php&#039;;
<span class="error"><span class="ln error-ln">20</span> require_once &#039;Console/Getopt.php&#039;;
</span><span class="ln">21</span>
<span class="ln">22</span> $GLOBALS[&#039;_System_temp_files&#039;] = array();
<span class="ln">23</span>
<span class="ln">24</span> /**
<span class="ln">25</span> * System offers cross platform compatible system functions
<span class="ln">26</span> *
<span class="ln">27</span> * Static functions for different operations. Should work under
<span class="ln">28</span> * Unix and Windows. The names and usage has been taken from its respectively
<span class="ln">29</span> * GNU commands. The functions will return (bool) false on error and will
<span class="ln">30</span> * trigger the error with the PHP trigger_error() function (you can silence
<span class="ln">31</span> * the error by prefixing a &#039;@&#039; sign after the function call, but this
<span class="ln">32</span> * is not recommended practice.  Instead use an error handler with
</pre>
			</div>
		</div>

		<div class="traces">
			<h2>Stack Trace</h2>
			<table style="width:100%;">
				<tr class="trace app expanded">
					<td class="number">
						#0 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/System.php(20):
							<strong>require_once</strong>()
						</div>

						<div class="code">
							<pre><span class="ln">15</span>
<span class="ln">16</span> /**
<span class="ln">17</span>  * base class
<span class="ln">18</span>  */
<span class="ln">19</span> require_once &#039;PEAR.php&#039;;
<span class="error"><span class="ln error-ln">20</span> require_once &#039;Console/Getopt.php&#039;;
</span><span class="ln">21</span>
<span class="ln">22</span> $GLOBALS[&#039;_System_temp_files&#039;] = array();
<span class="ln">23</span>
<span class="ln">24</span> /**
<span class="ln">25</span> * System offers cross platform compatible system functions
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app expanded">
					<td class="number">
						#1 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(582):
							<strong>include</strong>(&quot;/opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/Sy...&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">577</span>          *
<span class="ln">578</span>          * @param  string $file
<span class="ln">579</span>          * @return void
<span class="ln">580</span>          */
<span class="ln">581</span>         self::$includeFile = \Closure::bind(static function($file) {
<span class="error"><span class="ln error-ln">582</span>             include $file;
</span><span class="ln">583</span>         }, null, null);
<span class="ln">584</span>     }
<span class="ln">585</span> }
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app expanded">
					<td class="number">
						#2 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(433):
							<strong>Composer\Autoload\{closure}</strong>(&quot;/opt/srv/www/htdocs/umfrage/vendor/composer/../pear/pear-core-mi...&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">428</span>      */
<span class="ln">429</span>     public function loadClass($class)
<span class="ln">430</span>     {
<span class="ln">431</span>         if ($file = $this-&gt;findFile($class)) {
<span class="ln">432</span>             $includeFile = self::$includeFile;
<span class="error"><span class="ln error-ln">433</span>             $includeFile($file);
</span><span class="ln">434</span>
<span class="ln">435</span>             return true;
<span class="ln">436</span>         }
<span class="ln">437</span>
<span class="ln">438</span>         return null;
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#3 </td>
					<td class="content">
						<div class="trace-file">
							&nbsp;unknown(0):
							<strong>Composer\Autoload\ClassLoader</strong>-><strong>loadClass</strong>(&quot;System&quot;)
						</div>

					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#4 </td>
					<td class="content">
						<div class="trace-file">
							&nbsp;unknown(0):
							<strong>spl_autoload_call</strong>(&quot;System&quot;) </div>

					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#5 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/pear/ole/OLE/PPS/Root.php(26):
							<strong>class_exists</strong>(&quot;System&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">21</span>
<span class="ln">22</span> if (!class_exists(&#039;OLE_PPS&#039;)) {
<span class="ln">23</span>     require_once &#039;OLE/PPS.php&#039;;
<span class="ln">24</span> }
<span class="ln">25</span>
<span class="error"><span class="ln error-ln">26</span> if (!class_exists(&#039;System&#039;)) {
</span><span class="ln">27</span>     require_once &#039;System.php&#039;;
<span class="ln">28</span> }
<span class="ln">29</span>
<span class="ln">30</span> /**
<span class="ln">31</span> * Class for creating Root PPS&#039;s for OLE containers
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#6 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(582):
							<strong>include</strong>(&quot;/opt/srv/www/htdocs/umfrage/vendor/pear/ole/OLE/PPS/Root.php&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">577</span>          *
<span class="ln">578</span>          * @param  string $file
<span class="ln">579</span>          * @return void
<span class="ln">580</span>          */
<span class="ln">581</span>         self::$includeFile = \Closure::bind(static function($file) {
<span class="error"><span class="ln error-ln">582</span>             include $file;
</span><span class="ln">583</span>         }, null, null);
<span class="ln">584</span>     }
<span class="ln">585</span> }
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#7 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(433):
							<strong>Composer\Autoload\{closure}</strong>(&quot;/opt/srv/www/htdocs/umfrage/vendor/composer/../pear/ole/OLE/PPS/...&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">428</span>      */
<span class="ln">429</span>     public function loadClass($class)
<span class="ln">430</span>     {
<span class="ln">431</span>         if ($file = $this-&gt;findFile($class)) {
<span class="ln">432</span>             $includeFile = self::$includeFile;
<span class="error"><span class="ln error-ln">433</span>             $includeFile($file);
</span><span class="ln">434</span>
<span class="ln">435</span>             return true;
<span class="ln">436</span>         }
<span class="ln">437</span>
<span class="ln">438</span>         return null;
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#8 </td>
					<td class="content">
						<div class="trace-file">
							&nbsp;unknown(0):
							<strong>Composer\Autoload\ClassLoader</strong>-><strong>loadClass</strong>(&quot;OLE_PPS_Root&quot;)
						</div>

					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#9 </td>
					<td class="content">
						<div class="trace-file">
							&nbsp;unknown(0):
							<strong>spl_autoload_call</strong>(&quot;OLE_PPS_Root&quot;)
						</div>

					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#10 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/pear/spreadsheet_excel_writer/Spreadsheet/Excel/Writer/Workbook.php(46):
							<strong>class_exists</strong>(&quot;OLE_PPS_Root&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">41</span>
<span class="ln">42</span> if (!class_exists(&#039;OLE&#039;)) {
<span class="ln">43</span>     require_once &#039;OLE.php&#039;;
<span class="ln">44</span> }
<span class="ln">45</span>
<span class="error"><span class="ln error-ln">46</span> if (!class_exists(&#039;OLE_PPS_Root&#039;)) {
</span><span class="ln">47</span>     require_once &#039;OLE/PPS/Root.php&#039;;
<span class="ln">48</span> }
<span class="ln">49</span>
<span class="ln">50</span> if (!class_exists(&#039;OLE_PPS_File&#039;)) {
<span class="ln">51</span>     require_once &#039;OLE/PPS/File.php&#039;;
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#11 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(582):
							<strong>include</strong>(&quot;/opt/srv/www/htdocs/umfrage/vendor/pear/spreadsheet_excel_writer...&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">577</span>          *
<span class="ln">578</span>          * @param  string $file
<span class="ln">579</span>          * @return void
<span class="ln">580</span>          */
<span class="ln">581</span>         self::$includeFile = \Closure::bind(static function($file) {
<span class="error"><span class="ln error-ln">582</span>             include $file;
</span><span class="ln">583</span>         }, null, null);
<span class="ln">584</span>     }
<span class="ln">585</span> }
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#12 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(433):
							<strong>Composer\Autoload\{closure}</strong>(&quot;/opt/srv/www/htdocs/umfrage/vendor/composer/../pear/spreadsheet_...&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">428</span>      */
<span class="ln">429</span>     public function loadClass($class)
<span class="ln">430</span>     {
<span class="ln">431</span>         if ($file = $this-&gt;findFile($class)) {
<span class="ln">432</span>             $includeFile = self::$includeFile;
<span class="error"><span class="ln error-ln">433</span>             $includeFile($file);
</span><span class="ln">434</span>
<span class="ln">435</span>             return true;
<span class="ln">436</span>         }
<span class="ln">437</span>
<span class="ln">438</span>         return null;
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#13 </td>
					<td class="content">
						<div class="trace-file">
							&nbsp;unknown(0):
							<strong>Composer\Autoload\ClassLoader</strong>-><strong>loadClass</strong>(&quot;Spreadsheet_Excel_Writer_Workbook&quot;)
						</div>

					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#14 </td>
					<td class="content">
						<div class="trace-file">
							&nbsp;unknown(0):
							<strong>spl_autoload_call</strong>(&quot;Spreadsheet_Excel_Writer_Workbook&quot;)
						</div>

					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#15 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/pear/spreadsheet_excel_writer/Spreadsheet/Excel/Writer.php(34):
							<strong>class_exists</strong>(&quot;Spreadsheet_Excel_Writer_Workbook&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">29</span> *    You should have received a copy of the GNU Lesser General Public
<span class="ln">30</span> *    License along with this library; if not, write to the Free Software
<span class="ln">31</span> *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
<span class="ln">32</span> */
<span class="ln">33</span>
<span class="error"><span class="ln error-ln">34</span> if (!class_exists(&#039;Spreadsheet_Excel_Writer_Workbook&#039;)) {
</span><span class="ln">35</span>     require_once &#039;Spreadsheet/Excel/Writer/Workbook.php&#039;;
<span class="ln">36</span> }
<span class="ln">37</span>
<span class="ln">38</span> /**
<span class="ln">39</span> * Class for writing Excel Spreadsheets. This class should change COMPLETELY.
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#16 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(582):
							<strong>include</strong>(&quot;/opt/srv/www/htdocs/umfrage/vendor/pear/spreadsheet_excel_writer...&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">577</span>          *
<span class="ln">578</span>          * @param  string $file
<span class="ln">579</span>          * @return void
<span class="ln">580</span>          */
<span class="ln">581</span>         self::$includeFile = \Closure::bind(static function($file) {
<span class="error"><span class="ln error-ln">582</span>             include $file;
</span><span class="ln">583</span>         }, null, null);
<span class="ln">584</span>     }
<span class="ln">585</span> }
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#17 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/composer/ClassLoader.php(433):
							<strong>Composer\Autoload\{closure}</strong>(&quot;/opt/srv/www/htdocs/umfrage/vendor/composer/../pear/spreadsheet_...&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">428</span>      */
<span class="ln">429</span>     public function loadClass($class)
<span class="ln">430</span>     {
<span class="ln">431</span>         if ($file = $this-&gt;findFile($class)) {
<span class="ln">432</span>             $includeFile = self::$includeFile;
<span class="error"><span class="ln error-ln">433</span>             $includeFile($file);
</span><span class="ln">434</span>
<span class="ln">435</span>             return true;
<span class="ln">436</span>         }
<span class="ln">437</span>
<span class="ln">438</span>         return null;
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#18 </td>
					<td class="content">
						<div class="trace-file">
							&nbsp;unknown(0):
							<strong>Composer\Autoload\ClassLoader</strong>-><strong>loadClass</strong>(&quot;Spreadsheet_Excel_Writer&quot;)
						</div>

					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#19 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/application/helpers/admin/statistics_helper.php(3835):
							<strong>spl_autoload_call</strong>(&quot;Spreadsheet_Excel_Writer&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">3830</span>              */
<span class="ln">3831</span>             if ($outputTarget == &#039;F&#039;) {
<span class="ln">3832</span>                 $sFileName = $sTempDir . &#039;/statistic-survey&#039; . $surveyid . &#039;.xls&#039;;
<span class="ln">3833</span>                 $this-&gt;workbook = new Spreadsheet_Excel_Writer($sFileName);
<span class="ln">3834</span>             } else {
<span class="error"><span class="ln error-ln">3835</span>                 $this-&gt;workbook = new Spreadsheet_Excel_Writer();
</span><span class="ln">3836</span>             }
<span class="ln">3837</span>             $this-&gt;workbook-&gt;setVersion(8);
<span class="ln">3838</span>             // Inform the module that our data will arrive as UTF-8.
<span class="ln">3839</span>             // Set the temporary directory to avoid PHP error messages due to open_basedir restrictions and calls to tempnam(&quot;&quot;, ...)
<span class="ln">3840</span>             $this-&gt;workbook-&gt;setTempDir($sTempDir);
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#20 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/application/controllers/admin/Statistics.php(475):
							<strong>statistics_helper</strong>-><strong>generate_statistics</strong>(838741,
							array(&quot;datestampE&quot;, &quot;datestampG&quot;,
							&quot;datestampL&quot;, &quot;idG&quot;, ...),
							array(&quot;datestampE&quot;, &quot;datestampG&quot;,
							&quot;datestampL&quot;, &quot;idG&quot;, ...), 1, ...)
						</div>

						<div class="code">
							<pre><span class="ln">470</span>                 case &#039;pdf&#039;:
<span class="ln">471</span>                     $helper-&gt;generate_statistics($surveyid, $summary, $summary, $usegraph, $outputType, &#039;D&#039;, $statlang);
<span class="ln">472</span>                     exit;
<span class="ln">473</span>                     break;
<span class="ln">474</span>                 case &#039;xls&#039;:
<span class="error"><span class="ln error-ln">475</span>                     $helper-&gt;generate_statistics($surveyid, $summary, $summary, $usegraph, $outputType, &#039;DD&#039;, $statlang);
</span><span class="ln">476</span>                     exit;
<span class="ln">477</span>                     break;
<span class="ln">478</span>                 default:
<span class="ln">479</span>                     break;
<span class="ln">480</span>             }
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#21 </td>
					<td class="content">
						<div class="trace-file">
							&nbsp;unknown(0):
							<strong>Statistics</strong>-><strong>run</strong>(838741, null)
						</div>

					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#22 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/actions/CAction.php(115):
							<strong>ReflectionMethod</strong>-><strong>invokeArgs</strong>(Statistics,
							array(&quot;838741&quot;, null))
						</div>

						<div class="code">
							<pre><span class="ln">110</span>             elseif($param-&gt;isDefaultValueAvailable())
<span class="ln">111</span>                 $ps[]=$param-&gt;getDefaultValue();
<span class="ln">112</span>             else
<span class="ln">113</span>                 return false;
<span class="ln">114</span>         }
<span class="error"><span class="ln error-ln">115</span>         $method-&gt;invokeArgs($object,$ps);
</span><span class="ln">116</span>         return true;
<span class="ln">117</span>     }
<span class="ln">118</span> }
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#23 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/application/core/SurveyCommonAction.php(83):
							<strong>CAction</strong>-><strong>runWithParamsInternal</strong>(Statistics,
							ReflectionMethod, array(&quot;surveyid&quot; =&gt;
							&quot;838741&quot;, &quot;sa&quot; =&gt; &quot;index&quot;,
							&quot;iSurveyId&quot; =&gt; &quot;838741&quot;,
							&quot;iSurveyID&quot; =&gt; &quot;838741&quot;, ...))
						</div>

						<div class="code">
							<pre><span class="ln">78</span>             $oMethod = new ReflectionMethod($this, $sDefault);
<span class="ln">79</span>         }
<span class="ln">80</span>
<span class="ln">81</span>         // We&#039;re all good to go, let&#039;s execute it
<span class="ln">82</span>         // runWithParamsInternal would automatically get the parameters of the method and populate them as required with the params
<span class="error"><span class="ln error-ln">83</span>         return parent::runWithParamsInternal($this, $oMethod, $params);
</span><span class="ln">84</span>     }
<span class="ln">85</span>
<span class="ln">86</span>     /**
<span class="ln">87</span>      * Some functions have different parameters, which are just an alias of the
<span class="ln">88</span>      * usual parameters we&#039;re getting in the url. This function just populates
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#24 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/CController.php(308):
							<strong>SurveyCommonAction</strong>-><strong>runWithParams</strong>(array(&quot;surveyid&quot;
							=&gt; &quot;838741&quot;, &quot;sa&quot; =&gt;
							&quot;index&quot;, &quot;iSurveyId&quot; =&gt;
							&quot;838741&quot;, &quot;iSurveyID&quot; =&gt;
							&quot;838741&quot;, ...))
						</div>

						<div class="code">
							<pre><span class="ln">303</span>     {
<span class="ln">304</span>         $priorAction=$this-&gt;_action;
<span class="ln">305</span>         $this-&gt;_action=$action;
<span class="ln">306</span>         if($this-&gt;beforeAction($action))
<span class="ln">307</span>         {
<span class="error"><span class="ln error-ln">308</span>             if($action-&gt;runWithParams($this-&gt;getActionParams())===false)
</span><span class="ln">309</span>                 $this-&gt;invalidActionParams($action);
<span class="ln">310</span>             else
<span class="ln">311</span>                 $this-&gt;afterAction($action);
<span class="ln">312</span>         }
<span class="ln">313</span>         $this-&gt;_action=$priorAction;
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#25 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/CController.php(286):
							<strong>CController</strong>-><strong>runAction</strong>(Statistics)
						</div>

						<div class="code">
							<pre><span class="ln">281</span>      * @see runAction
<span class="ln">282</span>      */
<span class="ln">283</span>     public function runActionWithFilters($action,$filters)
<span class="ln">284</span>     {
<span class="ln">285</span>         if(empty($filters))
<span class="error"><span class="ln error-ln">286</span>             $this-&gt;runAction($action);
</span><span class="ln">287</span>         else
<span class="ln">288</span>         {
<span class="ln">289</span>             $priorAction=$this-&gt;_action;
<span class="ln">290</span>             $this-&gt;_action=$action;
<span class="ln">291</span>             CFilterChain::create($this,$action,$filters)-&gt;run();
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#26 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/CController.php(265):
							<strong>CController</strong>-><strong>runActionWithFilters</strong>(Statistics,
							array())
						</div>

						<div class="code">
							<pre><span class="ln">260</span>         {
<span class="ln">261</span>             if(($parent=$this-&gt;getModule())===null)
<span class="ln">262</span>                 $parent=Yii::app();
<span class="ln">263</span>             if($parent-&gt;beforeControllerAction($this,$action))
<span class="ln">264</span>             {
<span class="error"><span class="ln error-ln">265</span>                 $this-&gt;runActionWithFilters($action,$this-&gt;filters());
</span><span class="ln">266</span>                 $parent-&gt;afterControllerAction($this,$action);
<span class="ln">267</span>             }
<span class="ln">268</span>         }
<span class="ln">269</span>         else
<span class="ln">270</span>             $this-&gt;missingAction($actionID);
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#27 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/application/controllers/AdminController.php(202):
							<strong>CController</strong>-><strong>run</strong>(&quot;statistics&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">197</span>         }
<span class="ln">198</span>
<span class="ln">199</span>         $this-&gt;runModuleController($action);
<span class="ln">200</span>
<span class="ln">201</span>
<span class="error"><span class="ln error-ln">202</span>         return parent::run($action);
</span><span class="ln">203</span>     }
<span class="ln">204</span>
<span class="ln">205</span>     /**
<span class="ln">206</span>      * Starting with LS4, 3rd party developer can extends any of the LimeSurve controllers.
<span class="ln">207</span>      *
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#28 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/CWebApplication.php(282):
							<strong>AdminController</strong>-><strong>run</strong>(&quot;statistics&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">277</span>         {
<span class="ln">278</span>             list($controller,$actionID)=$ca;
<span class="ln">279</span>             $oldController=$this-&gt;_controller;
<span class="ln">280</span>             $this-&gt;_controller=$controller;
<span class="ln">281</span>             $controller-&gt;init();
<span class="error"><span class="ln error-ln">282</span>             $controller-&gt;run($actionID);
</span><span class="ln">283</span>             $this-&gt;_controller=$oldController;
<span class="ln">284</span>         }
<span class="ln">285</span>         else
<span class="ln">286</span>             throw new CHttpException(404,Yii::t(&#039;yii&#039;,&#039;Unable to resolve the request &quot;{route}&quot;.&#039;,
<span class="ln">287</span>                 array(&#039;{route}&#039;=&gt;$route===&#039;&#039;?$this-&gt;defaultController:$route)));
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#29 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/web/CWebApplication.php(141):
							<strong>CWebApplication</strong>-><strong>runController</strong>(&quot;admin/statistics/sa/index&quot;)
						</div>

						<div class="code">
							<pre><span class="ln">136</span>             foreach(array_splice($this-&gt;catchAllRequest,1) as $name=&gt;$value)
<span class="ln">137</span>                 $_GET[$name]=$value;
<span class="ln">138</span>         }
<span class="ln">139</span>         else
<span class="ln">140</span>             $route=$this-&gt;getUrlManager()-&gt;parseUrl($this-&gt;getRequest());
<span class="error"><span class="ln error-ln">141</span>         $this-&gt;runController($route);
</span><span class="ln">142</span>     }
<span class="ln">143</span>
<span class="ln">144</span>     /**
<span class="ln">145</span>      * Registers the core application components.
<span class="ln">146</span>      * This method overrides the parent implementation by registering additional core components.
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace core collapsed">
					<td class="number">
						#30 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/vendor/yiisoft/yii/framework/base/CApplication.php(185):
							<strong>CWebApplication</strong>-><strong>processRequest</strong>()
						</div>

						<div class="code">
							<pre><span class="ln">180</span>     public function run()
<span class="ln">181</span>     {
<span class="ln">182</span>         if($this-&gt;hasEventHandler(&#039;onBeginRequest&#039;))
<span class="ln">183</span>             $this-&gt;onBeginRequest(new CEvent($this));
<span class="ln">184</span>         register_shutdown_function(array($this,&#039;end&#039;),0,false);
<span class="error"><span class="ln error-ln">185</span>         $this-&gt;processRequest();
</span><span class="ln">186</span>         if($this-&gt;hasEventHandler(&#039;onEndRequest&#039;))
<span class="ln">187</span>             $this-&gt;onEndRequest(new CEvent($this));
<span class="ln">188</span>     }
<span class="ln">189</span>
<span class="ln">190</span>     /**
</pre>
						</div>
					</td>
				</tr>
				<tr class="trace app collapsed">
					<td class="number">
						#31 </td>
					<td class="content">
						<div class="trace-file">
							<div class="plus">+</div>
							<div class="minus">–</div>
							&nbsp;/opt/srv/www/htdocs/umfrage/index.php(161):
							<strong>CApplication</strong>-><strong>run</strong>()
						</div>

						<div class="code">
							<pre><span class="ln">156</span> require_once APPPATH . &#039;core/LSYii_Application&#039; . EXT;
<span class="ln">157</span>
<span class="ln">158</span> $config = require_once(APPPATH . &#039;config/internal&#039; . EXT);
<span class="ln">159</span>
<span class="ln">160</span> Yii::$enableIncludePath = false;
<span class="error"><span class="ln error-ln">161</span> Yii::createApplication(&#039;LSYii_Application&#039;, $config)-&gt;run();
</span><span class="ln">162</span>
<span class="ln">163</span> /* End of file index.php */
<span class="ln">164</span> /* Location: ./index.php */
</pre>
						</div>
					</td>
				</tr>
			</table>
		</div>

		<div class="version">
			2023-11-03 11:12:25 Apache <a href="https://www.yiiframework.com/">Yii Framework</a>/1.1.28
		</div>
	</div>

	<script type="text/javascript">
		/*<![CDATA[*/
		var traceReg = new RegExp("(^|\\s)trace-file(\\s|$)");
		var collapsedReg = new RegExp("(^|\\s)collapsed(\\s|$)");

		var e = document.getElementsByTagName("div");
		for (var j = 0, len = e.length; j < len; j++) {
			if (traceReg.test(e[j].className)) {
				e[j].onclick = function () {
					var trace = this.parentNode.parentNode;
					if (collapsedReg.test(trace.className))
						trace.className = trace.className.replace("collapsed", "expanded");
					else
						trace.className = trace.className.replace("expanded", "collapsed");
				}
			}
		}
		/*]]>*/
	</script>

</body>

</html>
gabrieljenik

gabrieljenik

2023-11-03 12:48

manager   ~78244

@mfavetti Please be aware PHP 8.2 is not officially supported.

@babiel Could it be that the installation is missing files or got corrupted after the upgrade?
Why don't you try to create a new installation with a copy of the DB as to try?

mfavetti

mfavetti

2023-11-03 20:03

developer   ~78264

your installation seems to be missing this file: vendor/pear/console_getopt/Console/Getopt.php

can you try with a clean install?

babiel

babiel

2023-11-06 11:05

reporter   ~78278

@mfavetti
The file vendor/pear/console_getopt/Console/Getopt.php existed, I did a fresh reinstall anyway. I deleted the whole Limesurvey directory, replaced it with a fresh downloaded version and restored config files and uplaods. However, the error persists:

/opt/srv/www/htdocs/umfrage# ls -alh vendor/pear/console_getopt/Console/Getopt.php
-rw-r----- 1 www-data www-data 14K Nov 6 10:37 vendor/pear/console_getopt/Console/Getopt.php

Therefore I attached strace to the fpm pool worker processes and logged what happened, when exporting to excel: strace.log

The FPM pool currently has the following settings in effect:

php_admin_value[allow_url_fopen] = off
php_admin_value[allow_url_include] = off
php_admin_value[default_charset] = UTF-8
php_admin_value[display_errors] = on
php_admin_value[error_log] = /var/log/php/umfrage.bmz.de.log
php_admin_value[expose_php] = off
php_admin_value[file_uploads] = ON
php_admin_value[log_errors] = on
php_admin_value[magic_quotes_gpc] = off
php_admin_value[max_execution_time] = 1200
php_admin_value[memory_limit] = 256M
php_admin_value[open_basedir] = /opt/srv/www/htdocs/umfrage:/var/lib/php/sessions
php_admin_value[post_max_size] = 10M
php_admin_value[register_globals] = off
php_admin_value[save_path] = /var/lib/php/sessions
php_admin_value[upload_max_filesize] = 10M
php_admin_value[upload_tmp_dir] = /var/lib/php/sessions

Several errors are logged because of missing files, but Getopt.php is not a part of it.

strace.log (4,323,863 bytes)
gabrieljenik

gabrieljenik

2023-11-06 15:52

manager   ~78291

That permission doesn't look good...
https://manual.limesurvey.org/Installation_-_LimeSurvey_CE#Set_directory_permissions

DenisChenu

DenisChenu

2023-11-06 16:21

developer   ~78292

Last edited: 2023-11-06 16:25

That permission doesn't look good...

www-data have read permission : not an issue here.

Permission seems OK (except if vendor/pear/console_getopt/Console/ don't have execute permission for www-data)

Esle : i can produce statistics on a simple survey with PHP8.2

babiel

babiel

2023-11-06 16:27

reporter   ~78293

@DenisChenu

Every folder has 0750 permission and is owned by www-data

ls -alh /opt/srv/www/htdocs/umfrage/vendor/pear/console_getopt/
total 32K
drwxr-x--- 3 www-data www-data 4.0K Nov 6 10:27 .
drwxr-x--- 7 www-data www-data 4.0K Nov 6 10:27 ..
drwxr-x--- 2 www-data www-data 4.0K Nov 6 10:27 Console

babiel

babiel

2023-11-06 16:29

reporter   ~78294

I've cut off the ls output by accident

ls -alh /opt/srv/www/htdocs/umfrage/vendor/pear/console_getopt/
total 32K
drwxr-x--- 3 www-data www-data 4.0K Nov 6 10:27 .
drwxr-x--- 7 www-data www-data 4.0K Nov 6 10:27 ..
drwxr-x--- 2 www-data www-data 4.0K Nov 6 10:27 Console
-rw-r----- 1 www-data www-data 1.3K Nov 6 10:27 LICENSE
-rw-r----- 1 www-data www-data 7.4K Nov 6 10:27 package.xml
-rw-r----- 1 www-data www-data 676 Nov 6 10:27 README.rst
-rw-r----- 1 www-data www-data 98 Nov 6 10:27 .travis.yml

DenisChenu

DenisChenu

2023-11-06 17:25

developer   ~78296

Seems OK for me … no idea :(

gabrieljenik

gabrieljenik

2023-11-07 13:40

manager   ~78312

The FPM pool currently has the following settings in effect:

@babiel I am not a keen on FPM, but I believe it just picks the main file, not includes.
Includes and libs are picked by PHP per se. Right?
That's why probably Getopt.php is not on the fpm log.

Are we sure the PHP process has access to the file?

On the other side, can you try if there is any specific excel export which works?

mfavetti

mfavetti

2023-11-07 22:57

developer   ~78329

from my testing, permissions problem give "failed to open stream: Permission denied in", reported error is "failed to open stream: No such file or directory in" I've only been able to reproduce the issue by deleting the file.

@babiel can you put your phpinfo?

please also make test files in your limesurvey root with the following contents, open the location in browser, and report back on the output

first test file:
<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

require_once './vendor/autoload.php';

$test = new Spreadsheet_Excel_Writer();
var_dump(get_class_methods($test));

and second test file:
<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

var_dump(lstat('./vendor/pear/console_getopt/Console/Getopt.php'));

DenisChenu

DenisChenu

2023-11-08 08:04

developer   ~78330

from my testing, permissions problem give "failed to open stream: Permission denied in", reported error is "failed to open stream: No such file or directory in" I've only been able to reproduce the issue by deleting the file.

You're right, my opinion : it's more an issue in autoload, maybe a deactivated function or something like this ?

babiel

babiel

2023-11-20 16:06

reporter   ~78544

Did you guys see my last response? I've created it private, because it might contain some sensible informations.

In the meantime I continued testing. I upgraded to PHP 8.1 but it didn't help. I then tested further and found, that Console/Getopt.php is shipped with PEAR and that my PEAR directory is /ush/share/php

pear config-show | grep "PEAR directory"
PEAR directory php_dir /usr/share/php

Getopt.php is installed in the system

ls -alh /usr/share/php
total 160K
drwxr-xr-x 14 root root 4.0K Nov 20 15:39 .
drwxr-xr-x 159 root root 4.0K Nov 20 15:34 ..
drwxr-xr-x 3 root root 4.0K Nov 20 14:34 8.1
drwxr-xr-x 2 root root 4.0K Nov 20 15:39 Archive
drwxr-xr-x 3 root root 4.0K Nov 20 15:39 .channels
drwxr-xr-x 2 root root 4.0K Nov 20 15:39 Console
[...]

ls -alh /usr/share/php/Console/
total 24K
drwxr-xr-x 2 root root 4.0K Nov 20 15:39 .
drwxr-xr-x 14 root root 4.0K Nov 20 15:39 ..
-rw-r--r-- 1 root root 14K Jun 12 08:24 Getopt.php

But still the Excel export reports, that the file is missing. I then simply copied Getopt.php to /opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/

ls -alh /opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/
total 80K
drwxr-x--- 5 www-data www-data 4.0K Nov 20 15:41 .
drwxr-x--- 3 www-data www-data 4.0K Nov 6 10:37 ..
drwxr-xr-x 2 www-data www-data 4.0K Nov 20 15:39 Console
drwxr-x--- 2 www-data www-data 4.0K Nov 6 10:37 OS
drwxr-x--- 2 www-data www-data 4.0K Nov 6 10:37 PEAR
-rw-r----- 1 www-data www-data 36K Nov 6 10:37 PEAR.php
-rw-r----- 1 www-data www-data 21K Nov 6 10:37 System.php

and now a new error is reported

<h1>PHP warning</h1>
<p class="message">
require_once(PEAR.php): Failed to open stream: No such file or directory </p>
<div class="source">
<p class="file">/opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/Console/Getopt.php(21)</p>

so, now Getopt.php does not find PEAR.php, which exists. I then copied PEAR.php into /opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/Console/ which gives me a new error

<br />
<b>Fatal error</b>
: Cannot redeclare _PEAR_call_destructors() (previously declared in /opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/PEAR.php:795) in <b>/opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/Console/PEAR.php</b>
on line <b>830</b>
<br />

It seems that the "missing" files are only searched locally and the globally available files are not used. Do you have any idea what's causing this?

babiel

babiel

2023-11-27 14:03

reporter   ~78734

I have a new update. Our customer told me, that there is another way for exporting survey data. When I go to index.php/admin/export/sa/exportresults/surveyid/838741 and select "Microsoft Excel" as export type, I first get an error page, because /tmp has to be allowed in open_basedir settings. So I changed php_admin_value[sys_temp_dir] and now this works. Using this way, we can export to excel without issues. Is there a difference how the data is exported? Can the way of the statistics export be changed to the answer export?

gabrieljenik

gabrieljenik

2023-11-27 18:32

manager   ~78749

It seems that the "missing" files are only searched locally and the globally available files are not used. Do you have any idea what's causing this?

This seems to be a DevOps issue.
Something on the OS, PHP include paths or permissions.

Sorry to say, but this doens't seem to be a bug.

babiel

babiel

2024-01-03 12:04

reporter   ~79089

After a lots of try and error I made it work. I don't know why, but I had to specifically set the needed pear directories of LimeSurvey inside the php-fpm pool for https://www.php.net/manual/en/ini.core.php#ini.include-path

php_admin_value[include_path] = ".:/opt/srv/www/htdocs/umfrage/vendor/pear/console_getopt:/opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src" # umfrage is our LimeSurvey Root directory

Maybe it is about how fpm "shields" the pool from global environment variables. However, if it didn't, it still wouldn't work, because when I set the PHP default
".:/usr/share/php"
inside the fpm pool, the excel export failed with the error message from https://bugs.limesurvey.org/view.php?id=19111#c78544

<br />
<b>Fatal error</b>
: Cannot redeclare _PEAR_call_destructors() (previously declared in /opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/PEAR.php:795) in <b>/opt/srv/www/htdocs/umfrage/vendor/pear/pear-core-minimal/src/Console/PEAR.php</b>
on line <b>830</b>
<br />

Maybe you can document this as a possible issue when using php fpm in https://manual.limesurvey.org/Installation_FAQ ?

In addition:
LimeSurvey seems to work fine whith disabled PHP functions "system,exec,passthru,pcntl_exec,eval,popen,proc_open", maybe you can document this too in https://manual.limesurvey.org/Installation_security_hints ?

Issue History

Date Modified Username Field Change
2023-09-25 16:28 babiel New Issue
2023-09-29 09:18 babiel Note Added: 77434
2023-09-29 09:18 babiel Bug heat 6 => 8
2023-09-30 16:01 DenisChenu Relationship added has duplicate 19137
2023-09-30 16:01 DenisChenu Bug heat 8 => 14
2023-10-09 18:53 gabrieljenik Note Added: 77589
2023-10-09 18:53 gabrieljenik Bug heat 14 => 16
2023-10-16 10:55 babiel Note Added: 77729
2023-10-26 11:07 mfavetti View Status private => public
2023-10-26 11:07 mfavetti Bug heat 16 => 10
2023-10-26 11:07 mfavetti Note View State: 77434: public
2023-10-26 11:08 mfavetti Note View State: 77729: public
2023-10-26 11:08 mfavetti Note View State: 77589: public
2023-10-26 11:08 mfavetti Note Added: 78034
2023-10-26 11:08 mfavetti Bug heat 10 => 12
2023-10-27 09:53 mfavetti Note Added: 78074
2023-10-27 09:54 mfavetti Note Added: 78075
2023-10-27 09:58 mfavetti Note Edited: 78074
2023-10-27 09:59 mfavetti Note Edited: 78075
2023-10-27 12:13 babiel Note Added: 78086
2023-10-28 22:52 mfavetti Issue Monitored: mfavetti
2023-10-28 22:52 mfavetti Bug heat 12 => 14
2023-10-30 08:43 DenisChenu Note Added: 78115
2023-10-30 08:43 DenisChenu Bug heat 14 => 16
2023-10-30 08:45 DenisChenu Note Added: 78116
2023-10-30 19:39 gabrieljenik Note Added: 78155
2023-11-03 09:43 mfavetti Note Added: 78232
2023-11-03 10:51 babiel Note Added: 78239
2023-11-03 10:53 mfavetti Note Added: 78240
2023-11-03 10:54 babiel Note Added: 78241
2023-11-03 10:59 mfavetti Note Added: 78242
2023-11-03 11:15 babiel Note Added: 78243
2023-11-03 11:15 babiel File Added: LimeSurvey_excel_export_error.html
2023-11-03 12:48 gabrieljenik Note Added: 78244
2023-11-03 12:48 gabrieljenik Status new => acknowledged
2023-11-03 20:03 mfavetti Note Added: 78264
2023-11-06 11:05 babiel Note Added: 78278
2023-11-06 11:05 babiel File Added: strace.log
2023-11-06 15:52 gabrieljenik Note Added: 78291
2023-11-06 16:21 DenisChenu Note Added: 78292
2023-11-06 16:25 DenisChenu Note Edited: 78292
2023-11-06 16:27 babiel Note Added: 78293
2023-11-06 16:29 babiel Note Added: 78294
2023-11-06 17:25 DenisChenu Note Added: 78296
2023-11-07 13:40 gabrieljenik Note Added: 78312
2023-11-07 22:57 mfavetti Note Added: 78329
2023-11-08 08:04 DenisChenu Note Added: 78330
2023-11-20 16:06 babiel Note Added: 78544
2023-11-27 14:03 babiel Note Added: 78734
2023-11-27 14:03 babiel File Added: Bildschirmfoto vom 2023-11-27 13-13-46.png
2023-11-27 18:32 gabrieljenik Note Added: 78749
2024-01-03 12:04 babiel Note Added: 79089
2024-02-22 11:32 mfavetti Assigned To => mfavetti
2024-02-22 11:32 mfavetti Status acknowledged => closed
2024-02-22 11:32 mfavetti Resolution open => no change required