Newsgroup: it.comp.www.php
Titolo: evitare record doppi

Sto realizzando una script che importa un file di testo per aggiornare un
db.
Il problema è che ki mi fornisce il file spesso duplica (...per sue
esigenze) delle rige.
Come posso evitare che in fase di import creo dei record doppi?


Specifico che ho lettole faq
http://php.dopoil.com/faq.php?doubleNames
//nel mio caso
select codice,count(*) as cnt from prodotti GROUP BY codice HAVING cnt>1;
ma non so come implementarlo in fase import

Come posso evitare che in fase di import creo dei record doppi?
Caricati i dati in un array ed utilizza la funzione array_unique:
http://www.php.net/manual/en/function.array-unique.php
hola
Buttha
-- 
No more antispam

il sapiente Vincenzo "TaTaC" Lavino dice:

crea la tabella con chiavi unique sui campi che identificano un record 
'univoco' (anche tutti).
quando importi, i record doppi verranno automaticamente scartati.
ciao
-- 
Punkarruso
mail:punkarruso(at)geniotradottoininglese(dot)it
pubblicità progresso:
http://www.gnu.org/software/reliability.html

 quando importi, i record doppi verranno automaticamente scartati.
scartati senza dare errore?
GRAZIE

> crea la tabella con chiavi unique sui campi che identificano un record

import.txt:
pippo   ciao
pippo   bau
pluto   miao
pippo   bau
pluto   ciao
mysql> create table pluto (campo1 char(10), campo2 char(10), 
unique(campo1,campo2));
Query OK, 0 rows affected (0.05 sec)
mysql>  load data infile '/home/import.txt' ignore into table pluto fields 
terminated by '\t' lines terminated by '\n';
Query OK, 4 rows affected (0.01 sec)
Records: 5  Deleted: 0  Skipped: 1  Warnings: 0
mysql> select * from pluto;
+--------+--------+
| campo1 | campo2 |
+--------+--------+
| pippo  | bau    |
| pippo  | ciao   |
| pluto  | ciao   |
| pluto  | miao   |
+--------+--------+
4 rows in set (0.00 sec)
l'importante è l'ignore che continua nonostante gli errori.
ciao
-- 
Punkarruso
mail:punkarruso(at)geniotradottoininglese(dot)it
pubblicità progresso:
http://www.gnu.org/gnu/manifesto.it.html

Ok grazie.
ho risolto, mi sei stato di vero aiuto.

 Records: 5  Deleted: 0  Skipped: 1  Warnings: 0
Ecco lo script che uso ma non funziona, dovrebbe inserire 189 (con i
duplicati 223) record invece si ferma a 139
if($fp = fopen("prova.txt", 'r')) {
        while ($riga=fgets($fp,4096)) {
         $campi = explode("$", $riga);
    $query = "INSERT INTO $tab_prod  (id_prod, id_marca, codice,
descrizione, id_cat, prezzo)
    VALUES (NULL, '$campi[2]', '$campi[3]', '$campi[4]', '$campi[1]',
'$campi[5]')";
    $link_id = db_connect($tab_prod);
    if(!$link_id) error_message(sql_error());
    $result = mysql_query($query);
    if (!$result) error_message(sql_error());
        }//fine while
       fclose($fp);
}

     if(!$link_id) error_message(sql_error());
Perche' riconnetti al DB (tra altro con il nome di una tabella)?
Tra altro, per scrupolo metterei una query prima per vedere se il 
valore gia' esiste. Cosi' hai un controllo in piu' per vedere cosa 
fa.
$rslt2=mysql_query("SELECT COUNT(*) FROM $tab_prod WHERE ".
                   "NonSoQualeEUnivoco=$campi[ancheQuelloNonso]")
       or die (mysql_error());
if (mysql_result($rslt2)!=0)
{
    echo "valore $campi[ancheQeulloNonso] gia' esistente\n";
    continue;
}
-- 
I'm not a signature.

 if (mysql_result($rslt2)!=0)
                         ^ manca ,0


 fa.
cut
Ho risolto cosi:
if($fp = fopen("prova.txt", 'r')) {
        while ($riga=fgets($fp,4096)) {
         $campi = explode("$", $riga);
    $query = "LOAD DATA LOCAL INFILE 'prova.txt' INTO TABLE
$default_dbname.$tab_prod FIELDS TERMINATED BY '$'
(id_cat,id_marca,codice,descrizione,prezzo)";
    $link_id = db_connect($tab_prod);
    if(!$link_id) error_message(sql_error());
    $result = mysql_query($query);
    if (!$result) error_message(sql_error());
        }//fine while
       fclose($fp);
}
adesso il file č in locale dopo arrivera da un modulo per l'upload

 adesso il file è in locale dopo arrivera da un modulo per l'upload

> OK, ma ancora questo db_connect? Cosa ti serve?
per connettermi....dici che lo devo levare?

 per connettermi....dici che lo devo levare?
Si, ti devi connettere, ma lo fai all'interno dello loop.
Lo dovresti spostare prima del loop (una volta basta se non
fai query ad altri database [non tabelle]).


OPSS, hai ragione un crtl+c, crtl+v troppo selvaggio :(
Grazie mille