【发布时间】:2015-08-23 18:39:00
【问题描述】:
这是一个常见问题,但我没有选择像这样编码它只是为了在 Excel 文件中获得适当的标题和正文
这里是如何开始的
当请求打印时,我首先开始查询以获取数据库中的标题
SELECT instruments.in_id, instrument_parameters.ip_id,
CASE WHEN gv_x_ipid = -1 THEN 'datetime' ELSE '' END xlabel,
CASE WHEN ip_label LIKE '%Reservoir%' THEN 0 ELSE in_order END legendIndex,
CASE WHEN in_name = 'General' THEN ip_label ELSE in_name END ylabel
FROM graph_plot
LEFT JOIN attributes gptype ON gp_type = gptype.at_id
LEFT JOIN graph_value ON gp_id = gv_gpid
LEFT JOIN instrument_parameters ON gv_y_ipid = ip_id
LEFT JOIN attributes pmunit ON ip_unit = pmunit.at_id
LEFT JOIN instrument_reading yvalue ON gv_y_ipid = iv_ipid
LEFT JOIN instruments ON iv_inid = in_id
WHERE gp_diid = :di_id AND
gp_type = :rpt_type AND
iv_status = 'Y' AND
iv_inid in (".implode(",", $coll->inid).") AND
gv_y_ipid in (".implode(",", $coll->ipid).")
GROUP BY ylabel
ORDER BY legendIndex
这将产生许多标题,我将使其成为这样
DATE | Instrument1 | Instrument2 | Instrument3
Instrument? 将根据上面的查询是动态的。我将其存储在新变量中。但是保存数据库结果的原始变量保持不变。
稍后,使用相同的参数:di_id 和:rpt_type,以及另一个附加参数startDt 和endDt 进行另一个查询,以返回数据库中可用日期的长列表。这是基于startDt 和endDt。
$sql2 = "SELECT iv_reading FROM instrument_reading WHERE iv_inid = :inid AND iv_ipid = :ipid AND iv_date = :dt AND iv_status = 'Y'";
当它完成获取日期时,我会像这样进行两个循环
foreach ($dates as $key => $dt) {
foreach ($resp as $InstNo => $InstRow) {
try {
$stmt2->execute(array(':dt' => $dt, ':inid' => $InstRow->in_id, ':ipid' => $InstRow->ip_id));
$rowDb = $stmt2->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT);
} catch(PDOException $e) {
echo '{"error":{"text":"'. $e->getMessage() .'"}}';
}
}
}
首先,它开始循环日期,然后开始循环标题(基于在获取日期之前进行的查询)。我的问题一直卡在这里
$stmt2->execute(array(':dt' => $dt, ':inid' => $InstRow->in_id, ':ipid' => $InstRow->ip_id));
你怎么看?有没有更好的处理方法?
为了您的信息,我使用 Slim 和 PHPExcel。 PHPExcel 可能有内存问题,我正在考虑切换到Spout,但文档仍然是关于基本内容的。
【问题讨论】:
-
请把表名(或别名)放在SELECT中每一列的前面;我们看不到查询是如何工作的。
-
为什么要嵌套foreach?不能在
SELECT中循环,你只需取回一组行。 -
您希望每个
execute有多少行? -
@MuhaiminAbdul 尝试设置
ini_set('memory_limit', '-1');记住这不好,但为了测试,将它设置为 -1 并查看 -
您的问题不清楚您收到的错误消息是什么。当你说“我总是卡在这里”时,你的意思是它在这条线上抛出异常吗?如果是这样,什么类型以及消息是什么?您是否尝试过在其他上下文中运行查询,例如 PHPMyAdmin 或 MySQL 控制台?