Visualizzazione risultati 1 fino 7 di 7

Discussione: Aiuto funzione a più parametri per esecuzione query sqlite

  1. #1
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito Aiuto funzione a più parametri per esecuzione query sqlite

    Ho da poco realizzato una classe contenente delle funzione utili al mio scopo, quali.

    • Apertura / chiusura connessione al db sqlite
    • Conteggio record in una tabella, con o senza clausolo WHERE
    • Eseguzione query sqlite, con parametri passati attraverso funzione addslashes


    Per ogni opzione ho realizzato una funzione, tutte queste funzionano perfettamente, eccetto l'ultima, per eseguire una query:

    Codice PHP:
    function query($args)
    {
    if (
    func_num_args() > 1) {
    $args = func_get_args();

    $this->lastquery = call_user_func_array("sprintf", addslashes($args));

    return
    sqlite_query($this->sq, $this->lastquery);
    }
    }
    $sq, e la variabile contenente la connessione. Quando richiamo questa funzione, nel mio codice, tutto ciò non mi funziona.

    Provando a levale l'addslashes() mi funziona per tutte le query tranne per quella di selezione:

    Codice PHP:
    $query = $conn->query("SELECT * FR0M %s", "tabella");

    while (
    $rs = sqlite_fetch_array($query))
    {
    echo
    "risultato<p />";
    }
    $conn e la variabile che inizializza la classe contenente la funzione query(), provando a stampare la query mi viene stampata correttamente, ma quest'ultimo codice non mi funziona, come mai?
    Ultima modifica di sevenjeak : 19-07-2011 alle ore 10.58.11

    Sevenjeak
    Software developer and much more

  2. #2
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    addslashes si applica ad una stringa, non ad un array.
    Se vuoi applicarla agli elementi di un array, ricorsivamente, devi usare array_map.

    Però, secondo me, faresti meglio ad usare la funzione di escape fatta a posta per sqlite: sqlite_escape_string.

    La riga dovrebbe essere così:
    Codice PHP:
    $this->lastquery = call_user_func_array("sprintf", array_map('sqlite_escape_string', $args));
    p.s. ora che ci penso, al primo parametro ( = la query ) non dovresti fare l'escape.
    Ultima modifica di javascripter : 19-07-2011 alle ore 12.38.56

  3. #3
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito

    Ah si, scusa, errore mio, mi ero dimenticato di usare array_map().

    Ora modifico e ti faccio sapere,

    P.S.: Per quando riguarda il primo parametro, non so se sbaglio, ma lo inserito proprio perché dovrà essere il primo parametro della funzione sprintf(), o sbaglio?

    EDIT:

    Ho provato ad inserire solo la riga che te mi hai detto di modificare ma non funziona, dopo di che ho provato a fare come dicevi te nel ps, a levare il primo parametro, visto che corrispondeva alla query, in questo modo:

    Codice PHP:
    function query($args)
    {
    if (
    func_num_args() > 1) {
    $args = func_get_args();

    for (
    $i = 0; $i < count($args); $i++)
    {
    if (
    $i > 0) {
    $args[$i] = sqlite_escape_string($args[$i]);
    }
    }

    $this->lastquery = call_user_func_array("sprintf", $args);

    return
    sqlite_query($this->sq, $this->lastquery);
    }
    }
    Non so se ho fatto bene, ma mi si verifica lo stesso comportamento di prima, quando non avevo ancora inserito l'addslashes(), cioè, la funzione mi funziona correttamente tranne per la query di selezione.
    Ultima modifica di sevenjeak : 19-07-2011 alle ore 15.34.31

    Sevenjeak
    Software developer and much more

  4. #4
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    È strano perché $this->lastquery, dovrebbe contenere la query correttamente formattata.
    Puoi fare un esempio su come applichi la funzione/metodo?

  5. #5
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito

    La query di selezione la applico sempre allo stesso modo, come scritto nel messaggio iniziale, nel secondo codice, fino ad ora ho provato a fare una query di selezione di aggiornamento e di inserimento, la query di aggiornamento la applico con questo codice:

    Codice PHP:
    $conn->query("UPDATE tabella SET campo = '%s' WHERE id = '%d'", $valore, $id);
    Questo per farti un'esempio, è giusta vero?

    L'unica differenza, che ora mi viene in mentre, ma non credo sia quella, e che:

    Nella query di inserimento la classe, contenente la funzione, è inizializzata nella stessa pagina, mentre nelle altre query, è inizializzata nella pagina dove includo la pagina che richiama la funzione query, ma non dovrebbe essere quello il problema vero? anche perché in entrambi i casi la query viene stampata.

    Sevenjeak
    Software developer and much more

  6. #6
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Si, l'esempio è corretto.

    Citazione Originalmente inviato da sevenjeak Visualizza messaggio
    Nella query di inserimento la classe, contenente la funzione, è inizializzata nella stessa pagina, mentre nelle altre query, è inizializzata nella pagina dove includo la pagina che richiama la funzione query, ma non dovrebbe essere quello il problema vero? anche perché in entrambi i casi la query viene stampata.
    Non ho capito bene.
    Ti sei assicurato che $this->sq sia correttamente impostata?

  7. #7
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito

    In poche parole, dicevo che, l'unica differenza che ha la query di selezione a quella di inserimento e che: la funzione query() viene eseguita da una pagina inclusa nella pagina contenente l'inizializzazione della classe.

    Ora ricontrollo, cmq nell'ultimo controllo fatto era correttamente impostata.

    EDIT:

    Ricontrollato, è impostata correttamente, per esserne sicuro la inizializzo in questo modo, nel costruttore della classe:

    Codice PHP:
    $this->sq = sqlite_open("nome_db.db", 0666, $this->error);
    Neanche $this->error mi stampa niente, in questi casi non dovrebbe riportare l'errore?

    Il db, grazie al file .htaccess e inaccessibile dall'esterno, dando un'errore 403 ( accesso proibito ), ma non credo che sia questo il problema, visto che le altre funzioni mi vanno e mi comunicano perfettamente con il database.

    Più che altro, è probabile che sia un'errore della funzione invece di essere una variabile passata in essa?
    Ultima modifica di sevenjeak : 20-07-2011 alle ore 15.12.49

    Sevenjeak
    Software developer and much more

Regole di scrittura

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