Visualizzazione risultati 1 fino 23 di 23

Discussione: [PHP] Modificare una determinata linea di un file txt

  1. #1
    Guest

    Post [PHP] Modificare una determinata linea di un file txt

    Ciao a tutti, come dice il titolo, adesso che sto facendo un piccolo script ho bisogno di modificare una determinata linea di quest'ultimo (il database in txt).
    Com'è possibile fare tutto ciò?
    La struttura dovrebbe essere questa:
    Codice PHP:
    0|Ciaooo
    1
    |Bello
    1
    |Come
    0
    |Stai?
    0|Raccontami
    1
    |Tutto!!
    0|xD
    Ora in teoria, ad ogni linea corrisponde l'id di quest'ultimo.
    Quindi a me servirebbe anche quando vado ad aggiornarlo che l'id venga prelevato dalla linea (ossia la posizione).
    E' possibile tutto ciò con PHP? xD
    Ho scelto volutamente un db testuale perché con mysql lo so' fare! :D
    Grazie mille! ... ciao Davide! =)

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

    Predefinito

    Si che si può fare.
    Codice PHP:
    $db = file('db.txt'); // carica il file in array. -> array(0 => 0|ciaoo, 1 => bello, 2 => come ....)
    $trova = 1;

    foreach(
    $db as $i => $linea) { // $i ci indica in quale elemento dell'array siamo
    list($id, $valore) = explode('|', $linea);
    if(
    $id == $trova) {
    $db[$i] = $id . '|nuovo valore!';
    break;
    // ormai abbiamo trovato l'id, fermo il loop
    }
    }

    file_put_contents('db.txt', implode('', $db)); // aggiorno il database
    La funzione file, carica il file e lo separa in base ai ritorni a capo.
    Ultima modifica di javascripter : 15-06-2010 alle ore 11.25.19

  3. #3
    Guest

    Predefinito

    Ho modificato il tuo script, per adattarlo a quello che voglio fare io.
    Ma in alcuni casi non funziona sempre, ad esempio se è 1 lo passa a 0 ma viceversa non funziona! =(
    Codice PHP:
    <?
    $db
    = file("todo.txt");
    $trova = $_GET["id"];

    foreach(
    $db as $i => $linea) {
    list(
    $id, $valore) = explode("|",$linea);

    if(
    $id == $trova) {
    $id = ($id == "0") ? "1" : "0";

    $db[$i] = "{$id}|{$valore}";
    break;
    }
    }

    file_put_contents("todo.txt",implode("", $db));
    header("Location: index.php");
    ?>
    Ultima modifica di sIM : 15-06-2010 alle ore 14.47.05

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

    Predefinito

    Prova così:
    Codice PHP:
    <?php
    $db
    = file("todo.txt");
    $trova = is_numeric($_GET["id"]) ? $_GET["id"] : -1; // '' == 0 restituisce true, se $_GET['id'] non è definito vale ''

    foreach($db as $i => $linea) {
    list(
    $id, $valore) = sscanf($linea, "%d|%s");

    if(
    $id == $trova) {
    $id = $id == 0 ? 1 : 0;
    $db[$i] = "{$id}|{$valore}\n"; // il ritorno al capo serve, altrimenti vedi cosa succede nel txt!
    break; // se vuoi invertire tutti gli id, rimuovi questa linea!
    }
    }

    file_put_contents("todo.txt",implode("", $db));
    header("Location: index.php");
    ?>
    Io l'ho provato e funziona.

  5. #5
    Guest

    Predefinito

    Non funziona... funziona solo quando l'ID è 0 =(
    Codice PHP:
    if($fr[0] == "0") { $input = "<input type=\"checkbox\" onClick=\"location.href='mod.php?id={$ln}';\" value=\"0\" />"; }
    else {
    $input = "<input type=\"checkbox\" onClick=\"location.href='mod.php?id={$ln}';\" value=\"1\" checked=\"checked\" />"; }
    Codice PHP:
    <?php
    $db
    = file("todo.txt");
    $trova = is_numeric($_GET["id"]) ? $_GET["id"] : -1; // '' == 0 restituisce true, se $_GET['id'] non è definito vale ''

    foreach($db as $i => $linea) {
    list(
    $id, $valore) = sscanf($linea, "%d|%s");

    if(
    $id == $trova) {
    $nd = ($id == "0") ? "1" : "0";
    $db[$i] = "{$nd}|{$valore}\n"; // il ritorno al capo serve, altrimenti vedi cosa succede nel txt!
    break; // se vuoi invertire tutti gli id, rimuovi questa linea!
    }
    }

    file_put_contents("todo.txt",implode("", $db));
    header("Location: index.php");
    ?>
    Comunque lo 0 o 1 sono stringhe non numeri... quindi perché li metti come numeri? xD

  6. #6
    Guest

    Predefinito

    perché tanto il php li trasforma in numeri, mica é stupido il php

  7. #7
    Guest

    Predefinito

    Lo sapevo già -.-" Era solo una delucidazione a livello di scrittura del codice! -.-"
    Comunque... il problema persiste! =(

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

    Predefinito

    Li metto come numeri perchè uso:
    Codice PHP:
    sscanf($linea, "%d|%s");
    Questa funzione imposta il corretto alle variabli!

    Se provi ad effettuare var_dump($id) stampa int($id) quindi è un numero e non una stringa ;)!
    Comunque non fa differenza dato che per php 0 == '0' è una condizione vera.

  9. #9
    Guest

    Predefinito

    Ok ma comunque il problema persiste sempre.
    In pratica non si aggiorna niente! O.O
    Codice PHP:
    <?php
    $db
    = file("todo.txt");
    $trova = $_GET["id"];

    foreach(
    $db as $i => $frase) {
    # list($id, $valore) = sscanf($linea, "%d|%s");

    if($id == $trova) {
    $id = ($id == "0") ? "1" : "0";
    $db[$i] = "{$id}|{$frase}\n";
    break;
    }
    }

    file_put_contents("todo.txt",implode("", $db));
    header("Location: index.php");
    ?>
    Potrebbe essere in file_put_contents l'errore?
    Perchè inserisci l'implode?

    Edit: E' la logica sbagliata... lo stato (1 o 0) e l'id (la linea del file) devono essere separati.
    Deve essere aggiornato lo stato, non l'id xD
    Codice PHP:
    <?php
    $db
    = file("todo.txt");
    $trova = $_GET["id"];

    foreach(
    $db as $i=>$linea) {
    # list($id, $valore) = sscanf($linea, "%d|%s");

    if($id == $trova) {
    $ex = explode("|",$linea);
    $st = ($ex[0] == "0") ? "1" : "0";
    $db[$i] = "{$st}|{$ex[1]}\n";
    break;
    }
    }

    file_put_contents("todo.txt",$db);
    header("Location: index.php");
    ?>
    Ho provato così ma continua a rimanere a 0 se lo è viceversa rimane 1... O.O
    Ultima modifica di sIM : 15-06-2010 alle ore 22.45.11

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

    Predefinito

    Non penso che sia file_put_contents l'errore. Implode la uso per unire l'array altrimenti nel file salverai "array()"!

    Poi nella condizione:
    Codice PHP:
    if($id == $trova) {
    $id non è definito, dato che hai rimosso list($id, $valore) ....

    -
    Sono io che non capisco come vuoi fare?
    Secondo quello che ho capito: http://mycarlo.altervista.org/tmp/test.php (vedi passagli un id via get e noti che cambia il contenuto!)
    Se è così il codice è:
    Codice PHP:
    <?php
    error_reporting
    (E_ALL);

    $db = file('test.txt');
    $trova = isset($_GET['id']) ? (int) $_GET['id'] : -1;

    foreach(
    $db as $i => $linea) {
    list(
    $id, $valore) = sscanf($linea, '%d|%s');

    if(
    $trova === $id) {
    $id = ($id === 0) ? 1 : 0;
    $db[$i] = $id . '|' . $valore . PHP_EOL;
    break;
    }
    }

    file_put_contents('test.txt', implode('', $db));
    ?>
    (per una volta prova ad copiarlo ed incollarlo direttamente, senza modificarlo :P)
    Ultima modifica di javascripter : 16-06-2010 alle ore 08.50.53

  11. #11
    Guest

    Predefinito

    ma col tuo codice si modifica solo la prima linea, se ho capito lui vuole che si modfichino tutte

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

    Predefinito

    Non modifica sola la prima linea, modifica la linea dove l'id è uguale a quello passato via get!

    Se vuole modicarle tutte, basta rimuovere break dal loop...

  13. #13
    Guest

    Predefinito

    Allora il tuo non funziona nemmeno perché se io metto id=0, lo stato rimane sempre 1 e non diventa 0.
    Io voglio che passato un id via $_GET, se è 0 diventa 1, e se è 1 diventa 0.
    Semplice xD Quello tuo non funziona così... va per i fatti suoi! O.O

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

    Predefinito

    Ti spiego cosa fa il mio script:

    file txt
    Codice:
    0|Ciaooo
    1|Bello
    1|Come
    0|Stai?
    0|Raccontami
    1|Tutto!!
    0|xD
    passo id=0 allo script, e il file diventa:
    Codice:
    1|Ciaooo
    1|Bello
    1|Come
    0|Stai?
    0|Raccontami
    1|Tutto!!
    0|xD
    E così via, se passi sempre id=0 modifcherà 0|Stai? in 1|Stai? !!

  15. #15
    Guest

    Predefinito

    http://mycarlo.altervista.org/tmp/test.php?id=0 prova... e vedi che è sempre 1!
    Cambia l'ID dell'url, sempre 1 rimane! O.O

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

    Predefinito

    Io ho messo 1 ed è diventato 0! (ti consiglio di provartelo su un file a parte in modo che nessuno posso accederci, altrimenti si crea un disordine...)

  17. #17
    Guest

    Predefinito

    a me il suo funziona

  18. #18
    Guest

    Predefinito

    A me non funziona! o.O Com'è possibile?
    Sul tuo sito e in locale, cambiando l'ID via $_GET rimane sempre 0 o 1 O.O

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

    Predefinito

    Ma dici davvero?
    http://mycarlo.altervista.org/tmp/test.php?id=0, non mi dire che se vai lì l'id della prima linea non diventa 1! (prego gli altri utenti di non visitare quel link)

  20. #20
    Guest

    Predefinito

    Il primo funziona... e tutti gli altri? o.O
    Prova a mettere 1 o 2 e vedi se cambia... a me non cambia un tubo! .-.

    Edit: Prova a fare un print_r a $db[$i] e vedrai che funziona solo quando l'ID è 1 o 0, mettendo 2 non funziona più!
    Ri-Edit: Adesso funziona, solo che si deve stabilire se la linea (indice array) esiste...
    Codice PHP:
    <?php
    error_reporting
    (E_ALL);

    $nomefile = "todo.txt";

    $db = file($nomefile);
    $id = $_GET["id"];

    if(
    array_key_exists($id,$db) == TRUE) {
    $ex = explode("|",$db[$id]);
    $ex[0] = ($ex[0] == "0") ? "1" : "0";

    $db[$id] = "{$ex[0]}|{$ex[1]}";

    file_put_contents($nomefile, implode('',$db));

    header("Location: index.php");
    }
    else { echo
    "{$id} non esiste!"; }
    ?>
    Ri-Ri-Edit: Questo problema è risolto, ora come cancello la linea e risalgo tutte di -1 qualora non è né la prima né l'ultima? Sennò rimangono degli ID vuoti! O.O
    Ultima modifica di sIM : 16-06-2010 alle ore 13.44.26

  21. #21
    Guest

    Predefinito

    non devi mettere 1 o 2, devi continuare a mettere 0 e fare refresh

  22. #22
    Guest

    Predefinito

    Ma io devo cambiare solo quello dell'ID non tutti! O.O
    Comunque la modifica è ok, ora il problema è togliere la riga! xD

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

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    Il primo funziona... e tutti gli altri? o.O
    Prova a mettere 1 o 2 e vedi se cambia... a me non cambia un tubo! .-.

    Edit: Prova a fare un print_r a $db[$i] e vedrai che funziona solo quando l'ID è 1 o 0, mettendo 2 non funziona più!
    Ri-Edit: Adesso funziona, solo che si deve stabilire se la linea (indice array) esiste...
    Codice PHP:
    <?php
    error_reporting
    (E_ALL);

    $nomefile = "todo.txt";

    $db = file($nomefile);
    $id = $_GET["id"];

    if(
    array_key_exists($id,$db) == TRUE) {
    $ex = explode("|",$db[$id]);
    $ex[0] = ($ex[0] == "0") ? "1" : "0";

    $db[$id] = "{$ex[0]}|{$ex[1]}";

    file_put_contents($nomefile, implode('',$db));

    header("Location: index.php");
    }
    else { echo
    "{$id} non esiste!"; }
    ?>
    Ri-Ri-Edit: Questo problema è risolto, ora come cancello la linea e risalgo tutte di -1 qualora non è né la prima né l'ultima? Sennò rimangono degli ID vuoti! O.O
    Scusa ma io per ID intendevo: id|valore; mentre tu per id intendi l'indice dell'array...

    Per togliere la riga puoi usare semplicemente unset

Regole di scrittura

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