Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 40
  1. #1

    Aggiornare db da backup se più recente

    Salve a tutti,
    Ho un problema con l'aggiornamento dei dati in un database:
    Innanzitutto effettuo un backup del db e mi ritrovo con un file backup.sql con questo contenuto...
    N.b. I campi del db sono: id, nome, cognome, nato, nato_a, data_reg, qualifica

    codice:
    INSERT INTO TABELLA VALUES (1, 'Giuseppe', 'Vita', 370216800, 'Roma', 1097791200, 'esperto');
    INSERT INTO TABELLA VALUES (2, 'Armando', 'Vetriero', 498693600, 'Milano', 1097877600, 'alunno');
    INSERT INTO TABELLA VALUES (3, 'Federico', 'Castellucci', 312505200, 'Viterbo', 1097964000, 'esperto');
    Adesso dovrei aggiornare il db con questi dati ma tenendo conto che:
    1)L'id dovrà essere aggiornato all'id del db che sto aggiornando, cioè non dovrà essere più 1,2,3 ma (ipotizzando che abbia gia 230 schede nel db) dovrà essere ad esempio 231,232,233
    2)Se nel db che sto aggiornando ci sono già dei record che hanno stesso campo nome,cognome,nato (cioè è la stessa persona) e la data (campo data_reg) è maggiore rispetto alla data contenuta nel backup dovrei effettuare uno skip del record, cioè quella riga non deve essere inserita nel db poichè ce n'è già una più recente.

    Come posso fare?
    Grazie a tutti in anticipo.
    What is the |\/|atrix?

  2. #2
    in tal caso non hai altra scelta che fare uno script che legga il file ed effettui l'aggiornamento, record per record, dopo i controlli che desideri.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    Questo lo avevo intuito... mi potresti dare qualche suggerimento in più su come farlo?
    What is the |\/|atrix?

  4. #4
    la struttura dello script potrebbe essere questa:

    - effettua la connessione al database.
    - apre il file di backup in sola lettura
    - verifica l'ultimo inserimento fatto e memorizza l'id che è il più alto.
    - preleva un record alla volta dal file che sta leggendo e per ognuno:
    -- sostituisce il numero di id con quello effettivo.
    -- effettua una query per verificare che il record non fosse già presente in base ai parametri che hai indicato, se fosse positivo NON effettua l'inserimento, altrimenti si.
    - alla fine chiude la connessione e il file ed esce.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  5. #5
    Ho fatto un giretto nel db ed ho trovato una discussione che potrebbe aiutarmi: http://forum.html.it/forum/showthrea...hreadid=590719
    Ma vorrei sapere un paio di cose:
    Quando uso fopen() #i commenti scritti sul file# vengono calcolati?
    Qual è il giusto metodo per creare i "separatori" nel mio file?
    Grazie mille.
    What is the |\/|atrix?

  6. #6
    puoi saltare le righe con # scrivendo:

    if (ereg("^#", $riga)) continue;

    all'interno del ciclo di controllo dei record all'inizio.

    trattandosi di stringhe che sono esse stesse istruzioni SQL non hai bisogno dei separatori, ma ti basta farle eseguire con mysql_query(), ovviamente dopo che hai fatto i controlli e le sostituzioni che ti servono.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  7. #7
    Allora:
    Sto lavorando con questo script ma comincio ad avere i primi errori:
    codice:
    $file="backup.txt";
    $contenuto = file($file,'r') or die("Impossibile aprire il file in lettura!");
    foreach($contenuto as $key => $value) {
    	$elementi = explode('#', $value);
    	$numelem = count($elementi);
    	$i=0;
    	while($i++ < $numelem) {
            $elementi[$i] = "'" . mysql_escape_string($elementi[$i]) . "'";
    	}
    	$query = 'INSERT INTO TABELLA (nome,cognome,qualifica) VALUES(' . implode(',', $elementi) . ');
    ';
    	
            echo $query;
    }
    Nota bene questo è il contenuto del file "backup.txt":
    codice:
    Giuseppe#Nicolosi#Esperto
    Alberto#Marani#Alunno
    Dovrei avere questi risultati:
    codice:
    INSERT INTO TABELLA (nome,cognome,qualifica) VALUES('Giuseppe','Nicolosi','Esperto');
    INSERT INTO TABELLA (nome,cognome,qualifica) VALUES('Alberto','Marani','Alunno');
    Ma invece mi ritrovo questi risultati:
    codice:
    INSERT INTO TABELLA (nome,cognome,qualifica) VALUES(Giuseppe,'Nicolosi','Esperto\r\n','');
    INSERT INTO TABELLA (nome,cognome,qualifica) VALUES(Alberto,'Marani','Alunno','');
    Dove mi ritrovo nella prima riga un \r\n che non so da dove proviene e due '' che non dovrebbero esserci...
    Dov'è l'errore?
    What is the |\/|atrix?

  8. #8
    Ciao,
    io caricherei il backup in una tabella temporanea (veramente temporanea o una tabella normale che poi eliminerai) con mysqlimport, successivamente farei i controlli e gli aggiornamenti attraverso SQL.

    Prima effettui dei DELETE e UPDATE mirati attraverso un JOIN con la tabella temporanea,
    http://dev.mysql.com/doc/mysql/en/DELETE.html

    e poi i SELECT .... INSERT

    http://dev.mysql.com/doc/mysql/en/INSERT_SELECT.html

    In questo modo eviti la dispendiosa operazione di lettura record per record del file .sql attraverso PHP
    per favore NIENTE PVT TECNICI da sconosciuti

  9. #9
    a parte i suggerimenti di fabio dovresti quanto meno eliminare i caratteri di fine riga con:

    foreach($contenuto as $key => $value) {
    trim($value);
    $elementi = explode('#', $value);

    inoltre acmbierei il ciclo così:

    foreach($contenuto as $key => $value) {
    $elementi = explode('#', $value);
    $numelem = count($elementi);
    for($i=0; $i<$numelem; $i++) {
    $elementi[$i] = "'" . mysql_escape_string($elementi[$i]) . "'";
    }
    $query = 'INSERT INTO TABELLA (nome,cognome,qualifica) VALUES(' . implode(',', $elementi) . ');
    ';

    echo $query;
    }
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  10. #10
    così funziona alla perfezione! E' solo che ho sempre quel \r\n nall'ultimo campo:
    codice:
    INSERT INTO TABELLA (nome,cognome,qualifica) VALUES('Giuseppe','Nicolosi','Esperto\r\n');
    INSERT INTO TABELLA (nome,cognome,qualifica) VALUES('Alberto','Marani','Alunno\r\n');
    What is the |\/|atrix?

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.