Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP&MySQL] dodawanie i pomijanie istniejących wyrazów w bazie
Forum PHP.pl > Forum > Przedszkole
bl4ck_b0x
Witam mam problem z dodawaniem wpisów. tzn konkretnie z 'powielaniem' wybranego wpisu. Chodzi o to, że mam tekst np: ala ma kota <-- ten tekst się dodaje, kiedy wpisuje np.: pies ma ale to dodają się tylko "pies" i "ale", "ma" jako że jest już w bazie zostaje pominięte podczas dodawania.... wydawało mi się, że tak jest...niestety tak jest tylko na localhost na którym zawsze pisze skrypty a dopiero później wrzucam na serwer. Więc tak: na localhost skrypt pomija w dodawaniu istniejący w bazie wyraz natomiast na serwerze dodaje wszystkie wyrazy jakie występują w formularzu (którego kodu tutaj nie podałem ale za to jest niżej podana zmienna $_POST). Co zrobić aby i na serwerze pomijał podczas dodawania istniejące w bazie wpisy? Tak żebym nie miał w bazie kilkudziesięciu takich samych wpisów...

$dodaj=Zabezpiecz($_POST['dodaj']) <-- dane z formularza i zabezpieczenie przy pomocy funkcji Zabezpiecz.

Funkcja Zabezpiecz:
  1. <?
  2. function Zabezpiecz($text)
  3. {
  4. return $text;
  5. }
  6. ?>


  1. <?
  2. if(!empty($dodaj))
  3. {
  4. $dodaj = eregi_replace(' {2,}',' ',$dodaj);
  5. $dodaj = eregi_replace('
  6. ','',$dodaj);
  7. $add=explode(' ',$dodaj);
  8. foreach($add as $linijka)
  9. {
  10. $linijka=Zabezpiecz($linijka);
  11.  
  12. $linijka=str_replace(',','',$linijka);
  13. $linijka=str_replace('?','',$linijka);
  14. $linijka=str_replace('!','',$linijka);
  15. $linijka=str_replace(':','',$linijka);
  16. $linijka=str_replace('/','',$linijka);
  17. $linijka=str_replace(' ','',$linijka);
  18. $linijka=str_replace('[','',$linijka);
  19. $linijka=str_replace(']','',$linijka);
  20. $linijka=str_replace('(','',$linijka);
  21. $linijka=str_replace(')','',$linijka);
  22. $linijka=str_replace('"','',$linijka);
  23. $linijka=str_replace('<','',$linijka);
  24. $linijka=str_replace('.','',$linijka);
  25. $linijka=str_replace('{','',$linijka);
  26. $linijka=str_replace('}','',$linijka);
  27. $linijka=str_replace('=','',$linijka);
  28. $linijka=str_replace('&','',$linijka);
  29. $linijka=str_replace(';','',$linijka);
  30. $linijka=str_replace('*','',$linijka);
  31. $linijka=str_replace('Š','',$linijka);
  32. $linijka=str_replace('+','',$linijka);
  33. $linijka=str_replace('|','',$linijka);
  34. $linijka=str_replace('•','',$linijka);
  35.  
  36. $baza='SELECT nohash FROM md5 WHERE nohash="'.$linijka.'"';
  37. $baza1=mysql_query($baza);
  38. $baza2=mysql_fetch_array($baza1);
  39.  
  40. $wordExist = false;
  41. if($baza2['nohash']==$linijka)
  42. {
  43. $linijka=str_replace($baza['nohash'],'',$linijka);
  44. $wordExist = true;
  45. }
  46.  
  47. if(!$wordExist)
  48. {
  49. $linijka_1=md5($linijka);
  50. $a='INSERT INTO `md5`(`hash`,`nohash`) VALUES("'.$linijka_1.'","'.$linijka.'")';
  51. $aa=mysql_query($a);
  52. echo ''.$linijka.' - '.$linijka_1.'<br /> ';
  53. }
  54. }
  55. }
  56. ?>



Bardzo proszę o pomoc...pozdrawiam
wojckr
Na początek sprawdziłbym czy słowa dodane do bazy, które NIBY są takie same, czy są rzeczywiście takie samy, czyli np. czy "ma" nie jest po raz drugi dodane jako "ma " - ze spacją np. na końcu, albo innym białym znakiem.

PS
Poza tym, nie wiem jak podchodzisz do kwestii wydajności, ale chodzi o zapytanie do bazy: jesli bedziesz miał 500 elementów w $add to bedzie to oznaczać do 1000 zapytań (select i input, gdzie ilosc inputow powinna sie zmniejszac, bo slowa beda sie stopniowo dodawać).

I jeszcze:
CODE
<?php
$linijka=str_replace(...);
....
$linijka=str_replace(...); ?>


zastąpiłbym jednym:

CODE
<?php
$linijka=preg_replace(...);?>
bl4ck_b0x
właśnie chodzi o to, że zdaję sobie sprawę z tego, że będzie aż tyle zapytań jednak właśnie o to chodzi, że będę wklejał całe teksty, felietony, artykuły itd. więc domyślam się, że będzie aż tyle zapytań. poza tym jakbyś nie zauważył linijka:

$dodaj = eregi_replace(' {2,}',' ',$dodaj);

właśnie to robi, usuwa więcej niż jedną spacje itd. więc białe znaki są eliminowane... chyba ze moglbym skorzystac jeszcze z trim(); tyle, że np. dodając pojedyńczy wyraz 2 razy np. "ja" faktycznie zostaje dodany 2 razy pomimo, że istnieje już w bazie
wojckr
Okey, pomijamy kwestię wydajności.

Biały znak to nie tylko spacja. To także znak nowej linii, tabulator i inne dziwne, których nie widać. Np. znak nowej linii może być oznaczony w wyrażeniu regualrnym jako \n LUB \r LUB \n\r

To może:
W tabeli polu "nohash" nadaj atrybut UNIQE, czyli w przypadku próby dodania takiego samego wyrazu, próba taka zostanie odrzucona.
bl4ck_b0x
możesz powiedziec jak to wygląda? bo nie czytałem nigdy o tym UNIQE, zresztą myślałem, że ten kod:

  1. <?php
  2. $dodaj = eregi_replace(' {2,}',' ',$dodaj);
  3. $dodaj = eregi_replace('
  4. ','',$dodaj);
  5. ?>


pozbędzie się spacji i entera podczas dodawania wpisu. niby tak jest ale tylko na localhost, na serwerze już działa inaczej
wojckr
Można użyć odpowiedniego zapytania SQL, ale nie znam go (tzn nie pamiętam w tej chwili i nie mam możliwości sprawdzić), atrybut UNIQE nadaję zawsze z poziomu PHPAdmina przy zakładaniu tabeli (ale można też później nadać, ale tylko wtedy się uda nadać, gdy w kolumnie nie ma powtarzających sie wpisów).
Po polsku w PHPMyAdminie to jest nazwane "jednoznaczny" (ikonka z literą "U"), zaznaczasz i kolumna bedzie mogla miec tylko wartosci unikalne.

Potem można to edytować w zakładce "Struktura" danej tabeli tu:
--------------------------------
Indeksy:
Nazwa klucza | Typ | Moc | Pole
a | UNIQUE | 0 | a
-----------------------------------



Natomiast biały znak następnej linii może sie różnić na różnych komputerach o różnych systemach operacyjnych (upraszczając).
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.