[php] usare nomi di variabili archiviate nel DB
[php] usare nomi di variabili archiviate nel DB postato il 22/11/2011 17:37:41 nel forum programmazione, open source e hosting
Una domanda tecnica. Ho esigenza di salvare nel database i nomi delle variabili che devono essere passate a una funzione. Nomi, non valori.
Ipotetica tabella in mysql:
ID______CAMPO1_____CAMPO2_______PARAMETRI
1_______BlaBla_____BulaBula_____$pippo_____________
2_______CipCiop____FruFru_______$minnie,$clarabella
Supponiamo che in base alle mie esigenze estraggo la riga 1 piuttosto che la riga 2. Notare che nel primo caso il campo "PARAMETRI" contiene un solo nome di variabile, nel secondo due. Questo perchè potrei dover passare i parametri a una diversa funzione.
Supponiamo che una query estragga la riga richiesta e che il valore del campo "PARAMETRI" finisca nella variabile $PARAMETRI.
Nel file php invece avrei:
<?php
// ..codice vario..
$pippo = qualche_funzione();
$minnie = 'meretrice';
$clarabella = $_SESSION['gargamella'];
// ..altro codice ..
if(blablabla)
{
$esito = funzione1($PARAMETRI);
}
else
{
$esito = funzione2($PARAMETRI);
}
// ..altro codice
?>
Cosa succede al valore della variabile $PARAMETRI? La sostituzione come viene effettuata, ossia che valore arriva a funzione1 e funzione2? Gli arrivano i valori delle variabili così come assegnate prima del costrutto IF, o gli arriva un valore letterale sotto forma di stringa contenente rispettivamente "$pippo" e "$minnie,$clarabella"?
Pagine → 1
22/11/2011 17:43:48
Gli arriva la stringa, per la riga uno conterrà "$pippo", per la riga due "$minnie,$clarabella".
Se devi far arrivare a quelle funzioni i valori, archivia direttamente quelli nel db, altrimenti prova ad illustrare meglio la situazione entrando nel tuo specifico caso per ciò che ti occorre fare.
22/11/2011 17:50:08
blancks ha scritto: Gli arriva la stringa, per la riga uno conterrà "$pippo", per la riga due "$minnie,$clarabella".
Se devi far arrivare a quelle funzioni i valori, archivia direttamente quelli nel db, altrimenti prova ad illustrare meglio la situazione entrando nel tuo specifico caso per ciò che ti occorre fare.
Come temevo -.- Mi pareva troppo bello per essere vero. Stavo cercando di decidere, non potendo prevedere a monte i valori delle variabili, quale fosse l'opzione più conveniente tra
1) duplicare un tot di righe assegnando a monte le variabili dopo uno studio accurato dei valori che le funzioni chiamate possono attendersi a seconda delle circostanze in cui vengono chiamate
2) studiarmi come mysql gestisce le stored procedures/functions rispetto a quanto accade in oracle
3) Sperare nella possibilità di passare a una funzione il nome di una variabile all'interno di un'altra variabile con sostituzione del valore assegnato nello script al momento del richiamo della funzione (mi pare di capire che non si può)
Scartando per ragioni di tempo l'opzione 2 temo di dovermi buttare sulla 1, vero? ç_ç
22/11/2011 18:10:34
Ghenna, mi devi spiegare il problema.
Non sapendo perché ti occorre agire in quel modo non sono ingrado di consigliarti una soluzione appropriata.
22/11/2011 19:51:47
Mmh, io concordo con faber XD credo che tu stia prendendo il problema dalla parte sbagliata.
Se ho capito bene cosa vorresti fare, stai cercando di sviluppare qualcosa si simile a un sistema a hook? http://code.google.com/p/phphooks/ ↗
22/11/2011 19:55:34
Io non ho capito! Cioè vuoi creare degli "eventi" che possano essere universali e adattabili ad ogni "cosa"? Ma non puoi proprio svoltare riprogettando il tutto ad oggetti? Sarebbe molto più semplice progettare -e quindi implementare- il tutto!
22/11/2011 19:59:45 e modificato da ghennadi72 il 22/11/2011 20:01:27
leoblacksoul ha scritto: Mmh, io concordo con faber XD credo che tu stia prendendo il problema dalla parte sbagliata.
Se ho capito bene cosa vorresti fare, stai cercando di sviluppare qualcosa si simile a un sistema a hook? http://code.google.com/p/phphooks/ ↗
No, qualcosa di simile a questo http://wiki.sphere.torfo.org/index.php/Chapter_9 ↗. :-)
Il "problema" é già in avanzato stato di "solving", ne ho postato solo un pezzetto che speravo mi aiutasse a risparmiare qualche riga di db, qualche include e qualche chiamata a variabili globali che avrei evitato per abitudini mie, ma come ho detto non è un problema bloccante la non fattibilità di quello che mi è venuto in mente oggi pomeriggio.
Grazie in ogni caso delle risposte e dei suggerimenti :-)
vino_veritas ha scritto: Io non ho capito! Cioè vuoi creare degli "eventi" che possano essere universali e adattabili ad ogni "cosa"? Ma non puoi proprio svoltare riprogettando il tutto ad oggetti? Sarebbe molto più semplice progettare -e quindi implementare- il tutto!
No, non essendo un MUD, ossia essendo questi elementi solo un contorno rispetto al cuore (che resta l'interpretazione descrittiva) non ne vale la pena. :-)
22/11/2011 20:23:09 e modificato da blancks il 22/11/2011 20:27:10
Si adesso credo di aver più chiaro cosa vuoi fare.
Ti posso suggerire di dare un occhio alle funzioni serialize() http://it2.php.net/serialize ↗ e unserialize()http://it2.php.net/manual/en/function.unserialize.php ↗
Tramite la prima puoi ottenere una rappresentazione a livello di stringa di una variabile un array o addirittura un intera funzione, così che puoi archiviarla in un database come un dato di testo qualunque.
Una volta recuperato puoi deserializzarla mediante la seconda funzione e accedere alle proprietà di quel che era in origine il dato.
Esempio:
$funzione_contatore = function ($start=null){ static $count; if (!is_null($start)) $count= 0; else ++$count; return $count; };
$fc_serializzata = serialize($funzione_contatore);
// e ti archivi $fc_serializzata nel db
// pagina a caso.php in cui recuperi da db la funzione serializzata
$evento = unserialize($row['event']);
echo $evento(true);
Con questa tecnica va perso chiaramente il nome della variabile originaria che conteneva la funzione o il dato che vuoi salvare.
Ma puoi adottare un semplice escamotage utilizzando un array associativo le cui chiavi, anche dopo la deserializzazione, restano del loro valore pertanto puoi passare alla tua funzione come parametro d'ingresso quell'array che contiene delle chiavi ben distinte e riconoscibili.
Mi spiego con un ulteriore esempio pratico:
$figo = array('ghenna' => 'in graylist', 'blancks' => 'in blacklist', 'gargamella' => 'in puffolandia');
// query di archivio nel db:
UPDATE tabella SET campo = serialize($figo) WHERE [condizione]
// pagina di recupero:
<?php
// ..codice vario..
$pippo = qualche_funzione();
$minnie = 'meretrice';
$clarabella = $_SESSION['gargamella'];
// ..altro codice ..
if(blablabla)
{
$esito = funzione1(unserialize($campo));
}
else
{
$esito = funzione2(unserialize($campo));
}
// ..altro codice
?>
All'interno delle funzioni, onestamente non credo ti occorra sapere i nomi negli array, ma ci vuole poco a ciclarlo e separare i vari dati nell'ordine che più torna comodo.
23/11/2011 00:39:15
La cosa mi intriga. Grazie Blancks, se la utilizzerò ti sposterò dalla blacklist alla greylist 😎
23/11/2011 10:44:58 e modificato da blancks il 23/11/2011 10:46:37
ghennadi72 ha scritto: La cosa mi intriga. Grazie Blancks, se la utilizzerò ti sposterò dalla blacklist alla greylist 😎
Finché lasciamo gargamella in puffolandia mi sta bene 😎
Una piccola nota comunque, quest'espressione:
$funzione_contatore = function ($start=null){ static $count; if (!is_null($start)) $count= 0; else ++$count; return $count; };
Ti potrebbe restituire un errore se la tua versione di php è precedente alla 5.3, in quanto le funzioni anonime sono state introdotte perl'appunto dalla v5.3 http://it.php.net/manual/en/functions.anonymous.php ↗, in quel caso devi adoperare create_function() http://it.php.net/create_function ↗.
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
RAID Shadow Legends ↗
New Orleans ↗
Neverness to Everness ↗
Sea of Conquest ↗
World of Warship ↗
Storie di Agarthi ↗
Tiles Survive ↗