Visualizzazione risultati 1 fino 13 di 13

Discussione: [PHP] Problema nel ricavare una stringa

  1. #1
    Guest

    Predefinito [PHP] Problema nel ricavare una stringa

    Ciao a tutti, sto creando una funzione "query" dove questa si suddivide (sino ad ora) in 4 parti in base al testo che contiene... queste sono le strutture:
    # Struttura 1: SELECT x FROM y
    # Struttura 2: SELECT x FROM y WHERE h = 'i'
    # Struttura 3: SELECT x FROM y WHERE h = 'i' ORDER BY f
    # Struttura 4: SELECT x FROM y WHERE h = 'i' ORDER BY f LIMIT a,b
    Però, richiamandola, con la prima funzione ossia query("SELECT ciccio FROM utenti"); quest'ultima non da nessun output... come mai? Rimane tutto bianco!
    Ecco qui il metodo che sto usando (ho scritto solo le prime due)...
    Codice PHP:
    if(preg_match("/SELECT [^A-Za-z] FROM [^A-Za-z]/",$query)) { return "tipo 1"; }
    else if(
    preg_match("/SELECT [^A-Za-z] FROM [^A-Za-z] WHERE [^A-Za-z] = '[^0-9A-Za-z]'/",$query)) { return "tipo 2"; }
    Poi, una volta ricavato il tipo di query, mi servirebbe un metodo per ricavare tutte le impostazioni ad esempio il select sarà $select, il from $from, $where sarà 1 dove vi è h e 2 dove vi è i ... spero di essermi spiegato! =)
    Grazie mille. Ciao Davide!
    Ultima modifica di sIM : 18-09-2010 alle ore 18.36.41

  2. #2
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Così ti stai lanciando in un parser di SQL, eh? (spero per te si limiti a questo... un vero parser è davvero arduo come compito...)

    Tornando al tuo problema, probabilmente stai sbagliando l'espressione regolare, perché quello che hai scritto con le parentesi quadre a parole si legge più o meno così: "un qualsiasi carattere esclusi quelli alfabetici, maiuscoli e minuscoli".

    Se volevi scrivere qualcosa tipo "una parola delimitata che inizi con un carattere alfabetico e abbia gli altri caratteri alfanumerici, da segnare come riferimento per altri utilizzi", questa è la sintassi corretta:
    Codice:
    /SELECT (\b[A-Za-z]\w*\b) FROM (\b[A-Za-z]\w*\b)/
    Per utilizzare i raggruppamenti (che hai definito nella regexp usando le parentesi tonde), devi usare il metodo preg_match_all e passare tra i parametri l'array che conterrà i riferimenti ai match e ai raggruppamenti: consulta la documentazione della funzione per sapere dove si trovano.

    Stammi bene...
    Ultima modifica di dementialsite : 18-09-2010 alle ore 19.29.58
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  3. #3
    Guest

    Predefinito

    Allora... mmm si xD Sto realizzando diciamo una classe per gestire un database con i file di testo, ma con linguaggio SQL =D
    Ho letto una guida sulle regex e quelle create da me funzionano... solo che adesso mi trovo in difficoltà... ecco cosa ho fatto:
    Codice PHP:
    if(preg_match("/(SELECT) [a-zA-Z0-9\_\*]+ (FROM) [a-zA-Z0-9\_]+ (WHERE) [a-zA-Z0-9\_]+ (=) \'(.+)\' (ORDER BY) [a-zA-Z0-9\_]+ (LIMIT) [0-9]+\,[0-9]+/",$query))
    {
    return
    "tipo 4";
    }
    else if(
    preg_match("/(SELECT) [a-zA-Z0-9\_\*]+ (FROM) [a-zA-Z0-9\_]+ (WHERE) [a-zA-Z0-9\_]+ (=) \'(.+)\' (ORDER BY) [a-zA-Z0-9\_]+/",$query))
    {
    return
    "tipo 3";
    }
    else if(
    preg_match("/(SELECT) [a-zA-Z0-9\_\*]+ (FROM) [a-zA-Z0-9\_]+ (WHERE) [a-zA-Z0-9\_]+ (=) \'(.+)\'/",$query))
    {
    return
    "tipo 2";
    }
    else if(
    preg_match("/(SELECT) [a-zA-Z0-9\_\*]+ (FROM) [a-zA-Z0-9\_]+/",$query))
    {
    preg_match("/(SELECT) [a-zA-Z0-9\_\*]+ [^.+]/",$query,$select);
    $select[0] = str_replace("SELECT ","",$select[0]);

    preg_match("/^[^.+] (FROM) [a-zA-Z0-9\_]+$/",$query,$from);
    print_r($from);
    }
    In pratica... nella prima nego la continuazione di qualsiasi carattere... ma nella seconda dovrei negare la prima parte per prelevare il FROM y e poi togliere FROM =)
    Con SELECT ha funzionato perfettamente! ^^
    Grazie mille... ciao Davide! =D

    PS. Beh... a me serve qualcosa di semplice... si incomincia con poco e poi si migliora!

    Edit: Non ho capito bene questa cosa del preg_match_all... in pratica posso scrivere solo un pattern per tutti i tipi? xD
    Ri-Edit: Sto provando anche con questo codice (vedi sotto)... ma è su 0, ossia non funziona, crea array vuoti!! ç_ç
    Codice PHP:
    preg_match_all("/SELECT ([a-zA-Z0-9\_\*]+) FROM ([a-zA-Z0-9\_]+) WHERE ([a-zA-Z0-9\_]+) = '(.+)' ORDER BY ([a-zA-Z0-9\_]+) LIMIT ([0-9]+)\,([0-9]+)/",$query,$ris);
    print_r($ris);
    Ultima modifica di sIM : 18-09-2010 alle ore 21.28.36

  4. #4
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    Edit: Non ho capito bene questa cosa del preg_match_all... in pratica posso scrivere solo un pattern per tutti i tipi? xD
    Esattamente... in una RegExp le parentesi tonde hanno la funzione di "creare un riferimento", che può essere utilizzato.
    Torniamo all'esempio della documentazione: l'obiettivo di quella RegExp è quello di trovare i tag HTML ed isolare il testo contenuto al loro interno usando un raggruppamento di parentesi tonde (beh, non è proprio così... è l'effetto che si ottiene dall'input specificato).
    Passandogli il parametro matches, questo viene creato in modo che:
    - alla "riga" 0 vengono inserite, in ordine, tutte le corrispondenze della RegExp principale (in questo caso, i tag completi di testo)
    - alla "riga" 1, invece, troverai solo i testi contenuti nei tag nello stesso ordine (che vengono isolati, come detto, usando le parentesi tonde)

    Citazione Originalmente inviato da sIM Visualizza messaggio
    Ri-Edit: Sto provando anche con questo codice (vedi sotto)... ma è su 0, ossia non funziona, crea array vuoti!! ç_ç
    Codice PHP:
    preg_match_all("/SELECT ([a-zA-Z0-9\_\*]+) FROM ([a-zA-Z0-9\_]+) WHERE ([a-zA-Z0-9\_]+) = '(.+)' ORDER BY ([a-zA-Z0-9\_]+) LIMIT ([0-9]+)\,([0-9]+)/",$query,$ris);
    print_r($ris);
    Per quanto detto sopra, questa RegExp funziona solamente con query complete di tutte le clausole. Se vuoi avere match parziali, devi usare un po' di punti di domanda nella RegExp (messi alla fine significano: "zero o una occorrenza del carattere/gruppo precedente". All'inizio, invece, insieme ai due punti significano: "usa le parentesi con il solo scopo di alterare la precedenza, senza definire un raggruppamento"), così:
    Codice:
    /SELECT ([a-zA-Z0-9\_\*]+) FROM ([a-zA-Z0-9\_]+)(?: WHERE ([a-zA-Z0-9\_]+) = '(.+)')?(?: ORDER BY ([a-zA-Z0-9\_]+))?(?: LIMIT ([0-9]+)\,([0-9]+))?/
    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  5. #5
    Guest

    Predefinito

    Ok grazie mille... ma ho deciso di tenere il metodo dell'individuazione per ora xD
    Adesso mi servirebbe associare le chiavi (poste alla prima riga, nella chiave 0 dell'array) al valore, posto nelle righe successive! Come potrei fare? Mi sto un po' perdendo xD
    Codice PHP:
    function fetch_array() {

    foreach(
    $this->save as $line)
    {
    if(
    $line[0]) continue;

    foreach(
    $line as $single)
    {
    $exp = explode("|",$single);
    print_r($exp);
    }
    }
    }
    Codice PHP:
    else if(preg_match("/SELECT ([a-zA-Z0-9\_\*]+) FROM ([a-zA-Z0-9\_]+)/",$query,$ris))
    {
    if(
    file_exists($this->database.$ris[2].".txt"))
    {
    $file = file($this->database.$ris[2].".txt");

    if(
    $ris[1] == "*")
    {
    $this->save = array($file);
    }
    else
    {
    return
    "Errore :: Azione non consentita.";
    }
    }
    else { return
    "Errore :: La tabella non esiste."; }
    }
    Grazie mille! =)

  6. #6
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Ti faccio notare che l'array $ris avrà sempre due dimensioni, pertanto la prima parentesi avrà per riferimento $ris[1][0], mentre la seconda $ris[2][0]. Se avessi altri match globali (non dovrebbe essere il tuo caso), si troverebbero in $ris[1][1] (primo sottogruppo) e $ris[2][1] (secondo gruppo).

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  7. #7
    Guest

    Predefinito

    Mmm no scusami xD Ho solo 3 valori con 3 chiavi xD
    0 => query, 1 => select (valore), 2 => from (valore)... comunque riguardo la memorizzazione e l'esecuzione dei dati? Come posso associarli?? xD
    Grazie mille! ^^

  8. #8
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Prego rileggere con più attenzione il post sopra:
    Citazione Originalmente inviato da dementialsite Visualizza messaggio
    Ti faccio notare che l'array $ris avrà sempre due dimensioni, pertanto la prima parentesi avrà per riferimento $ris[1][0], mentre la seconda $ris[2][0]. Se avessi altri match globali (non dovrebbe essere il tuo caso), si troverebbero in $ris[1][1] (primo sottogruppo) e $ris[2][1] (secondo gruppo).
    Aggiungo, nel caso non fosse chiaro, che è possibile avere anche un solo elemento per riga (e si verifica giusto quando c'è un solo match globale).

    Se hai ancora dubbi, prova a fare un var_dump ($ris) subito dopo la chiamata a preg_match_all()... chiarisce molti dubbi.

    Stammi bene...
    Ultima modifica di dementialsite : 18-09-2010 alle ore 23.10.35
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  9. #9
    Guest

    Predefinito

    Allora o non ho capito io... oppure non mi spiego... xD Non sto usando il preg_match_all! xD
    Sto solo usando i codici che ho postato sopra... funziona tutto solo che non so' come associare la prima riga come chiave e poi i valori per ogni riga... Grazie mille xD

    Edit: Infatti, dopo l'apertura, facendo il print_r di $ris... esce quello che ho detto:
    Array ( [0] => SELECT * FROM persone [1] => * [2] => persone )
    Edit2: Forse questo può capitare se qualcuno fa più query alla volta... giusto? xD
    Ultima modifica di sIM : 18-09-2010 alle ore 23.30.05

  10. #10
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Se usi solo preg_match(), allora effettivamente il tuo array avrà una sola dimensione, però il metodo intercetterà solo la prima occorrenza del pattern (leggi: nel tuo caso, se ti passano più query contemporaneamente avrai dati utili solo per la prima).

    Non riesco a capire cosa intendi dire alla frase qui sottolineata:
    Citazione Originalmente inviato da sIM Visualizza messaggio
    Allora o non ho capito io... oppure non mi spiego... xD Non sto usando il preg_match_all! xD
    Sto solo usando i codici che ho postato sopra... funziona tutto solo che non so' come associare la prima riga come chiave e poi i valori per ogni riga... Grazie mille xD

    Edit: Infatti, dopo l'apertura, facendo il print_r di $ris... esce quello che ho detto:


    Edit2: Forse questo può capitare se qualcuno fa più query alla volta... giusto? xD
    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  11. #11
    Guest

    Predefinito

    Ok, quindi basta aggiungere _all?? xD
    Riguardo quello che non hai capito... io ho questo schema:
    id|nome|cognome|sesso|via|citta|telefono
    0|Alberto|Acer|m|Via Milano|Torino|000234242
    1|Maria|Accapi|f|Via Bologna|Palermo|0001232
    2|Francesca|Emmeessei|Via Roma|Milano|00023423
    In pratica, la linea 1 (=chiave array 0), viene saltata... e io dovrei associarli... un list?
    Se io faccio $exp['id']."<br />" deve mostrarmi 0<br />1<br />2 ok?
    Non so' se riesco a spiegarmi! =)
    Grazie mille! ^^

  12. #12
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Adesso è un pochino più chiaro, ma non riesco a trovare il nesso tra questo problema e quello che hai posto con le RegExp.

    Forse dormendoci sopra mi si chiariranno le idee... boh...

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  13. #13
    Guest

    Predefinito

    Allora... ci sono riuscito!!... e come vedi posso fare più query per volta ma ho dei problemi:
    - Primo: l'ultimo elemento è con uno spazio... come faccio ad eliminarlo?
    - Secondo: Sto vedendo questo risultato (l'array) poiché ho messo print_r, ma mettendo return mostra solo il primo! =(
    Array ( [id] => 0 [attivazione] => 1 [telefono ] => 0001232 ) Array ( [id] => 1 [attivazione] => 0 [telefono ] => 000234242 ) Array ( [id] => 2 [attivazione] => 0 [telefono ] => 00023423 )

    Array ( [id] => 0 [nome] => Alberto [cognome] => Acer [sesso] => m [via] => Via Milano [citta] => Torino [telefono ] => 000234242 ) Array ( [id] => 1 [nome] => Maria [cognome] => Accapi [sesso] => f [via] => Via Bologna [citta] => Palermo [telefono ] => 0001232 ) Array ( [id] => 2 [nome] => Francesca [cognome] => Emmeessei [sesso] => f [via] => Via Roma [citta] => Milano [telefono ] => 00023423 )
    Codice PHP:
    function fetch_array() {
    $array = "";
    foreach(
    $this->save as $id=>$single) { $array[$id] = $single; }

    $schema = explode("|",$array[0]);
    unset(
    $array[0]);

    $array = array_values($array);

    foreach(
    $array as $single) {
    $ex = explode("|",$single);
    $comb = array_combine($schema,$ex);
    print_r($comb);
    }
    }
    Codice PHP:
    $personeq = $textsql->query("SELECT * FROM attivazioni");
    $persone = $textsql->fetch_array();
    echo
    "<hr>";
    $xq = $textsql->query("SELECT * FROM persone");
    $x = $textsql->fetch_array();
    E' la verità... ho lavorato una giornata per queste 4 righe xD
    Sto facendo progressi con gli array e le classi! ;D
    Ultima modifica di sIM : 19-09-2010 alle ore 18.01.19

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •