Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] problem z dublowaniem rekordow
Forum PHP.pl > Forum > Przedszkole
shtoc
Witam mam taki problem!
mam w bazie rekordy ktore maja wpisywane adresy www typu www.strona.pl/identyfikator/costam
skrypt pobiera mi taki adres z bazy uzupelnia o nim inne informacje zalozone w bazie oraz dla tego adresu kolejne adresy filmow ktore sa na tej stronie. mniejwiecej tak update jednego + ok 8 nowych i tak w kolko!!

problem mam z tym ze czesto te asdresy sie powtarzaja! i chailbym je jakos wyeliminowac zeby w bazie byly tylko raz! CZy ktos ma pomysl jak pobierac adresy z bazy i porownywac z aktualnie zapisywanym?
jak chailem wypisac adresy to przy 42 tys rekordow robi sie wielka zwiecha :/ moze mi ktos cos podpowiedziec??
Darti
adres internetowy został wymyślony po to, żeby identyfikował w sposób maksymalnie jednoznaczny daną stronę (nie mówię tu o stronach w ramkach lub podobne techniki, które moim zdaniem są źle napisane). Wystarczy, że sprawdzisz w bazie czy taką stronę masz już dodaną (np szukając w SQL WHERE `adres`='dodawany_adres')
PanGuzol
Może to pomoże??
http://dev.mysql.com/doc/refman/5.1/en/replace.html
shtoc
Cytat(Darti @ 9.12.2008, 20:21:36 ) *
Wystarczy, że sprawdzisz w bazie czy taką stronę masz już dodaną (np szukając w SQL WHERE `adres`='dodawany_adres')


no wlasnie wiem tylko nie wiem jak to zapisac....
generalnie chcialbym to sprawdzac gdzies tutaj

  1. <?php
  2. foreach($array as $para)
  3.    {
  4.  
  5. tutaj
  6.  
  7.  
  8.    $sql = "INSERT INTO test2(`web`,`url`,`tagi`,`klucz`,`created_at`) VALUES(:web,:url,:tagi,:klucz,:created_at)";
  9.    $statement = $pdo->prepare($sql);
  10.    $statement->bindValue(':web', $para, PDO::PARAM_STR);
  11.    $statement->bindValue(':url', '', PDO::PARAM_STR);
  12.    $statement->bindValue(':tagi', '', PDO::PARAM_STR);
  13.    $statement->bindValue(':klucz', '', PDO::PARAM_STR);
  14.    $statement->bindValue(':created_at', date( 'Y-m-d H:i:s', time()), PDO::PARAM_STR);
  15.    $statement->execute();
  16.    }
  17. ?>


tu pod zmienna $para mam nowo pobrane adresy www. i zapisuje je do bazy.
i to chyba bedzie najlepsze miejsce do wyeliminowania dublujacych sie adesow.
zulus
Kiedyś (przez przypadek) wyczaiłem, że jak ustawisz w MySQL pole jako klucz unikalny, to przy próbie zapisania nowego rekordu z tym samym identyfikatorem to tak na prawdę nadpisze ten poprzedni tongue.gif
shtoc
to nie koniecznie zda u mnie egzamin bo ja pobieram te zapisane adresy i robie ich update i jak bede nadpisywal updatowany rekord to on znowu bedzie nadawal sie do update'u.
PanGuzol
Jak dasz wartość UNIQUE dla kolumny w której trzymasz adresy to nie będzie się powtarzać.
A stosując REPLACE lub INSERT IGNORE w przypadku próby dodania tego samego adresu stary rekord zostanie usunięty i zastąpiony nowym.
Jeśli użyjesz same INSERT bez IGNORE to zostanie stary rekord.
shtoc
jak probuje ustawic web jakos unike albo primary key to dostaje w bazie blad :


Błąd
zapytanie SQL:

CREATE TABLE `wrzuta`.`aaa` ( `web` TEXT NOT NULL ,
UNIQUE ( `web` )) ENGINE = MYISAM

MySQL zwrócił komunikat: http://dev.mysql.com/doc/refman/5.0/en/err...ges-server.html

#1170 - BLOB column 'web' used in key specification without a key length

jaki typ ustawic zeby przechowywac tam stringa (adres strony) i muc ustawic to na unike??

a no i jeszcze probowalem to insert ignore replace i insert
rozumien ze to ma byc w zapytaniu sql
  1. <?php
  2. $sql = "REPLACE test2(`web`,`url`,`tagi`,`klucz`,`created_at`) VALUES(:web,:url,:tagi,:klucz,:created_at)";
  3. ?>


to nie daje mi zadnych efektow sad.gif caly czas sie powtarzaja adresy

ustawilem kolumne web na varchar(300) jako jednoznaczna i not null

pakuje poczatkowy adres do bazy
uruchamiam skrypt wykonuje mi sie jego update ale nie dodaja sie nowe adresy mimo ze skrypt je pobiera do tablicy nie wpisuje ich do bazy...questionmark.gif?
Darti
Cytat(shtoc @ 10.12.2008, 10:28:28 ) *
jak probuje ustawic web jakos unike albo primary key to dostaje w bazie blad :
Błąd
zapytanie SQL:

CREATE TABLE `wrzuta`.`aaa` ( `web` TEXT NOT NULL ,
UNIQUE ( `web` )) ENGINE = MYISAM

MySQL zwrócił komunikat: http://dev.mysql.com/doc/refman/5.0/en/err...ges-server.html

#1170 - BLOB column 'web' used in key specification without a key length


Bo w MySQL maksymalny rozmiar indeksu moze mieć 1000 bajtów.
Zrób sobie w tabeli kolumnę hash jako indeks varchar 32 znaki i wrzucaj tam md5" title="Zobacz w manualu PHP" target="_manual adresu. Na podstawie tego sprawdzaj czy w bazie masz dany wpis czy nie.
shtoc
ok dzieki za podsuniecie ciekawego pomyslu tylko ze ja wlasnie mam probelm z tym jak bierzacy adres ktory siedzi w zmiennej porownac ze wszystkimi co sa juz w bazie??

czyli czy $adres != cala kolumna adresow w bazie questionmark.gif w sensie czy za kazdym razem trzeba probrac wszystkie rekordy z bazy i sprawdzic?? czy jest cos co porownuje nie wyciagajac tego wszystkiego!!

bo z mojego pkt widzenia wyciagac z bazy mozna 10, 100 rekordow do takiego sprawdzenia ale nie 100 000 exclamation.gif chyba ze sie myle??
Darti
dlaczego wyciągać questionmark.gif

  1. <?php
  2. $new_hashed_ip = md5($jakies_ip);
  3. $q = "SELECT COUNT(*) FROM `baza` WHERE `hashed_ip` = '{$new_hashed_ip}'"; // lub podobne zapytanie z replace, wtedy nizej liczysz affected_rows
  4. $res = mysql_query($q);
  5. if(mysql_num_rows($res)){
  6. echo "ip jest w bazie";
  7. } else {
  8. echo "trzeba dodac IP do bazy";
  9. }
  10. ?>


p.s. sorry, nie IP a adres, ale zasada ta sama
shtoc
Czyli teoretycznie powinienem zrobic cos takiego :

  1. <?php
  2.    foreach($array as $para)
  3.    {
  4.    
  5.    $strona = $para ;
  6.    $sql = "SELECT COUNT (*) FROM `test2` WHERE `web` = '{$strona}'";
  7.    $stat = $pdo->query($sql);
  8.  
  9.  
  10.        if($stat==0)
  11.        {
  12.    
  13.        $sql = "INSERT INTO test2(`web`,`url`,`tagi`,`klucz`,`created_at`) VALUES(:web,:url,:tagi,:klucz,:created_at)";
  14.        $statement = $pdo->prepare($sql);
  15.        $statement->bindValue(':web', $para, PDO::PARAM_STR);
  16.        $statement->bindValue(':url', '', PDO::PARAM_STR);
  17.        $statement->bindValue(':tagi', '', PDO::PARAM_STR);
  18.        $statement->bindValue(':klucz', '', PDO::PARAM_STR);
  19.        $statement->bindValue(':created_at', date( 'Y-m-d H:i:s', time()), PDO::PARAM_STR);
  20.        $statement->execute();
  21.        #var_dump($statement->errorInfo());
  22.        }
  23.        else exit;
  24.   }
  25.  
  26. ?>
nospor
Cytat
$stat = $pdo->prepare($sql);


if($stat==0)

Zobacz w manualu co robi i co zwraca prepare() i nie pisz wiecej takich kodow winksmiley.jpg
shtoc
hmmm no dalej mam z tym problem.......

to moze zapytam inaczej jakie sa najbardziej efektywne sposoby na wyeliminowanie dublowania rekordow w bazie??

Cytat(shtoc @ 10.12.2008, 10:28:28 ) *
j
ustawilem kolumne web na varchar(300) jako jednoznaczna i not null

pakuje poczatkowy adres do bazy
uruchamiam skrypt wykonuje mi sie jego update ale nie dodaja sie nowe adresy mimo ze skrypt je pobiera do tablicy nie wpisuje ich do bazy... questionmark.gif ?


to jednak dziala!!!

moj blad byl taki ze nie dalem auto_icrementacji na id!!

wiec spoko dziekuje wszystkim za pomoc i zmobilizowanie mnie do myslenia tongue.gif
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.