Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL] problem z dublowaniem rekordow
shtoc
post
Post #1





Grupa: Zarejestrowani
Postów: 128
Pomógł: 0
Dołączył: 18.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


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??
Go to the top of the page
+Quote Post
Darti
post
Post #2





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

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


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')

Ten post edytował Darti 9.12.2008, 20:24:18
Go to the top of the page
+Quote Post
PanGuzol
post
Post #3





Grupa: Zarejestrowani
Postów: 353
Pomógł: 50
Dołączył: 28.07.2005
Skąd: Łaziska Górne

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


Może to pomoże??
http://dev.mysql.com/doc/refman/5.1/en/replace.html
Go to the top of the page
+Quote Post
shtoc
post
Post #4





Grupa: Zarejestrowani
Postów: 128
Pomógł: 0
Dołączył: 18.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
zulus
post
Post #5





Grupa: Zarejestrowani
Postów: 225
Pomógł: 18
Dołączył: 30.06.2003
Skąd: Wrocław

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


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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
shtoc
post
Post #6





Grupa: Zarejestrowani
Postów: 128
Pomógł: 0
Dołączył: 18.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
PanGuzol
post
Post #7





Grupa: Zarejestrowani
Postów: 353
Pomógł: 50
Dołączył: 28.07.2005
Skąd: Łaziska Górne

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


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.
Go to the top of the page
+Quote Post
shtoc
post
Post #8





Grupa: Zarejestrowani
Postów: 128
Pomógł: 0
Dołączył: 18.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


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 (IMG:http://forum.php.pl/style_emoticons/default/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...(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?

Ten post edytował shtoc 10.12.2008, 09:17:13
Go to the top of the page
+Quote Post
Darti
post
Post #9





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

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


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.
Go to the top of the page
+Quote Post
shtoc
post
Post #10





Grupa: Zarejestrowani
Postów: 128
Pomógł: 0
Dołączył: 18.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/exclamation.gif) chyba ze sie myle??
Go to the top of the page
+Quote Post
Darti
post
Post #11





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

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


dlaczego wyciągać (IMG:http://forum.php.pl/style_emoticons/default/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

Ten post edytował Darti 10.12.2008, 15:42:07
Go to the top of the page
+Quote Post
shtoc
post
Post #12





Grupa: Zarejestrowani
Postów: 128
Pomógł: 0
Dołączył: 18.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


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


Ten post edytował shtoc 11.12.2008, 15:22:20
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
$stat = $pdo->prepare($sql);


if($stat==0)

Zobacz w manualu co robi i co zwraca prepare() i nie pisz wiecej takich kodow (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
shtoc
post
Post #14





Grupa: Zarejestrowani
Postów: 128
Pomógł: 0
Dołączył: 18.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


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... (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 20:09