Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/MySQL/TXT] Rekordy z TXT do DB - jak wykluczyć duplikat?
Forum PHP.pl > Forum > Przedszkole
Barczi
Witam.

Mam sobie otóż następujący kod...
  1. <?php
  2. $file = file_get_contents('cds.txt');
  3. $lines = explode("\n", $file);
  4. foreach($lines as $line) {
  5. mysql_query ("INSERT INTO `plyty` SET `name`='$line';");
  6. }
  7. ?>

Oczywiście połączenie z bazą jest, a problem mój jest następujący:
Czy istnieje możliwość (poza unique_key) aby dodawane rekordy nie mogły się powtórzyć? Spytacie zapewne dlaczego tak, więc już odpowiem tam mam spis płyt więc musi to tak wyglądać..

Z góry dziękuję za odpowiedź.
Cienki1980
Jeżeli jesteś pewny że nazwy płyt są zawsze takie same .. czyli :
Kod
plyta1
plyta2
plyta3
plyta1

a nie np tak:
Kod
plyta1
plyta2
plyta3
plyta 1

to możesz wykorzystać array_unique().
Możesz też przed insertem wykonywać select i jeżeli jest rekord to nie wykonywać inserta ... albo nie wykorzystując do tego bazy , dodawać każdy dodany wpis do tablicy i przed dodaniem następnego sprawdzasz czy już jest w tej tablicy ( in_array() ). Jeżeli jest to nie dodajesz, jeżeli nie ma to dodajesz.
Barczi
Czaruję już prawie 20 minut i nic w sumie nie wyczarowałem..
Co do powtarzania to tak jestem pewny bo i w DB i TXT mam te same (znaczy odwrotnie, bo wgrywam do db z txt)...
Cienki1980
Cytat(Barczi @ 1.04.2008, 21:13:42 ) *
Czaruję już prawie 20 minut i nic w sumie nie wyczarowałem..
Co do powtarzania to tak jestem pewny bo i w DB i TXT mam te same (znaczy odwrotnie, bo wgrywam do db z txt)...

To pokaż jak czarujesz ... napisz jaki sposób wybrałeś z tych co podałem ... albo może trafił Ci się jakiś inny. Podaj kawałek kodu .. i napisz co się dzieje.
Barczi
  1. <?php
  2. $unique=array_unique(mysql_fetch_array(mysql_query("SELECT `name` FROM plyty")));
  3.  
  4. $file = in_array($unique, file_get_contents('cds.txt'));
  5. ?>

Reszta jak 1 post. Co się dzieje? Nie wiele, wali errorami...

Warning: in_array() [function.in-array]: Wrong datatype for second argument in /var/www/sites/yoyo.pl/b/a/barczi1/update.lista.php on line 8

Raczej raczkuję w PHP, więc nie za bardzo wiem co począć... tongue.gif
Cienki1980
Cytat(Barczi @ 1.04.2008, 22:17:57 ) *
  1. <?php
  2. $unique=array_unique(mysql_fetch_array(mysql_query("SELECT `name` FROM plyty")));
  3.  
  4. $file = in_array($unique, file_get_contents('cds.txt'));
  5. ?>

Reszta jak 1 post. Co się dzieje? Nie wiele, wali errorami...

Warning: in_array() [function.in-array]: Wrong datatype for second argument in /var/www/sites/yoyo.pl/b/a/barczi1/update.lista.php on line 8

Raczej raczkuję w PHP, więc nie za bardzo wiem co począć... tongue.gif

Przy tym co tutaj zrobiłeś to pomogą tylko czary jakiegoś szamana z puszczy Amazońskiej biggrin.gif

Przykład co zrobić ... tylko przykład a nie gotowiec:
Wykorzystujemy array_unique();
  1. <?php
  2. //odczytujemy plik tekstowy za pomoca file()
  3. $plik=file('nazwa_pliku.txt');
  4.  
  5. //zakladam ze w pliku sa tylko nazwy plyt .. kazda nazwa w osobnej lini
  6. $plik_czysty = array_unique($plik);
  7.  
  8. //dla kazdego elementu z tablicy $plik_czysty wykonuje zapytanie do bazy
  9. // sprawdz jaka jest skladnia foreach .. bo ta jest niepelna .. 
  10. //potraktuj to jako zadanie domowe biggrin.gif
  11. foreach($plik_czysty ) 
  12. {
  13.  //a tutaj zapytanie do bazy
  14. }
  15. ?>
Pilsener
A na podstawie czego sprawdzasz, czy rekordy nie mogą się powtórzyć? Nie mogą się powtórzyć wewnątrz pliku tekstowego, czy te z pliku nie mogą być takie same jak te w bazie? Plik jest duży czy mały? Ja bym to podzielił na dwa etapy:

1. Preparowania danych:
- generujesz klucz (np. data+numer produktu)
- usuwasz duplikaty (np. funkcją array_unique w przypadku małego pliku)
- sprawdzasz, czy istnieją już w bazie takie rekordy
- zapisujesz dane w nowym pliku, gdzie nowy wiersz = nowy rekord a pola są oddzielone znakiem tabulacji

2. Dodawanie danych:
- wykorzystaj LOAD DATA INFILE - dodaje cały plik tekstowy od razu do bazy

Jeśli rekordy mają być unikatowe warto dodać do tabeli klucz - upraszcza to znacznie sprawę.
Barczi
@Pilsener, te z pliku nie mogą być takie same jak w bazie, a plik ma ok. 20kb. Więc nie jest jeszcze, aż taki duży. Co do unique_key, właśnie nie mogę dać, bo mam primary_key na ID ohmy.gif! Hosting (do testów, bo na PC coś mi ruszyć apache nie chce) yoyo.pl.

@Cienki1980 - Dobrze, odrobię zadanie jak wrócę ze szkoły ; d
Pilsener
Miałem na myśli dodatkowe pole, nie musi być ono primary ani secondary key, wystarczy, że będzie unikalne.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.