Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problematyczne duplicate key przy update
Forum PHP.pl > Forum > Przedszkole
tr3v0rr
Witam,

Mam napisany system w którym co minutę cron sprawdza zapisane w bazie adresy i jeżeli jest tam przekierowanie to robi update adresu, jednak wymagania systemu sa takie ze adresy musza byc unikalne tak wiec jak aktualizujac adres cron podmieni go na juz istniejacy nie moze wykonac zapytania i system sie "zawiesza" na tym adresie. Dla takich przypadkow chcialbym dac np, status "duplikat" i nie zmieniac tego adresu, napewno nie moge go usunac. Przydaloby sie update ... on duplicate key update ale takiego czegos nie ma, moglbym sprawdzac najpierw czy taki adres istnieje juz w bazie ale to by dodalo od 20 do 100 dodatkowych zapytan na minute czego wolalbym uniknac jesli sie tylko da, baza docelowo bedzie zawierala okolo milion adresow. Macie moze jakis pomysl ?

Pozdrawiam
Trevor
gothye
wiec za nim wykonasz UPDATE , zrób SELECT i sprawdź istnienie możliwego duplikatu w bazie
nospor
Cytat
moglbym sprawdzac najpierw czy taki adres istnieje juz w bazie ale to by dodalo od 20 do 100 dodatkowych zapytan na minute czego wolalbym uniknac jesli sie tylko da

No to rob update jak do tej pory, a w sytuacji gdy ten update sie nie powiedzie to sprawdz numer bledu. Jesli to bedzie numer odpowiadajacy za duplikacje, to wowczas oznacz ten rekord jako duplikat. Wowczas dodatkowe zapytania bedziesz robil tylko dla duplikatow a nie dla wszystkich
tr3v0rr
@nospor jestes genialny, nie wiedzialem ze tak mozna. Moglbys mi podpowiedziec jeszczcze jak albo czego szukac w google zeby sprawdzic jakie sa kody bledow oraz jak je sprawdzac ? pozdrawiam goraco
nospor
Nie wiem czego uzywasz do obslugi bazy, ale jesli mysql_query, to blad zapytania zwroci ci mysql_errno()
http://pl1.php.net/manual/en/function.mysql-errno.php

Zas kody bledow sa w dokumentacji mysql. Poza tym mozesz sobie zobaczyc jaki numer bledu zwroci ci mysql_errno dla duplikatu i bedziesz wiedzial smile.gif
tr3v0rr
Uzywam PDO, skonstrulowalem zapytanie w ten sposob:
  1. try {
  2.  
  3. $zapytanie = $db -> prepare('update `baza` set `link`=:link where `id`=:id limit 1');
  4.  
  5. $zapytanie -> bindValue(':link', $last_url, PDO::PARAM_STR);
  6. $zapytanie -> bindValue(':id', $name, PDO::PARAM_INT);
  7. $zapytanie -> execute();
  8.  
  9. echo 'Niby wszystko ok';
  10.  
  11. }catch(PDOException $e){
  12. echo 'wystapil blad: '.$e->getMessage();
  13. }


Wyskakuje "Niby wszystko ok" a zapytanie sie nie update'uje sad.gif
tr3v0rr
Już mam smile.gif

$blad = $zapytanie -> errorInfo();
if ($blad[1] == 1062){
echo 'wpis zostal zduplikowany';
}
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.