- Home
- Categorie
- Coding e Sistemistica
- PHP
- Esecuzione di Stored Procedure via PHP
-
Esecuzione di Stored Procedure via PHP
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 = 20PS: il ``` require DB() ``` fornisce solamente la connessione gia istanziata.