Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Porównanie tablicy z wpisami w bazie danych., Problem natury logicznej
kartun11
post
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 2
Dołączył: 22.07.2007

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


Witam, już 3 dni męczę się z takim prostym kodem i nie mam pojęcia co jest nie tak.
  1. <?php
  2. //...
  3. $repeat_num = 0; // Liczba powtarzających się kodów
  4. $added_num = 0; // Liczba dodanych kodów
  5.    
  6.    for($i = 0; $i < $arrsize; $i++) { //Zmienna $arrsize to ilość elementów w tablicy
  7.    
  8.        $isindb = FALSE; //Zmienna informuje o tym, czy dany kod już istnieje w bazie
  9.        
  10.        while($row = mysql_fetch_row($result)) { //$result to wynik zapytania do bazy
  11.            if($code[$i] == $row[0]) { //$code to tablica z kodami utworzona z pliku
  12.                $isindb = TRUE; //Kod istnieje w bazie
  13.                $repeat_num++; //Zwiększam ilość powtórzeń
  14.                break;
  15.            }
  16.        }
  17.  
  18.        if($isindb === FALSE) { //Jeżeli kodu nie ma w bazie
  19.            $query = "INSERT INTO codes VALUES('$code[$i]');"; // Zapytanie do bazy danych
  20.            mysql_query($query) or die("<h1><span style='color: red;'>Blad w zapytaniu</span></h1>"); // Dodaje kod
  21.            $added_num++; //Zliczamy dodany kod
  22.        }
  23.    }
  24. //...
  25. ?>


Za pierwszym razem dodaje mi wszystkie kody z pliku i jest ok. Gdy próbuję dodać kody drugi raz, też wszystko działa i zlicza powtórzenia.
Problem się pojawia, gdy usunę jakiś kod w bazie i będę chciał dodać kody jeszcze raz. Teoretycznie powinno dodać mi tylko jeden kod.
Wtedy wyglądało by to tak, że dodano jeden kod, a reszta się powtarza. Mi jednak działa to tak, że gdy natrafi na kod, którego nie ma w bazie dodaje go, ale później dodaje już wszystkie kody. Nie mam pojęcia co jest nie tak.
Proszę o pomoc.

Ten post edytował kartun11 11.06.2009, 21:04:17
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
daniel1302
post
Post #2





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


Spróbuj dodać w tym if'ie
if($isindb === FALSE){}

na końcu $isindb = TRUE;
Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Nie ma sensu wykonywać n zapytań dodających kod do tabeli.

Zrób tak:
  1. <?php
  2.  
  3. //lista kodów do dodania
  4. $codes = array(
  5.  123, 321, 432, 234,
  6.  542, 423, 132, 534
  7. );
  8.  
  9. $exists = array();
  10.  
  11. //oczywiście jeżeli kody nie są numeryczne, powinieneś zadbać o zbudowanie poprawnego zapytania
  12. $query = sprintf('SELECT * FROM tbl_name WHERE code IN (%s);', implode(', ', $codes));
  13. $result = mysq_...
  14. while(...){
  15.  $exists[] = $row['code'];
  16. }
  17.  
  18. $insert = array_dif($codes, $exists);
  19. foreach($insert as &$i){
  20.  $i = '(' . $i . ')';
  21. }
  22.  
  23. $query = sprintf('INSERT INTO tbl_name VALUES %s;', implode(', ', $insert));
  24. mysql_query($query);
  25. ?>


Ten post edytował Crozin 11.06.2009, 19:53:35
Go to the top of the page
+Quote Post
kartun11
post
Post #4





Grupa: Zarejestrowani
Postów: 29
Pomógł: 2
Dołączył: 22.07.2007

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


Cytat(daniel1302 @ 11.06.2009, 20:31:39 ) *
Spróbuj dodać w tym if'ie
if($isindb === FALSE){}

na końcu $isindb = TRUE;

Nie pomogło.

A co do tego innego sposobu, to pewnie jest bardziej wydajny, ale jak dla mnie bardziej skomplikowany.
Skrypt będę odpalał może raz na miesiąc, więc nie potrzebuje wydajności.
Mam już napisane to w trochę inny sposób, ale chodzi mi bardziej o to, dlaczego mój kod nie działa tak jak chcę.
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 Aktualny czas: 21.08.2025 - 20:14