with texto strip_tags remove limpiar from eliminar allow all php mysql pdo mariadb

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).