Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Porównanie tablicy z wpisami w bazie danych.
Forum PHP.pl > Forum > PHP
kartun11
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.
daniel1302
Spróbuj dodać w tym if'ie
if($isindb === FALSE){}

na końcu $isindb = TRUE;
Crozin
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. ?>
kartun11
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ę.
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.