• User

    utilizzo funzioni php in query mysql

    Ciao a tutti,
    volevo avere chiarimenti sull'uso di funzioni php all'interno di query mysql...qual è la sintassi corretta?

    Ho scritto due funzioni in php: getMonth($data_mostra) e currentMonth() ed ho provato ad utilizzarle all'interno di una query msql in questo modo:

    $query=mysql_query("SELECT * FROM ".$gallerie." WHERE getMonth(data_mostra)=currentMonth()");

    Subito dopo ho:

    $numGallerie=mysql_num_rows($query);

    ma mi viene restituito il seguente errore:
    mysql_num_rows(): supplied argument is not a valid MySQL result

    Credo che il problema sia nella sintassi della select che ho utilizzato (ho ricontrollato le funzioni e dovrebbero essere corrette).

    Qualsiasi ipotesi e' ben accetta.
    Vi ringrazio,
    El alma 🙂


  • Super User

    fai:
    echo "SELECT * FROM ".$gallerie." WHERE getMonth(data_mostra)=currentMonth()";

    e posta il risultato così vediamo se la sintassi è corretta :ciauz:


  • User

    No, non funziona.
    Ho capito il motivo: affinchè la select funzioni, la funzione getMonth dovrebbe ritornare il nome di un campo della tabella, mentre io volevo poter uguagliare il valore del campo data_mostra, opportunamente modificato da getMonth, con il valore restituito da currentMonth().

    Alla fine, o aggiro il problema, usando il tipo date e le funzioni mysql relative oppure devo fare in modo di non usare la funzione getMonth.

    Ho optato per la seconda alternativa ed ho risolto il problema.

    $mese_anno_corrente=currentMonthYear();

    $query=mysql_query("SELECT * FROM ".$gallerie." WHERE data_mostra='$mese_anno_corrente'");

    Con questa select ho ottenuto quello che volevo,.
    Notare che ho dovuto assegnare il valore restituito da currentMonthYear() ad una var, perchè usandola direttamente all'interno della select non fungeva.

    Ciao


  • Super User

    quindi tu hai una tabella per ogni mese dell'anno e per ogni anno?

    va beh, l'importante è che ora funzioni 😄 :ciauz:


  • User

    Spiego meglio:

    Un utente attraverso un form inserisce la data (mese e anno) in cui vuole che la sua galleria sia visibile, lo fa attraverso 2 menu a tendina, ad es può selezionare "Luglio" e "2005". Ora, per non usare un campo di tipo date (tanto per complicarmi la vita :1: ho usato un campo (data_mostra appunto) di tipo varchar, in cui metto stringhe del tipo "Luglio 2005"...per visualizzare le gallerie relative a questo mese, faccio una select (quella postata prima) in cui uguaglio il campo data_mostra al mese e anno correnti. Il problema si pone se volevo solo il mese ad esempio, infatti il getMonth(data_mostra) di cui parlavo non può funzionare in quanto a sx dell'uguaglianza in una condizione della clausola where deve comparire il nome di un campo della tabella.
    Ciao ciao
    :ciauz:


  • Super User

    perdonami ma nn ho proprio capito cosa intendi.

    se vuoi un record dove sia in chiave il mese e l'anno io avrei fatto un int di 4 cifre, le prime 2 per il mese e le seconde due per l'anno. (è solo una delle soluzioni possibili).
    andare a fari confronti di stringhe è, oltre che uno sbattimento, anche più lento in termini di performance del database.

    la soluzione più comoda in assoluto era fare un campo int per il mese ed un cmpo int per l'anno ed a questo punto hai tutti i dati che vuoi con gli ordinamenti ed i filtri che ti servono.

    l'unica cosa da fare è una funzioncina che, passato il numero del mese, restituisce il nome

    function getmese($numero)
    {
    switch($numero)
    1: $mese='gennaio';
    etc etcetc

    return $mese;
    }

    però... ripeto, se hai risolto e funziona tanto meglio :ciauz:


  • User

    Sì, senza dubbio hai ragione...però aldilà della soluzione migliore, la mia curiosità era relativa all'uso di funzioni php all'interno di query mysql.

    Ciao e grazie :ciauz:


  • Super User

    per il piacere della pignoleria non esistono funzioni php all'interno di istruzioni sql.

    esiste solo l'utilizzo di istruzioni php per creare e concatenare una stringa che poi verrà inviata ad un motore di database che la interpreta ed a quel punto diventa un'istruzione sql.

    nel tuo caso specifico l'utilizzo della funzione getmonth ed il suo funzionamento (scusa il gioco di parole) è identico sia che tu la stia usando per creare una stringa che verrà inviata ad un motore di database che per creare una stringa che verrà stampata in una pagina web :ciauz:

    p.s. risposta data solo per il piacere della pignoleria (che detto da uno come me è proprio tutto dire :lol: :lol: )


  • User

    Ti ringrazio per la risposta e per i chiarimenti.
    A volte quello che è pignoleria per qualcuno, è una nozione importante per qualcun altro.
    Ciao ciao