View Issue Details

This bug affects 1 person(s).
 2
IDProjectCategoryView StatusLast Update
18600Bug reportsImport/Exportpublic2023-01-26 15:21
ReporterSuperjamp Assigned To 
PrioritynoneSeveritypartial_block 
Status feedbackResolutionopen 
Product Version5.6.x 
Summary18600: STATA export QT_L_LIST not working
Description

Exporting List (radio) Answers with STATA results into error.
Users sees ERR_INVALID_RESPONSE
curl shows: 500 - "Cannot access offset of type string on string"

Steps To Reproduce

Steps to reproduce

create survey with List (radio) question
create an answer (take survey)
export answers with STATA

Expected result

works ;)

Actual result

ERR_INVALID_RESPONSE - "Cannot access offset of type string on string"

TagsNo tags attached.
Attached Files
debug.html (27,828 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>TypeError</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>TypeError</h1>

        <p class="message">
                Cannot access offset of type string on string   </p>

        <div class="source">
                <p class="file">/var/www/html/lime_app/limesurvey_230116/application/core/plugins/ExportSTATAxml/STATAxmlWriter.php(404)</p>
                <div class="code"><pre><span class="ln">392</span>                                 &#039;1&#039;,
<span class="ln">393</span>                                 &#039;0&#039;,
<span class="ln">394</span>                                 &#039;-1&#039;
<span class="ln">395</span>                             ), $response);
<span class="ln">396</span>                             break;
<span class="ln">397</span>                         case Question::QT_D_DATE: //replace in customResponsemap: date/time as string with STATA-timestamp
<span class="ln">398</span>                             $response = strtotime($response . &#039; GMT&#039;) * 1000 + 315619200000; // convert seconds since 1970 (UNIX) to milliseconds since 1960 (STATA)
<span class="ln">399</span>                             break;
<span class="ln">400</span>                         case Question::QT_L_LIST:
<span class="ln">401</span>                             // For radio lists, user wants code, not label
<span class="ln">402</span>                             // TODO: We could skip this loop if we had answer code
<span class="ln">403</span>                             foreach ($this-&gt;customFieldmap[&#039;answers&#039;][$iQID][$iScaleID] as $answer) {
<span class="error"><span class="ln error-ln">404</span>                                 if ($answer[&#039;answer&#039;] == $response) {
</span><span class="ln">405</span>                                     $response = $answer[&#039;code&#039;];
<span class="ln">406</span>                                     break;
<span class="ln">407</span>                                 }
<span class="ln">408</span>                             }
<span class="ln">409</span>                             break;
<span class="ln">410</span>                     }
<span class="ln">411</span> 
<span class="ln">412</span>                     /* look at each of the responses and determine STATA data type and format of the respective variables
<span class="ln">413</span>                        datatypes coded as follows:
<span class="ln">414</span>                        1=&quot;&quot;
<span class="ln">415</span>                        2=byte
<span class="ln">416</span>                        3=int
</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;/var/www/html/lime_app/limesurvey_230116/application/core/plugins/ExportSTATAxml/STATAxmlWriter.php(528): <strong>STATAxmlWriter</strong>-><strong>updateCustomresponsemap</strong>()                               </div>

                                <div class="code"><pre><span class="ln">523</span>      * - value labels
<span class="ln">524</span>      */
<span class="ln">525</span>     public function close()
<span class="ln">526</span>     {
<span class="ln">527</span> 
<span class="error"><span class="ln error-ln">528</span>         $this-&gt;updateCustomresponsemap();
</span><span class="ln">529</span> 
<span class="ln">530</span>         $xml = new XMLWriter();
<span class="ln">531</span>         $xml-&gt;openMemory();
<span class="ln">532</span>         $xml-&gt;setIndent(true);
<span class="ln">533</span> 
</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;/var/www/html/lime_app/limesurvey_230116/application/helpers/admin/exportresults_helper.php(121): <strong>STATAxmlWriter</strong>-><strong>close</strong>()                         </div>

                                <div class="code"><pre><span class="ln">116</span>             $responsesQuery-&gt;offset($offset);
<span class="ln">117</span>             $responsesQuery-&gt;limit($maxRows);
<span class="ln">118</span>             $survey-&gt;responses = $responsesQuery-&gt;query();
<span class="ln">119</span>             $writer-&gt;write($survey, $sLanguageCode, $oOptions, true);
<span class="ln">120</span>         }
<span class="error"><span class="ln error-ln">121</span>         $result = $writer-&gt;close();
</span><span class="ln">122</span> 
<span class="ln">123</span>         // Close resultset if needed
<span class="ln">124</span>         if ($survey-&gt;responses instanceof CDbDataReader) {
<span class="ln">125</span>             $survey-&gt;responses-&gt;close();
<span class="ln">126</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;/var/www/html/lime_app/limesurvey_230116/application/controllers/admin/Export.php(352): <strong>ExportSurveyResultsService</strong>-><strong>exportResponses</strong>()                             </div>

                                <div class="code"><pre><span class="ln">347</span>         } else {
<span class="ln">348</span>             $sFilter = &#039;&#039;;
<span class="ln">349</span>         }
<span class="ln">350</span> 
<span class="ln">351</span>         viewHelper::disableHtmlLogging();
<span class="error"><span class="ln error-ln">352</span>         $resultsService-&gt;exportResponses($iSurveyID, $explang, $sExportType, $options, $sFilter);
</span><span class="ln">353</span> 
<span class="ln">354</span>         Yii::app()-&gt;end();
<span class="ln">355</span>     }
<span class="ln">356</span> 
<span class="ln">357</span>     /**
</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>Export</strong>-><strong>exportresults</strong>()                             </div>

                                                        </td>
                </tr>
                                                <tr class="trace core collapsed">
                        <td class="number">
                                #4                      </td>
                        <td class="content">
                                <div class="trace-file">
                                                                                        <div class="plus">+</div>
                                                <div class="minus">–</div>
                                                                                &nbsp;/var/www/html/lime_app/limesurvey_230116/vendor/yiisoft/yii/framework/web/actions/CAction.php(115): <strong>ReflectionMethod</strong>-><strong>invokeArgs</strong>()                                </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">
                                #5                      </td>
                        <td class="content">
                                <div class="trace-file">
                                                                                        <div class="plus">+</div>
                                                <div class="minus">–</div>
                                                                                &nbsp;/var/www/html/lime_app/limesurvey_230116/application/core/SurveyCommonAction.php(83): <strong>CAction</strong>-><strong>runWithParamsInternal</strong>()                            </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">
                                #6                      </td>
                        <td class="content">
                                <div class="trace-file">
                                                                                        <div class="plus">+</div>
                                                <div class="minus">–</div>
                                                                                &nbsp;/var/www/html/lime_app/limesurvey_230116/vendor/yiisoft/yii/framework/web/CController.php(308): <strong>SurveyCommonAction</strong>-><strong>runWithParams</strong>()                               </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">
                                #7                      </td>
                        <td class="content">
                                <div class="trace-file">
                                                                                        <div class="plus">+</div>
                                                <div class="minus">–</div>
                                                                                &nbsp;/var/www/html/lime_app/limesurvey_230116/vendor/yiisoft/yii/framework/web/CController.php(286): <strong>CController</strong>-><strong>runAction</strong>()                          </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">
                                #8                      </td>
                        <td class="content">
                                <div class="trace-file">
                                                                                        <div class="plus">+</div>
                                                <div class="minus">–</div>
                                                                                &nbsp;/var/www/html/lime_app/limesurvey_230116/vendor/yiisoft/yii/framework/web/CController.php(265): <strong>CController</strong>-><strong>runActionWithFilters</strong>()                               </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">
                                #9                      </td>
                        <td class="content">
                                <div class="trace-file">
                                                                                        <div class="plus">+</div>
                                                <div class="minus">–</div>
                                                                                &nbsp;/var/www/html/lime_app/limesurvey_230116/application/controllers/AdminController.php(202): <strong>CController</strong>-><strong>run</strong>()    </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">
                                #10                     </td>
                        <td class="content">
                                <div class="trace-file">
                                                                                        <div class="plus">+</div>
                                                <div class="minus">–</div>
                                                                                &nbsp;/var/www/html/lime_app/limesurvey_230116/vendor/yiisoft/yii/framework/web/CWebApplication.php(282): <strong>AdminController</strong>-><strong>run</strong>()                                </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">
                                #11                     </td>
                        <td class="content">
                                <div class="trace-file">
                                                                                        <div class="plus">+</div>
                                                <div class="minus">–</div>
                                                                                &nbsp;/var/www/html/lime_app/limesurvey_230116/vendor/yiisoft/yii/framework/web/CWebApplication.php(141): <strong>CWebApplication</strong>-><strong>runController</strong>()                              </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">
                                #12                     </td>
                        <td class="content">
                                <div class="trace-file">
                                                                                        <div class="plus">+</div>
                                                <div class="minus">–</div>
                                                                                &nbsp;/var/www/html/lime_app/limesurvey_230116/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">
                                #13                     </td>
                        <td class="content">
                                <div class="trace-file">
                                                                                        <div class="plus">+</div>
                                                <div class="minus">–</div>
                                                                                &nbsp;/var/www/html/lime_app/limesurvey_230116/index.php(192): <strong>CApplication</strong>-><strong>run</strong>()                            </div>

                                <div class="code"><pre><span class="ln">187</span> require_once APPPATH . &#039;core/LSYii_Application&#039; . EXT;
<span class="ln">188</span> 
<span class="ln">189</span> $config = require_once(APPPATH . &#039;config/internal&#039; . EXT);
<span class="ln">190</span> 
<span class="ln">191</span> Yii::$enableIncludePath = false;
<span class="error"><span class="ln error-ln">192</span> Yii::createApplication(&#039;LSYii_Application&#039;, $config)-&gt;run();
</span><span class="ln">193</span> 
<span class="ln">194</span> /* End of file index.php */
<span class="ln">195</span> /* Location: ./index.php */
</pre></div>                    </td>
                </tr>
                                </table>
        </div>

        <div class="version">
                2023-01-23 08:49:35 nginx/1.22.1 <a href="https://www.yiiframework.com/">Yii Framework</a>/1.1.26       </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>
debug.html (27,828 bytes)   
Bug heat2
Complete LimeSurvey version number (& build)Version 5.6.0+230116
I will donate to the project if issue is resolvedNo
Browser
Database type & version10.5.18-MariaDB
Server OS (if known)
Webserver software & version (if known)
PHP Version8.0.27

Users monitoring this issue

There are no users monitoring this issue.

Activities

gabrieljenik

gabrieljenik

2023-01-24 20:38

manager   ~73549

Thanks. Bug received.
Will try to reproduce it and be back.

gabrieljenik

gabrieljenik

2023-01-25 14:51

manager   ~73561

Do you have a LS cloud installation or Community Edition on premise installation?

gabrieljenik

gabrieljenik

2023-01-26 15:20

manager   ~73585

I couldn't reproduce it. A fix to a similar issue was released on that date. Can you please try again?

Issue History

Date Modified Username Field Change
2023-01-23 09:03 Superjamp New Issue
2023-01-23 09:03 Superjamp File Added: debug.html
2023-01-24 20:38 gabrieljenik Status new => acknowledged
2023-01-24 20:38 gabrieljenik Note Added: 73549
2023-01-24 20:38 gabrieljenik Bug heat 0 => 2
2023-01-25 14:51 gabrieljenik Note Added: 73561
2023-01-26 15:20 gabrieljenik Note Added: 73585
2023-01-26 15:21 gabrieljenik Status acknowledged => feedback