• User

    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 = 20

    PS: il ```
    require DB()
    ``` fornisce solamente la connessione gia istanziata.