php - texto - Memoria PDO agotada
string strip_tags (2)
Este es un problema común, pero no tengo opción de codificarlo así solo para obtener el encabezado y el cuerpo adecuados en el archivo de Excel
aquí cómo comienza
Cuando se hizo una solicitud para imprimir, primero comencé a hacer una consulta para buscar los encabezados en la base de datos
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
y esto producirá números de encabezados que haré que sea así
DATE | Instrument1 | Instrument2 | Instrument3
El Instrument?
será dinámico en función de la consulta anterior. Guardo esto en una nueva variable. Pero la variable original que contiene los resultados de la base de datos permanece intacta.
Más tarde, utilizando los mismos parámetros :di_id
y :rpt_type
, también otros parámetros adicionales, startDt
y endDt
para realizar otra consulta solo para devolver una larga lista de fechas disponibles en la base de datos. Esto se basa en startDt
y endDt
.
$sql2 = "SELECT iv_reading FROM instrument_reading WHERE iv_inid = :inid AND iv_ipid = :ipid AND iv_date = :dt AND iv_status = ''Y''";
Cuando termina de obtener las fechas, hago dos bucles como este
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() .''"}}'';
}
}
}
En primer lugar, comienza a repetir la fecha y en segundo lugar comienza a repetir los encabezados (según la consulta realizada justo antes de obtener las fechas). Mi problema, siempre estoy atrapado aquí
$stmt2->execute(array('':dt'' => $dt, '':inid'' => $InstRow->in_id, '':ipid'' => $InstRow->ip_id));
¿Qué piensas? ¿Hay alguna forma mejor de manejar esto?
Para su información, uso Slim y PHPExcel. PHPExcel puede tener problemas de memoria y estoy pensando en cambiar a Spout pero los documentos siguen siendo sobre las cosas básicas.
En su SQL, puede considerar una cláusula de límite para facilitar la carga de memoria de la siguiente manera:
$handle = fopen("file.csv", "wb");
$statement = "
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
LIMIT 250
";
$prep = $dbh->prepare($statement);
for ($i = 0; $prep -> rowCount < 250; $i+= 250) {
fputcsv(prep->fetchAll());
$prep = $dbh->prepare($statement.'' OFFSET''.$i);
}
fclose($handle);
Alternativamente, puede usar el system y llamar a SELECT INTO , establecer los permisos (si es necesario) y Bob es su tío.
No ha terminado el ciclo de fetch
.
$rowDb = $stmt2->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT);
obtiene la "siguiente" fila o cierra el "cursor" y finaliza.
¿Esperas obtener exactamente una fila? Si es así, considera hacer fetchAll. (Precaución: el conjunto de resultados puede tener un nivel extra profundo en las matrices).