Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    problemi di lettura/scrittura sui file

    Salve,
    Sono qui ad esporre un problema che proprio non riesco a risolvere, allora devo fare uno script che gestisca praticamente le entrate e uscite di un'azienda, ho la nessita che esso giri su web ma che NON utilizzi MySQL o altri tipi di dbms per cui l'unica opzione rimane l'utilizzo dei file, iniziando lo script (visto che sulla rete dopo svariati giorni di ricerca non ho praticamente trovato nulla, nemmeno uno script da adattare ) mi sono subito accorto che non e' cosi facile come sembrava (sarebbe molto + semplice gestire il tutto con mysql, ma aime non posso) infatti mi sono dovuto fermare dopo poche righe di codice perchè non riesco proprio a trovare un metodo per scrivere su UNA SOLA riga del file di testo da me creato come database per i dati, questo è il codice php completo che potete eseguire per testare il problema :
    Codice PHP:
    $filename "archivio.txt";
    if (
    file_exists($filename)) { 
        echo 
    "
    il file 
    $filename esiste"
        
    // conta quante righe ha il file solo per infomazioni
        
    echo "
    ha : "
    .count(file($filename))." linee";
        
    // imposta la lingua italiana per la formattazione della data
        
    setlocale (LC_TIME"it","it_it","it_IT","it_it@euro","ita","ita_ita","italiano");
        
    // visualizza la data in formato timestamp dell'ultimo accesso al file
        
    echo "
    la data dell'ultimo accesso al file è : " 
    strftime("%A %d %B %Y, %H.%M.%S "fileatime($filename));
        
    // lettura del contenuto di una determinata linea del file utilizzando la funzione personale LeggiRiga
        
    $row LeggiRiga($filename3);
        echo 
    "
    le linea 3 contiene : "
    .$row." del file ".$filename;
        
    // divide i campi della linea precedentemente letta
        
    $content_fields explode("|"$row);
        
    // conta il numero di campi della linea precedentemente letta (non serve poiche il numero dei campi è sempre lo stesso, ma tornare utile per eseguire un controllo proprio per stabilire che il numero dei campi siano sempre gli stessi)
        
    $tot_num_row =count($content_fields);
        if (
    $tot_num_row != 6) {
            echo 
    "
    ATTENZIONE UNA DELLE LINEE NON CONTIENE GLI STESSI CAMPI ("
    .$tot_num_row.") DELLE ALTRE LINEE, L'ARCHIVIO POTREBBE ESSERE CORROTTO";
        } else {
            echo 
    "
    le linea 3 contiene : "
    .$tot_num_row." campi ";
        }
        
    // i nomi dei campi sono contenuti in  un array
        
    $name_fields = array('DATA''CLIENTE''OPERAZIONE''TIPO''DESCRIZIONE''IMPORTO');
        
    // cicla gli array $name_fields e $content_fields per visualizzare i nomi dei campi e il rispettivo contenuto associatogli
        
    for ($i 0$i $tot_num_row$i++) {
            echo 
    "
    il campo : "
    .$name_fields[$i]." della linea 3 contiene : ".$content_fields[$i];
        }

        
    //
        //.....elaborazione dei dati e reincapsulamento in un array per la scrittura
        //

        // unisce i campi in una sola linea dividendoli con il segno | (incapsulamento)
        
    $write_content_fields implode("|"$content_fields);
        
    // scrittura del contenuto di una variabile su una determinata linea di un file utilizzando la funzione personale ScriviRiga
        
    $writed_row ScriviRiga('test.txt'3$write_content_fields);
        echo 
    "
    le linea 3 del file "
    .$filename." è stata modificata, ora contiene : ".$writed_row;
    } else { 
        echo 
    "
    Il file 
    $filename non esiste"
        
    // crea il nuovo file di testo vuoto
        
    touch($filename);


    // *****LISTA DELLE FUNZIONI PERSONALIZZATE******

    /* uso : LeggiRiga(nome_del_file, numero_linea_da_leggere) */
    function LeggiRiga($file_name$line_num) {
        
    $fn fopen($file_name,"r");
        
    $line_cnt 1;
        while (
    $line fgets($fnfilesize($file_name))) {
            if (
    $line_cnt == $line_num) {
                return 
    $line;
            }
            
    $line_cnt++;
        }
    }

    /* uso : ScriviRiga(nome_del_file, numero_linea_da_scrivere, contenuto_da_scrivere) */
    function ScriviRiga($file_name$line_num$content) {
        
    $fn fopen($file_name,"w");
        
    fseek($fn23);
        
    fwrite($fn$content);
        echo 
    "
    TEST FUNZIONE 
    $content DA SCRIVERE"
    }
    ?> 
    mentre questo e' il file di testo con alcuni dati per i test :
    codice:
    05-09-2007|Mario Rossi|USCITA|TIPO|descrizione|importo
    05-09-2007|Giulio Cesare|ENTRATA|TIPO|descrizione|importo
    05-09-2007|Paolo Bianchi|ENTRATA|TIPO|descrizione|importo
    05-09-2007|Luisa Neri|USCITA|TIPO|descrizione|importo
    05-09-2007|Giulio Cesare|ENTRATA|TIPO|descrizione|importo
    05-09-2007|Marco Rossi|ENTRATA|TIPO|descrizione|importo
    RINGRAZIO IN ANTICIPO TUTTI COLORO CHE MI DARANNO UNA MANO ALLA RISOLUZIONE DEL PROBLEMA
    Falc©NET
    __________________
    http://falco.ilbello.com - Il Mio Sito Personale
    http://bandalarga.ilbello.com - Monitoraggio Della Banda Larga Italiana

  2. #2
    nessuno dei "cervelloni" di questa sezione ha la soluzione ?
    ..e allora se dovessi (cosa molto improbabile) arrivare alla soluzione da solo sarei un "genio"
    Falc©NET
    __________________
    http://falco.ilbello.com - Il Mio Sito Personale
    http://bandalarga.ilbello.com - Monitoraggio Della Banda Larga Italiana

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    58
    Ciao, non so se ti può essere utile, cmq io lo uso per modificare ogni campo di ogni singola riga.
    Ammesso che tu inserisca i dati attraverso un form, io faccio così:
    - file per visualizzare tutte le righe:

    Codice PHP:
    <table width="90%" border="1" cellspacing="0" cellpadding="1" align="center">
                  
                  <tr bgcolor="#00477d"> 
                    <td height="20" colspan="5" valign="top"><div align="center" class="Stile2 Stile3">[b]Elenco Allievi [/b]</div></td>
                  </tr>
                  <tr> 
                     <td width="34" height="22" valign="top"><span class="Stile2">ID</span></td>
                     <td width="94"valign="top"><span class="Stile2">Codice allievo</span></td>
                     <td width="229"valign="top"><span class="Stile2">Nome</span></td>
                     <td width="164" valign="top"><span class="Stile2">Cognome</span></td>
                     <td width="78" valign="top"><span class="Stile2">Gestione</span></td>
                  </tr>
                  <tr>
    <td height="22" valign="top"><span class="Stile2">
    <?php
    $contatore 
    0;
    $textfile fopen("archivio.txt""r");
    while (
    $rigafile fgets($textfile,1024)) {
    $campiriga explode("|"$rigafile);
    echo 
    "<tr><td>$campiriga[0]</td><td>$campiriga[3]</td><td>$campiriga[4]</td><td>$campiriga[5]</td><td><a href=\"modifica_riga.php?id=$campiriga[0]\">Mod</a> | <a href=\"cancella_riga.php?id=$campiriga[0]\">Canc</a></td></tr>";
    }

    fclose($textfile);
    ?>
    </span></td>
                  <td></td>
                  <td></td>
                  <td></td>
                  <td></td>
                  </tr>
                </table>
    - file "modifica_riga.php"

    questo è il codice php, poi sempre nella stessa pagina creati un form con
    <form method="post" action="aggiorna_riga.php ">
    ed in ogni input value inserisci una cosa come questa:
    Codice PHP:
    <?=$cid?>
    per richiamare e stampare la variabile settata all'inizio del file nel codice php.

    Codice PHP:
    <?php
    $id 
    $_GET["id"];
    $textfile fopen("archivio.txt""r");

    while ( 
    $rigafile fgets($textfile,1024)) {
     
    $campiriga explode("|"$rigafile);
     
    $idriga $campiriga[0];

     if (
    $idriga == $id) {
    $cid $campiriga[0];
    $ccorso $campiriga[1];
    $csede $campiriga[2];
    $ccodice_allievo $campiriga[3];
    $cnome $campiriga[4];
    $ccognome $campiriga[5];
    $canno_nascita $campiriga[6];
    $cresidenza $campiriga[7];
    $ctitolo_studio $campiriga[8];
    $cdiploma_agg $campiriga[9];
    $cesperienze $campiriga[10];
    $cesperienze_ok EREG_REPLACE("#","\n",$cesperienze);
     }

    }
    fclose($textfile);
    ?>
    - file "aggiorna_riga.php"

    Codice PHP:
    <?php
    $id 
    $_POST["id"];
    $textfile fopen("archivio.txt""r");
    $textfile_new fopen("archivio_new.txt""a");
     while (
    $rigafile fgets($textfile,1024)) {
     
    $campiriga explode("|"$rigafile);
     
    $idriga $campiriga[0];
     if (
    $idriga == $id) {
    $ccorso $_POST["corso"];
    $csede $_POST["sede"];
    $ccodice_allievo $_POST["codice_allievo"];
    $cnome $_POST["nome"];
    $ccognome $_POST["cognome"];
    $canno_nascita $_POST["anno_nascita"];
    $cresidenza $_POST["residenza"];
    $ctitolo_studio $_POST["titolo_studio"];
    $cdiploma_agg $_POST["diploma_agg"];
    $cesperienze $_POST["esperienze"];
    $cesperienze_ok str_replace("\r\n","#",$cesperienze);

    $nuovariga "$idriga|$ccorso|$csede|$ccodice_allievo|$cnome|$ccognome|$canno_nascita|$cresidenza|$ctitolo_studio|$cdiploma_agg|$cesperienze_ok|\n";

      
    fwrite($textfile_new$nuovariga);
     } else {
      
    fwrite($textfile_new$rigafile);
     }
    }
    fclose($textfile);
    fclose($textfile_new);
    unlink("archivio.txt");
    rename("archivio_new.txt","archivio.txt");

    ?>
    - infine, file "cancella_riga"

    Codice PHP:
    <?php
    $utente 
    $_GET["id"];
    $textfile fopen("archivio.txt""r");
    $textfile_new fopen("archivio_new.txt""a");
     while (
    $rigafile fgets($textfile,1024)) {
     
    $campiriga explode("|"$rigafile);
     
    $idriga $campiriga[0];
     if (
    $idriga <> $utente) {
      
    fwrite($textfile_new$rigafile);
     }
    }
    fclose($textfile);
    fclose($textfile_new);
    unlink("archivio.txt");
    rename("archivio_new.txt","archivio.txt");

    ?>
    Ovviamente, adattalo al tuo file txt, cambiando nome dove serve e metti campi che desideri.
    ciao, cicileu

  4. #4
    grazie per il tutto ma non e' specificatamente quello che cerco o meglio "eludere" il sistema creando un nuovo file per poi rinominarlo non e' certamente "professionale" a questo punto, sarebbe meglio l'opzione (come la chiamo io) "a blocchi"" cioe :

    1) leggere tutto l'archivio in un array (chiamandolo blocco1)
    2) leggere la riga interessata in un secondo array (chiamandolo blocco2)
    3) leggere il rimanente dell'archivio in un'altro array (chiamandolo blocco3)
    4) manipolazione dei dati delll'array del blocco2 e relativo reincapsulamento nell'array
    5) riscrittura sull'archivio con l'opzione 'w' che distrugge tutto l'archivio scrivendo i nuovi dati (blocco1)
    6) riscrittura sull'archivio con l'opzione append dell'array con la riga modificata (blocco2)
    7) riscrittura seull'archivio sempre con l'opzione append del terzo bloco (blocco3)

    anche questo e' solo un espediente, io cerco "qualcosa" di preciso :
    1) lettura della riga da modificare (questa soluzione lo gia trovata)
    2) modifica dei dati e reincapsulamento nell'array per la scrittura (soluzione gia trovata)
    3) scrittura sulla determinata riga del file di testo (QUESTO E' IL REALE PROBLEMA, COSA A ME OSCURA CON LE FUNZIONI DI PHP)

    grazie ugualmente e se qualcun'altro ha capito e trovato la soluzione mi faccia un colpo
    Falc©NET
    __________________
    http://falco.ilbello.com - Il Mio Sito Personale
    http://bandalarga.ilbello.com - Monitoraggio Della Banda Larga Italiana

  5. #5
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    supponiamo che il file sia strutturato così:

    05-05-2007|antonio|30|Milano
    05-05-2007|pippo|80|Milano
    05-05-2007|demetrio|11|Milano
    05-05-2007|ubaldo|69|Milano
    05-05-2007|ugo|18|Milano



    e che tu abbia un file di riferimento 'fields_utenti.txt'dove dichiari i campi della tabella (se non ce l'hai ti conviene farlo)

    data
    utente
    eta
    citta


    Codice PHP:

    <?php

    if (RefreshLine("utenti","eta","69","35","nome = ubaldo") == 1)
    {
    echo 
    "modifica eseguita</br>";
    }
    else
    {
    echo 
    "errore!!</br>";
    }




    function 
    RefreshLine($table,$field,$old,$new,,$cla)  // vecchio valore, nuovo valore,campo, il riferimento (in mysql la clusula WHERE)
      
    {
      
    $fields=array();
      
    $archivio=file("$table.txt");
      
    $table_fields=file("fields_$table.txt");
      foreach (
    $table_fields as $key=>$name_field$table_fields[$key]=trim($name_field);


      
    // elaboro la clusula
      
    list($cla_field,$cla_value)=explode("=",$cla); // cla_field è il campo di condizione, cla_value è la variabile di confronto
      // end elaboro la clusula
        
      
    foreach ($archivio as $pos=>$line)
        {
        
    $vars_line=explode("|",$line);
        foreach (
    $vars_line as $key=>$val
          {
          
    $fields[$table_fields[$key]]=trim($val);      
          }
        if (
    $fields[$field] == trim($old) && $fields[trim($cla_field)] == trim($cla_value))
            {
            
    $fields[$field] = trim($new); // riassegno il nuovo valore
            
    $archivio[$pos]=implode("|",$fields)."\n"// creo la linea
            
    unlink ("$table.txt","w"); //cancello la tabella
            
    $link_tab=fopen("$table.txt","a+"); //ricreo la tabella
            
    foreach ($archivio as $new_linefwrite($link_tab,$new_line);
            
    fclose($link_db);
            return 
    1// ok eseguito
            
    }
        }
      return 
    0// non trovato
      
    }


    ?>
    prova, non l' ho testa quindi potrebbero esserci errori di sintassi ca il concetto è corretto

    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  6. #6
    allora... inanzitutto complimenti per lo script fatto fin troppo bene
    ci sono svariati errori :
    1) qui ce una virgola di troppo non ti pare ?
    Codice PHP:
    function RefreshLine($table,$field,$old,$new,,$cla)  // vecchio valore, nuovo valore,campo, il riferimento (in mysql la clusula WHERE) 
    2) cosi' com'e' la condizione non si verificherà mai poichè non esiste nessun campo nella matrice $fields[trim($cla_field)] con il nome di 'nome' (valore di $cla_field)
    Codice PHP:
        if ($fields[$field] == trim($old) && $fields[trim($cla_field)] == trim($cla_value)) 
    per ovviare al problema bisogna cambiare questa riga :
    Codice PHP:
    if (RefreshLine("utenti","eta","69","35","nome = ubaldo") == 1
    con quest'altra
    Codice PHP:
    if (RefreshLine("utenti","eta","69","35","utente = ubaldo") == 1
    3) errato utilizzo di unlink per distruggere il file, non esiste a quanto mi risulta il parametro ,"w"
    Codice PHP:
           unlink ("$table.txt"); //cancello la tabella 
    4) e infine l'ultima "svista" sulla chiusura del file, infatti fclose mira a chiudere un file mai aperto :

    Codice PHP:
    fclose($link_db); 
    la variabile corretta da impostare è $link_tab
    Codice PHP:
    close($link_tab); 
    ti rinnovo i miei complimenti, per l'ottima fattura, anche se non lo utilizzerò (penso) perchè come ribadito in precedenza "miro" alla sostituzione (anche dell'intera riga se necessario) ma senza mai distruggere il file con un semplice update della riga, il lavoro da te svolto e' un ottimo espediente che si puo sostituire benissimamente a chi non ha accesso a un dbmsl visto che con le clausole lavora in tutti i campi
    Falc©NET
    __________________
    http://falco.ilbello.com - Il Mio Sito Personale
    http://bandalarga.ilbello.com - Monitoraggio Della Banda Larga Italiana

  7. #7
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    ottima analisi

    alcuni errori "gnocchi" (tipo unlink con parametro "w" ) sono dei copia/incolla fatti in fretta e furia.. sono al lavoro ma l'idea della funzione mi piaceva e ho fatto presto :P

    ma questo codice ancora una volta lo puoi sfruttare cambiando semplicemente poche righe di codice
    e cioè

    Codice PHP:
        if ($fields[$field] == trim($old) && $fields[trim($cla_field)] == trim($cla_value))
            {
            
    $fields[$field] = trim($new); // riassegno il nuovo valore
            
    $archivio[$pos]=implode("|",$fields)."\n"// creo la linea
            
    unlink ("$table.txt","w"); //cancello la tabella
            
    $link_tab=fopen("$table.txt","a+"); //ricreo la tabella
            
    foreach ($archivio as $new_linefwrite($link_tab,$new_line);
            
    fclose($link_db);
            return 
    1// ok eseguito
            

    con questo
    (premetto che arreyzzi le linee del db originale con $archivio=file("$table.txt"); e puoi utilizzare il puntatore dell' array anche per sapere il num di linea (una dorta di ID )




    Codice PHP:
        if ($fields[$field] == trim($old) && $fields[trim($cla_field)] == trim($cla_value))
            {
            
    $fields[$field] = trim($new); // riassegno il nuovo valore
            
    $new_line=implode("|",$fields); // creo la linea

            
    $link_tab=fopen("$table.txt","a+"); //riapro la tabella
            
    $line_find=($pos-1)*1024;
            
    fseek($link_tab,$line_find);
            
    fwrite($link_tab,$new_line);
            
    fclose ($link_tab);
            return 
    1// ok eseguito
            

    ovviamente la storia della candizione sui campi è stata una svista anche quella importante è mantenere la stretta relazione tra tabella campi e tabella dati

    prova così per quanto riguarda l' aggiornamento della tabella.. nn l' ho provata ma lo farò tra un' oretta
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.