Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP/MySQL/TXT] Rekordy z TXT do DB - jak wykluczyć duplikat?
Barczi
post 1.04.2008, 19:45:25
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 18.03.2007

Ostrzeżenie: (0%)
-----


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ź.
Go to the top of the page
+Quote Post
Cienki1980
post 1.04.2008, 19:48:58
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

Ostrzeżenie: (0%)
-----


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.


--------------------
404
Go to the top of the page
+Quote Post
Barczi
post 1.04.2008, 20:13:42
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 18.03.2007

Ostrzeżenie: (0%)
-----


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)...
Go to the top of the page
+Quote Post
Cienki1980
post 1.04.2008, 21:01:03
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

Ostrzeżenie: (0%)
-----


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.


--------------------
404
Go to the top of the page
+Quote Post
Barczi
post 1.04.2008, 21:17:57
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 18.03.2007

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post
Cienki1980
post 1.04.2008, 21:22:55
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
404
Go to the top of the page
+Quote Post
Pilsener
post 2.04.2008, 07:25:36
Post #7





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
Barczi
post 2.04.2008, 11:15:17
Post #8





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 18.03.2007

Ostrzeżenie: (0%)
-----


@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

Ten post edytował Barczi 2.04.2008, 11:16:43
Go to the top of the page
+Quote Post
Pilsener
post 2.04.2008, 11:25:49
Post #9





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Miałem na myśli dodatkowe pole, nie musi być ono primary ani secondary key, wystarczy, że będzie unikalne.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 05:00