0

我有一些我想导出的 mysql 表的结果,我目前可以单击下载链接并下载 xls,但我希望能够通过 cron 作业运行它并将每周结果通过电子邮件发送给我.

我已经研究过从 Mysql 执行此操作并将其直接保存为 csv。

但是我正在努力使用SQL,表格格式如下

btFormQuestions (some columns ommitted)
+-------+---------------+----------+-----------+
| msqID | questionSetId | Question | InputType |
|-------+---------------+----------+-----------+
|   1   | 123456        | Name     | field     |
|   2   | 123456        | Telephone| field     |
|   3   | 123456        | Email    | email     |
|   4   | 123456        | Enquiry  | test      |

btFormAnswers
+-----+------+-------+-----------------+
| aID | asID | msqID | answer          |
+-----+------+-------+-----------------+
|  1  |   1  | 1     | Sean            |
|  2  |   1  | 2     | 0800 0          |
|  3  |   1  | 3     | se@te.com       |
|  4  |   1  | 4     | Asking Question |

btFormAnswersSet
+------+---------------+---------------------+
| asID | questionSetId | created             |
+------+---------------+---------------------+
| 1    | 123456        | 2013-04-30 11:07:55 |

我目前用于将信息输入 PHP 并输入数组的 sql 查询如下:

//get answers sets
$sql='SELECT * FROM btFormAnswerSet AS aSet '.
'WHERE aSet.questionSetId='.$questionSet.' ORDER BY created DESC LIMIT 0, 100;
$answerSetsRS=$db->query($sql);


//load answers into a nicer multi-dimensional array
$answerSets=array();
$answerSetIds=array(0);
while( $answer = $answerSetsRS->fetchRow() ){
    //answer set id - question id
    $answerSets[$answer['asID']]=$answer;
    $answerSetIds[]=$answer['asID'];
}       

    //get answers
    $sql='SELECT * FROM btFormAnswers AS a WHERE a.asID IN ('.join(',',$answerSetIds).')';
    $answersRS=$db->query($sql);

    //load answers into a nicer multi-dimensional array 
    while( $answer = $answersRS->fetchRow() ){
        //answer set id - question id
        $answerSets[$answer['asID']]['answers'][$answer['msqID']]=$answer;
    }
 return $answerSets;

我希望能够执行以下操作之一

A.) 将所有这些移到一个查询中,以便能够获得以下类型的结果

+---------------+------+-----------+-----------+-----------------+
| QuestionSetID | Name | Telephone | Email     | Enquiry         |
+---------------+------+-----------+-----------+-----------------+
| 123456        | Sean | 0800 0    | se@te.com | Asking Question |

(我确实尝试了各种连接,但无法完全正确) 如果我能让它工作,我不介意保存为 CSV

B.) 将返回的数组输出为 excel 文件,可以保存到服务器上的某个位置,

当前代码从数组创建一个 html 表

代码有点长,所以我只在这里粘贴顶部和底部位

//fwrite($handle, $excelHead);
//fwrite($handle, $row);
//fflush($handle);
 ob_start();
 header("Content-Type: application/vnd.ms-excel");
 echo "<table>\r\n";
 //Question headers go here
 foreach($answerSets as $answerSetId=>$answerSet){
            $questionNumber=0;
            $numQuestionsToShow=2;
            echo "\t<tr>\r\n";
            echo "\t\t<td>". $dateHelper->getSystemDateTime($answerSet['created'])."</td>\r\n";
            foreach($questions as $questionId=>$question){
                $questionNumber++;
                if ($question['inputType'] == 'checkboxlist'){
                    $options = explode('%%', $question['options']);
                    $subanswers = explode(',', $answerSet['answers'][$questionId]['answer']);
                    for ($i = 1; $i <= count($options); $i++)
                    {
                        echo "\t\t<td align='center'>\r\n";
                        if (in_array(trim($options[$i-1]), $subanswers)) {
                            // echo "\t\t\t".$options[$i-1]."\r\n";
                            echo "x";
                        } else {
                            echo "\t\t\t&nbsp;\r\n";
                        }
                        echo "\t\t</td>\r\n";
                    //fwrite($handle, $node);
                    //fflush($handle);
                    }

                }elseif($question['inputType']=='fileupload'){
                    echo "\t\t<td>\r\n";
                    $fID=intval($answerSet['answers'][$questionId]['answer']);
                    $file=File::getByID($fID);
                    if($fID && $file){
                        $fileVersion=$file->getApprovedVersion();
                        echo "\t\t\t".'<a href="'. $fileVersion->getDownloadURL() .'">'.$fileVersion->getFileName().'</a>'."\r\n";
                    }else{
                        echo "\t\t\t".t('File not found')."\r\n";
                    }
                    echo "\t\t</td>\r\n";
                }else{
                    echo "\t\t<td>\r\n";
                    echo "\t\t\t".$answerSet['answers'][$questionId]['answer'].$answerSet['answers'][$questionId]['answerLong']."\r\n";
                    echo "\t\t</td>\r\n";
                }
                //fwrite($handle, $node);
                //fflush($handle);
            }
            echo "\t</tr>\r\n";
            //fwrite($handle, $row);
            //fflush($handle);
        }
        echo "</table>\r\n";
        //fwrite($handle, $excelFoot);
        //fflush($handle);
        //fclose($handle);
file_put_contents($filePath, ob_get_clean());

我可以将文件保存到目录中,但在将其设置为 Excel 文件时遇到问题,我也尝试过使用 Fwrite (而不是缓冲区)播放,结果相似

任何人都可以帮助,或指出我在正确的位置。

谢谢你,肖恩

4

1 回答 1

0

我会在concrete5 中做到这一点。这样您就可以获得所有与表单结果相关的模型,以及各种帮助程序(如电子邮件)。

有关工作的更多信息,请参阅http://www.concrete5.org/documentation/developers/system/jobs/。要从 cron 作业运行,请参阅http://www.concrete5.org/documentation/how-tos/developers/how-to-run-certain-jobs-via-cron/

看起来您已经获得了生成答案并将其放入数组中的代码,但您可能想查看类似https://github.com/concrete5/concrete5/blob/master/web/concrete/的内容核心/控制器/块/form_statistics.php#L32。我不确定这正是您需要的,但我知道仪表板页面会为您构建答案表,因此代码显然存在于某处。

最后,要创建一个 excel 文件,c5 在其他地方使用“将其放入表中并命名为 .xls”的方法,该方法适用于 excel 和 open office。我不确定您所说的“将其设置为 Excel 时遇到问题”是什么意思,但听起来这是您目前的问题。如果某些内容被保存到文件中,那么您应该发布文件内容,并且您/我们可以向后研究导致问题的原因。它可能只是格式错误的 HTML 或其他东西。

最后,要发送电子邮件,您可以使用 Mail Helper,但目前不允许使用附件(github 中有一个 pull request,您可以使用它来覆盖 mail helper)。通常,“最佳实践”是将其作为链接发送。

于 2013-04-30T16:48:59.603 回答