Questa è la mia procedura MySQL:
CREATE DEFINER = 'c4_awuser'@'%'
PROCEDURE c4_awdb.aw_spZAAAOttieniDataTables(IN _identificativoTabella VARCHAR(255))
BEGIN
DECLARE finito INT DEFAULT 0;
DECLARE nomeColonna VARCHAR(200) DEFAULT '';
DECLARE titoloColonna VARCHAR(200) DEFAULT '';
DECLARE queryColonne LONGTEXT DEFAULT 'SELECT ';
DECLARE _nomeVista VARCHAR(255);
DECLARE curColonne CURSOR FOR
SELECT
COLUMN_NAME,
COALESCE(nome_campo, COLUMN_NAME) AS nome_campo
FROM information_schema.columns
LEFT JOIN aw_tbZAAEGestioneTabelleDati
ON ZAAEcvVistaAssociata = _nomeVista
LEFT JOIN aw_tbZAACCampi
ON nome_campo_db = COLUMN_NAME
AND tabella = ZAAEcvNomeTabella
WHERE table_name = _nomeVista;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finito = 1;
SELECT
ZAAEcvVistaAssociata INTO _nomeVista
FROM aw_tbZAAEGestioneTabelleDati
WHERE ZAAEcvIdentificativoTabella = _identificativoTabella;
IF _nomeVista IS NOT NULL AND EXISTS (SELECT
DISTINCT 1
FROM information_schema.columns
WHERE table_name = _nomeVista) THEN
OPEN curColonne;
ciclaColonne: LOOP
FETCH curColonne INTO nomeColonna,titoloColonna;
IF finito = 1 THEN
LEAVE ciclaColonne;
END IF;
SET queryColonne = CONCAT(queryColonne,nomeColonna,' AS \'',titoloColonna,'\',');
END LOOP ciclaColonne;
CLOSE curColonne;
IF RIGHT(queryColonne,1) = ',' THEN
SET queryColonne = LEFT(queryColonne,LENGTH(queryColonne)-1);
END IF;
SET queryColonne = CONCAT(queryColonne,' FROM ',_nomeVista);
SET @sql = queryColonne;
PREPARE dynamic_statement FROM @sql;
EXECUTE dynamic_statement;
DEALLOCATE PREPARE dynamic_statement;
END IF;
END
Ci sono errori? Se la eseguo dal client MySQL mi da due record come risposta (corretto), ma se la eseguo dal PHP me ne da 0, ma senza ritornare errori.
Come parametro alla procedura passo un id come "elenco_corsi". Lo cerco in aw_tbZAAEGestioneTabelleDati e trovo la vista associata. Cerco nelle tabelle di sistema tutte le colonne e costruisco una query dinamica che eseguo via prepared statement.Ho pensato che il problema fosse lato PHP, per cui ecco il codice che utilizzo per chiamare la procedura:
require DB();
$id_datatable = "elenco_corsi";
$stmt = $conn->prepare("CALL aw_spZAAAOttieniDataTables(?);");
$stmt->bind_param("s", $id_datatable);
if($stmt->execute()) {
$result = $stmt->get_result();
$stmt->close();
$conn->close();
echo "<br />Numero righe: ".$result->num_rows."<br /><br />";
if($result && $result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "yes";
$dati[] = $row;
}
$resp = new stdClass();
$resp->esito = 1;
$resp->dati = $dati;
} else {
// it enter here
$resp = new stdClass();
$resp->esito = 20;
$resp->dati = $dati;
}
} else {
$resp = new stdClass();
$resp->esito = 30;
$resp->dati = $dati;
}
Entra nel blocco di codice dove setta ```
esito = 20
PS: il ```
require DB()
``` fornisce solamente la connessione gia istanziata.