Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    8

    Msqli calling stored functions

    Ciao a tutti,
    sono alle prese con un piccolo problema a cui non riesco a venire a capo, e le ricerche in rete finora non mi hanno aiutato.

    Ho bisogno di ottenere il risultato dell'esecuzione di una stored function da php: la funzione è corretta (la eseguo senza problemi dal software di amministrazione) e viene eseguita dal mio codice PHP (perchè il db viene effettivamente aggiornato) ma il risultato non lo riesco a leggere:

    Codice PHP:

            
    public function executeQuery($aQuery$aParameters)
            {
                if(!
    $this->isOpen())
                    return 
    null;
                    
                
    //Create a prepared statement
                
    if(!($aStatement $this->mConnection->prepare($aQuery)))
                    throw new \
    Exception("Could not prepare statement!");
                
                
    //Bind parameters
                
    if($aParameters != null)
                {
                    foreach(
    $aParameters as $aValue)
                    {
                        
    //Detect type of parameter
                        
    $aType "s";
                        if(
    is_int($aValue))
                            
    $aType "i";
                        else if(
    is_bool($aValue))
                            
    $aType "b";
                        else if(
    is_double($aValue) || is_float($aValue))
                            
    $aType "d";
                            
                        if(!
    $aStatement->bind_param($aType$aValue))
                            throw new \
    Exception("Could not bind parameter with value " $aValue "!");
                    }
                }
                
                
    //Execute statement
                
    if(!$aStatement->execute())
                    throw new \
    Exception("Could not execute statement: " $aQuery);
                    
                
    //Return results
                
    if($aStatement->get_result() == false)
                    return 
    null;
                    
                return new 
    QWMySQLResult($aStatement->get_result());
            } 
    il ResultSet è vuoto.

    Qualcuno mi sa dire se devo prendere particolari accorgimenti?
    Sono nuovo di PHP e ancora più nuovo di PHP+MySQL, quindi chiedo scusa se è una domanda sciocca :-)

  2. #2
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    Com'è scritta la stored procedure? Ritorna valori o esegue solo comandi?

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    8
    Ciao, questa l'ho trovata su internet (non ricordo dove) e l'ho modificata per le mie necessità. Alla fine ritorna il valore calcolato. Credo che funzioni, perchè se la eseguo da SQL-Front tramite:

    select nextval(seq_name) as newid;

    funziona tutto come previsto.

    codice:
    --create nexval stored procedure
    CREATE FUNCTION nextval(seq_name varchar(100))
    RETURNS bigint(20) NOT DETERMINISTIC
    BEGIN
        DECLARE cur_val bigint(20);     
        SELECT
            f_current_value INTO cur_val
        FROM
            t_sequence
    	WHERE
    		f_sequence_name = seq_name;
             
        IF cur_val IS NOT NULL THEN
    		UPDATE
    			T_SEQUENCE
    		SET 
    			f_current_value = IF(
    				(f_current_value + f_increment) > f_end_value, IF(f_cycle = true, f_start_value , null), f_current_value + f_increment
    			)
    		WHERE
    			f_sequence_name = seq_name;
    	
    	END IF;
    	
    	RETURN cur_val;
    END;

  4. #4
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    Scusa la domanda, notavo giusto ora la ->get_result() ma che cosa stai usando? Da dove sbuca quel metodo che io sappia ne mysqli ne PDO hanno un metodo get_result()

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    8
    Ciao, quel metodo restituisce i risultati di un prepared statement:
    http://php.net/manual/en/mysqli-stmt.get-result.php

  6. #6
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    My bad, stavo guardando nel posto sbagliato della documentazione.

    Ad ogni modo la funzione bind_params:
    http://www.php.net/manual/en/mysqli-stmt.bind-param.php

    Ha parametri presi come reference il che significa che potresti definire un parametro come parametro input output e recuperarlo da li.

    Alternativamente puoi provare ad usare il metodo use_result o store_result invece che get_result, dai un occhio alla documentazione:
    http://uk.php.net/manual/en/mysqli.use-result.php
    http://uk.php.net/manual/en/mysqli.store-result.php

    Domanda ma cosa stai cercando di fare con quella store procedure? Sembra che simuli un autoincrement... o sbaglio?

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    8
    Ciao, volevo solo dire che sono finalmente riuscito a farlo funzionare e, nel caso possa essere utile a qualcuno, ecco la mia soluzione:

    Codice PHP:
            public function nextID($aTable)
            {
                if(!
    $this->isOpen())
                    return 
    null;
                    
                
    //Create a prepared statement
                
    if(!($aStatement $this->mConnection->prepare("select nextval(?) as nextid")))
                    throw new \
    Exception("Could not prepare statement!");
                    
                if(!
    $aStatement->bind_param("s"$aTable))
                    throw new \
    Exception("Could not bind parameter with value " $aTable "!");
            
                
    //Execute statement
                
    if(!$aStatement->execute())
                    throw new \
    Exception("Could not select new ID!");
                    
                
    //Return results
                
    if($aStatement->bind_result($aNewID) == false)
                    return 
    null;
                    
                
    $aStatement->fetch();
                
                return 
    $aNewID;
            } 
    Praticamente uso bind_result() seguito da fetch() :-)

    In ogni caso si, la funzione simula una sequenza. Non so quali funzionalità mettano a disposizione le sequenze (o l'analogo) di mysql, ma qualcosa di simile l'ho usata per Oracle e le trovo molto flessibili. Ho pensato che fosse un modo buono quanto un altro per investigare meglio mysqli :-)

    Grazie ancora per l'aiuto!

  8. #8
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    Sarebbe interessante sapere però se i metodi che ti ho suggerito funzionano allo stesso modo.

    Beh in realtà in MySQL le sequenze non ti servono in quanto puoi usare direttamente campi di tipo auto increment.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.