Visualizzazione risultati 1 fino 14 di 14

Discussione: Problema con PHP e SQLite su Altervista

  1. #1
    coolsoft non è connesso Utente giovane
    Data registrazione
    24-02-2005
    Messaggi
    36

    Predefinito Problema con PHP e SQLite su Altervista

    Ho un problema con il comando VACUUM di SQLite su Altervista.
    VACUUM serve a ripulire il DB rilasciando lo spazio inutilizzato; lo fa copiando il DB in un temporaneo e poi scambiando i file.
    Eseguendolo ottengo un errore 23: 'authorization denied'.

    Ho già verificato i permessi sia del db che della cartella che lo contiene, ma senza effetto. Ho anche verificato di poter scrivere/leggere/modificare i file nella TEMP di PHP (/membri/.dummy/temp) con successo.

    Ho preparato uno scriptino di test:
    Codice PHP:
    <?php

    try {
    echo
    "<pre>";
    echo
    "Temp dir: ".sys_get_temp_dir()."\n";
    echo
    "Vacuum...";
    $pdo = new PDO('sqlite:demo.s3db');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // dati casuali
    $pdo->exec("DROP TABLE IF EXISTS 'test'");
    $pdo->exec("CREATE TABLE 'test' (key TEXT PRIMARY KEY)");
    $pdo->exec("INSERT INTO 'test' VALUES('00QN252SSR3S97S5SO91NQ5N2SQ5R716')");
    $pdo->exec("INSERT INTO 'test' VALUES('04736SP90PQQ0Q6O63Q77O0N2PP91363')");
    $pdo->exec("INSERT INTO 'test' VALUES('04O72P4S21161Q363N7R8N320Q85263Q')");
    $pdo->exec("INSERT INTO 'test' VALUES('04P5O0S17351132684Q99PN8N87N2QPP')");
    $pdo->exec("INSERT INTO 'test' VALUES('055S8826601465Q2QS4R9RQ8726O08SN')");
    $pdo->exec("DELETE FROM 'test';");
    // pulizia
    $pdo->exec('VACUUM');
    // fine
    echo "OK\n";
    } catch (
    Exception $e) {
    echo
    "\n".var_export($e, true);
    }
    echo
    "</pre>";
    ?>
    In locale funziona ma su altervista il risultato è:
    Codice:
    Temp dir: /membri/.dummy/temp
    Vacuum...
    PDOException::__set_state(array(
       'message' => 'SQLSTATE[HY000]: General error: 23 authorization denied',
       'string' => '',
       'code' => 'HY000',
       'file' => '/membri/coolsoft/vacuum.php',
       'line' => 30,
       'trace' => 
      array (
        0 => 
        array (
          'file' => '/membri/coolsoft/vacuum.php',
          'line' => 30,
          'function' => 'exec',
          'class' => 'PDO',
          'type' => '->',
          'args' => 
          array (
            0 => 'VACUUM',
          ),
        ),
      ),
       'errorInfo' => 
      array (
        0 => 'HY000',
        1 => 23,
        2 => 'authorization denied',
      ),
    ))
    Credo che SQLite usi la temp di sistema e non quella di PHP e quindi, quando deve eliminare il DB temporaneo, va in errore.
    Qualche admin può confermare la mia tesi?

    Grazie per l'aiuto

  2. #2
    coolsoft non è connesso Utente giovane
    Data registrazione
    24-02-2005
    Messaggi
    36

    Predefinito

    Up, c'è qualche admin che mi può aiutare?

  3. #3
    coolsoft non è connesso Utente giovane
    Data registrazione
    24-02-2005
    Messaggi
    36

    Predefinito

    Up ancora, io credo che sia un problema di diritti su SQLite..., qualche admin lo può verificare?

  4. #4
    coolsoft non è connesso Utente giovane
    Data registrazione
    24-02-2005
    Messaggi
    36

    Angry Ci riprovo!

    Io ci riprovo ancora (la pazienza è la virtù dei forti ).

    Da parte mia credo di aver fatto tutto il possibile:
    • ho spiegato il problema
    • ho fornito un esempio di codice con cui riprodurre il problema
    • ho indicato il risultato atteso e quello ottenuto


    Cause possibili:
    • problema di permessi
    • sqlite compilato senza supporto per VACUUM o per le transazioni
    • altro...


    C'è qualche admin che si fa il copia/incolla del mio codice di esempio, lo esegue e mi da una dritta?

    Resto in attesa....

  5. #5
    coolsoft non è connesso Utente giovane
    Data registrazione
    24-02-2005
    Messaggi
    36

    Angry Aiuto

    Chissà mai che qualcuno del supporto tecnico trovi 5 minuti per copiare/incollare il codice e provarlo... mah!
    E non ditemi che sono stato insistente... 5 mesi di attesa
    Citazione Originalmente inviato da coolsoft Visualizza messaggio
    Io ci riprovo ancora (la pazienza è la virtù dei forti ).

    Da parte mia credo di aver fatto tutto il possibile:
    • ho spiegato il problema
    • ho fornito un esempio di codice con cui riprodurre il problema
    • ho indicato il risultato atteso e quello ottenuto


    Cause possibili:
    • problema di permessi
    • sqlite compilato senza supporto per VACUUM o per le transazioni
    • altro...


    C'è qualche admin che si fa il copia/incolla del mio codice di esempio, lo esegue e mi da una dritta?

    Resto in attesa....
    Ultima modifica di coolsoft : 05-03-2010 alle ore 14.41.31

  6. #6
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Il problema è che su AV mi pare non sia supportato SQLite.

    PS
    L'assistenza (che AV da solo parzialmente) è sullo spazio non certo sui tuoi script!
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  7. #7
    coolsoft non è connesso Utente giovane
    Data registrazione
    24-02-2005
    Messaggi
    36

    Smile

    Citazione Originalmente inviato da binarysun Visualizza messaggio
    Il problema è che su AV mi pare non sia supportato SQLite.
    AV supporta SQLite v.3.3.9; tutto il mio sito su AV funziona con SQLite, e funziona bene, a parte ovviamente il non poter fare il VACUUM.

    Citazione Originalmente inviato da binarysun Visualizza messaggio
    L'assistenza (che AV da solo parzialmente) è sullo spazio non certo sui tuoi script!
    Io non voglio assistenza sul mio script, ci mancherebbe!
    Quello che ho postato è solo un proof-of-concept che evidenzia l'errore riscontrato su AV; lo script in se è corretto e non contiene errori. Infatti lo stesso script funziona perfettamente sia in locale sia su altri hosting.
    Per questo motivo credo si tratti di un problema di AV che solo un Admin o un tecnico di AV può provare a risolvere, o almeno ad indagare.

    Nel frattempo ho indagato ulteriormente ed ho visto che facendo creare i DB dal motore SQLite incluso nel PHP5 di AV, i file sono creati con uno UserID=49 invece che con l'ID dell'utente con cui gira PHP (nel mio caso 194xxx, ossia l'utente di AV)...
    Può essere una pista da seguire?

    PS: grazie comunque per la risposta... dopo 5 mesi di silenzio non ci speravo più.

  8. #8
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Sinceramente mi ero confuso con mySqli, ma cmq pensavo che anche SQLite non ci fosse.
    Non lo sapevo....

    Non conosco SQLite ma si sembra un problema di permessi sul file
    In particolare la documntazione dice
    The VACUUM command cleans the main database by copying its contents to a temporary database file and reloading the original database file from the copy. This eliminates free pages, aligns table data to be contiguous, and otherwise cleans up the database file structure.
    Quindi sembra creare una copia del file, magari non ha i permessi sulla cartella per creare il file temporaneo.
    Ci sarà sicuramente un impostazione della directory per i file temporanei
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  9. #9
    coolsoft non è connesso Utente giovane
    Data registrazione
    24-02-2005
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da binarysun Visualizza messaggio
    Ci sarà sicuramente un impostazione della directory per i file temporanei
    SQLite fa tutto internamente, non ha impostazioni per la TEMP diverse da quelle di PHP stesso.
    Ho esteso il mio script di test aggiungendo test di scrittura/cancellazione di file sia nella TEMP di PHP sia nella cartella locale.
    Codice PHP:
    <?php

    try {
    echo
    "<pre>";

    echo
    "Crea temp file in temp dir:\n";
    echo
    "Temp dir: ".sys_get_temp_dir()."\n";
    $file = tempnam(sys_get_temp_dir(), '');
    echo
    "Temp file: $file\n";
    echo
    "Scrittura nel file... ";
    file_put_contents($file, "prova");
    echo
    "OK\n";
    echo
    "Eliminazione file... ";
    unlink($file);
    echo
    "OK\n\n";

    echo
    "Crea temp file locale:\n";
    $dir = dirname(__FILE__);
    $file = tempnam($dir, '');
    echo
    "Temp file: $file\n";
    echo
    "Scrittura nel file... ";
    file_put_contents($file, "prova");
    echo
    "OK\n";
    echo
    "Eliminazione file... ";
    unlink($file);
    echo
    "OK\n\n";

    // apre DB
    echo "Apertura DB... ";
    $pdo = new PDO("sqlite:demo.s3db");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo
    "OK\n";

    // dati casuali
    echo "Inserimento dati...";
    $pdo->exec("DROP TABLE IF EXISTS 'test'");
    $pdo->exec("CREATE TABLE 'test' (key TEXT PRIMARY KEY)");
    $pdo->exec("INSERT INTO 'test' VALUES('00QN252SSR3S97S5SO91NQ5N2SQ5R716')");
    $pdo->exec("INSERT INTO 'test' VALUES('04736SP90PQQ0Q6O63Q77O0N2PP91363')");
    $pdo->exec("INSERT INTO 'test' VALUES('04O72P4S21161Q363N7R8N320Q85263Q')");
    $pdo->exec("INSERT INTO 'test' VALUES('04P5O0S17351132684Q99PN8N87N2QPP')");
    $pdo->exec("INSERT INTO 'test' VALUES('055S8826601465Q2QS4R9RQ8726O08SN')");
    echo
    "OK\n";

    echo
    "Cancellazione dati...";
    $pdo->exec("DELETE FROM 'test';");
    echo
    "OK\n\n";

    // pulizia
    echo "Vacuum... ";
    $pdo->exec('VACUUM');

    // fine
    echo "OK\n";

    } catch (
    Exception $e) {

    echo
    "ERROR\n".var_export($e, true);

    }

    echo
    "</pre>";

    ?>
    Funziona tutto, compresa la creazione del DB, e va in errore proprio all'esecuzione del comando VACUUM...

  10. #10
    Guest

    Lightbulb

    Ciao,
    Io sto creando un software per gestire SQLite (PHPMYAdmin-like),
    e con me il comando VACUUM funziona, non sono molto espeertyo, però.
    http://supernovasystem.altervista.org/PHPLiteAdmin
    http://supernovasystem.altervista.or...ndex.php?a=sql
    http://supernovasystem.altervista.or...e&query=VACUUM
    prova!!
    Il mio software è editato tutto in modo procedurale: ci capisco di p+!
    Ultima modifica di supernovasystem : 05-03-2010 alle ore 19.34.59

  11. #11
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Il fatto è che da quanto racconti il file SQL viene gestito da un servizio a parte che quindi girerà con un altro utente che potrebbe non avere accesso alla cartella TEMP.

    Cmq fai questa priva prima di tutto.
    Fai uno script che lancia SOLO il comando VACUUM e non altre query prima, ho un dubbio.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  12. #12
    coolsoft non è connesso Utente giovane
    Data registrazione
    24-02-2005
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da supernovasystem Visualizza messaggio
    Ciao,
    Io sto creando un software per gestire SQLite (PHPMYAdmin-like),
    e con me il comando VACUUM funziona
    Vorrei verificare che versione di SQLite stai usando: la 2.x (non PDO) oppure la 3.x (con i PDO di PHP).
    Ho provato ad eseguire la query
    Codice:
    SELECT SQLITE_VERSION()
    mi dice che l'ha eseguita correttamente ma non dà risultati.

    Per il mio progetto Drupal-SQLite, una versione di Drupal che funziona senza MySQL e con SQLite, io uso la versione 3 di SQLite, che è molto più performante ed usa i PDO di PHP.

  13. #13
    coolsoft non è connesso Utente giovane
    Data registrazione
    24-02-2005
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da binarysun Visualizza messaggio
    Fai uno script che lancia SOLO il comando VACUUM e non altre query prima, ho un dubbio.
    Fatto:
    Codice PHP:
    <?php

    try {
    echo
    "<pre>";

    $file = dirname(__FILE__).'/demo.s3db';

    // apre DB
    echo "Apertura DB...\n";
    echo
    "Size: ".filesize("$file")."\n";
    $pdo = new PDO("sqlite:$file");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // pulizia
    echo "Vacuum...\n";
    $pdo->exec('VACUUM');
    echo
    "Size: ".filesize("$file")."\n";

    // fine
    echo "OK\n";

    } catch (
    Exception $e) {
    echo
    "ERROR\n".var_export($e, true);
    }

    echo
    "</pre>";

    ?>
    Ho caricato anche un file demo.s3db da 5Mb: in locale dopo il VACUUM diventa 1Mb, su AV va in errore.

  14. #14
    Guest

    Predefinito

    NON LO SO!!!
    effettivamente il programma ha ancora bisogno di un sacco di modifiche, ci sto lavorando da mesi (1 persona(IO!!)) ma devo anche studiare...
    lo sto facendo perchè così non devo pagare per avere le query su MySQL.
    ogni tanto cambio la versione con quella migliorata in locale.
    scusa, ma devo andare.
    DEVE ESSERE ANCORA FINITO,
    se vuoi mi puoi dare una mano (anche) e io a te.
    aggiungo che faccio la 1° liceo = poco tempo
    ci avevo pensato anch'io a provare a mettere il supporto ad SQLite a Drupal & Joomla
    CiAo

Regole di scrittura

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