Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][MySQL][SQL] Wpisy się duplikują mimo if-a porównującego
Forum PHP.pl > Forum > Przedszkole
konradkw
Taki mały problem.. próbowałem już chyba z 10 sposobów na porównanie wpisanego komentarza z tymi już wpisanymi wcześniej i z jakiegoś powodu zamiast porównywać, sprawdza owszem ale nie blokuje niczego - głównie chodzi mi o to żeby się nie dodawały komentarze po odświeżeniu strony sad.gif powtarzalność wpisów jest drugorzędnym problemem.

Możecie popatrzeć niżej co mam nie tak?

Tylko nadmienię że to już chyba 10 jeśli nie 12 wersja skryptu i pewnie tam jest namieszane za bardzo..

Będę bardzo wdzięczny za obejrzenie tego świeżym okiem ...

  1. <?
  2. if (isset($_POST['wyslij']))
  3. {
  4.  
  5. $a = $_POST['komentarz'];
  6. $b = $_POST['aktywacja'];
  7. $c = $_POST['autor'];
  8. $k = $_POST['id_postu'];
  9.  
  10. $sprawdzenie = mysql_query ("SELECT * FROM `pwa_komentarze`");
  11. while ($s = mysql_fetch_array($sprawdzenie, MYSQL_ASSOC))
  12.  
  13. { $koment = $s['komentarz'];
  14.  
  15. if ($koment != $a) { $x = 'dalej'; } else { $x = 'stop'; }
  16. }
  17.  
  18. if ($x == 'dalej') {
  19.  
  20. $add = mysql_query("INSERT INTO `pwa_komentarze` (komentarz, autor, aktywacja, id_postu) VALUES ('$a', '$c', '$b', '$k')");
  21. if ($add) {
  22. echo "<center>Poprawnie dodano wpis!</center>";
  23. } else {
  24. echo mysql_error(); echo '<p>Blad! Spróbuj ponownie</p>';
  25. }
  26. }
  27. }
  28. echo '<a href="index.php?menu=zobacz-wpis-'.$tytulek.'"><b> Zobacz wszystkie komentarze do tego wpisu! </b></a><br><hr><br>';
  29. }
  30. ?>
matty7
A próbowałeś funkcji unset() ? Zastosuj go pod koniec if'a wink.gif
konradkw
czyli że np
if ($add) { unset($_POST['zmienna']) } questionmark.gif

Wolałbym jednak porównywać żeby jednocześnie sprawdzało czy już takie wpisy są...

Jeszcze dodam ze to stronka z mojego podpisu ... zebyscie mogli zobaczyc jak to wyglada ..
skleps
W formularzu polu ukrytym generuj i przekazuj zmienną losową lub np. liczbę mikrosekund (funkcja microtime) i dodawaj tę zmienną do bazy przy rekordzie.
Później przy dodawaniu komentarza możesz sprawdzać czy taka zmienna już jest w bazie i jeśli jest to odrzucaj komentarz.

Zmienną losową możesz tez utworzyć przez połączenie liczby mikrosekund i np. liczbą losową rzędu 1000.
Jaka jest szansa, że dwóch kolesi w tej samej mikrosekundzie wylosuje tą samą liczbę losową?

Ogólnie preferuję łączenie takiej pseudolosowości właśnie z funkcjami czasu - sama losowość nie gwarantuje nam, że ktoś kiedyś nie wylosuje takiej samej liczby....
No i co jakiś czas możesz w bazie czyścić te pola przy rekordach starszych niż np. 1 dzień smile.gif
redeemer
Jeżeli chodzi Ci tylko o odświeżenie strony to wystarczy, że po obsłudze danych z POST i dodaniu do bazy zrobisz redirect.
konradkw
ale czemu utrudniać... nie chcę mieć dwóch takich samych komentarzy w bazie więc nie wystarczy porównać treści?

redeemer - przekierowanie do bloga spowrotem? to powinno zadziałać bo wyczyści zmienne...
widzicie może dlaczego duplikują się wpisy?
redeemer
To załóż indeks typu UNIQUE w bazie (np. na autor,komentarz). A tak właściwie to po co ta pętla while w PHP jak sama baza Ci to może zwrócić jednym zapytaniem, czy już taki komentarz jest, czy nie.

Edit: Ja polecałbym jednak redirect, a jeśli chciałbyś się zabezpieczyć przed spamowaniem (bo samo porównanie treści mało Ci da) to zrób limit czasowy, że można dodać X komentarzy w ciągu Y minut.
konradkw
mogę prosić o poprawę tego co już mam żebym miał doraźnie rozwiązane? później ewentualnie bym to zmienił na to co proponujecie ..? Będę wdzięczny.



Naprawde nie widze dlaczego wpisy sie duplikuja - czy moze ktos podpowiedziec prosze?

Chodzi mi o juz nie tyle o to ze da sie wpisac ten sam komentarz ale o to ze po dodaniu jednego komentarza dodaje sie np ich 5 lub 6... :/

jak widzicie ponizej, wpisy sie powielaja bez powodu .. ale wyswietla sie tylko JEDEN Z NICH!! dlaczego .. ? nie rozumiem co sie dzieje ..

Shido
  1. <?php
  2. if (isset($_POST['wyslij']))
  3. {
  4. $a = $_POST['komentarz'];
  5. $b = $_POST['aktywacja'];
  6. $c = $_POST['autor'];
  7. $k = $_POST['id_postu'];
  8.  
  9. $sprawdzenie = mysql_query ("SELECT * FROM `pwa_komentarze` WHERE `komentarz` = '$a' LIMIT 1");
  10. while ($s = mysql_fetch_array($sprawdzenie, MYSQL_ASSOC))
  11. {
  12. $x = 'dalej';
  13. }
  14. if (@$x == 'dalej')
  15. {
  16. $add = mysql_query("INSERT INTO `pwa_komentarze` (komentarz, autor, aktywacja, id_postu) VALUES ('$a', '$c', '$b', '$k')");
  17. if ($add)
  18. {
  19. echo "<center>Poprawnie dodano wpis!</center>";
  20. }
  21. else
  22. {
  23. echo '<p>Blad! Spróbuj ponownie</p>';
  24. }
  25. }
  26. }
  27. echo '<a href="index.php?menu=zobacz-wpis-'.$tytulek.'"><b> Zobacz wszystkie komentarze do tego wpisu! </b></a><br><hr><br>';
  28. }
  29. ?>


Zacznijmy od tego że na końcu masz coś w nadmiarze klamerek jak widać po tym jak ułożyłem skrypt.
Kolejna rzecz to twoje porównywanie nie działa z prostego powodu ponieważ porównujesz każdy element z bazy i przechodząc do kolejnego elementu zapominasz o wyniku porównania poprzedniego ( bo podmieniasz zmienną ).

To co dałem, wyszuka ci w bazie czy jest rekord w którym `komentarz` = '$a' LIMIT 1 dałem po to by skrypt nie szukał już dalej, bo nie ma to sensu.
Jeżeli znajdzie to $x = 'dalej'; bez żadnego elsa by nie podmieniał rekordów ( chociaż już teraz LIMIT 1 blokuje dalsze podmienianie )
Dalej jest już twój skrypt ( z małą zmianą w warunku ifa - dodałem @ by nie pluł się w że takiej zmiennej nie ma gdy nie znajdzie nic w bazie ).
konradkw
nie dodaje komentarzy wcale teraz :/

co to znaczy: @$x questionmark.gif to tak powinno byc?

edit: bez @ tez nie dziala ..
Shido
Skrewiłem, źle obrałem warunek tongue.gif ( zamiast blokować powtarzający się komentarz, to tylko takie akceptował tongue.gif )

A @$x powoduje że debuger nie będzie krzyczał jeżeli zmienna $x nie będzie istnieć.

Teraz powinno być dobrze.
  1. <?php
  2. if (isset($_POST['wyslij']))
  3. {
  4. $a = $_POST['komentarz'];
  5. $b = $_POST['aktywacja'];
  6. $c = $_POST['autor'];
  7. $k = $_POST['id_postu'];
  8. $x = 'dalej';
  9. $sprawdzenie = mysql_query ("SELECT * FROM `pwa_komentarze` WHERE `komentarz` = '$a' LIMIT 1");
  10. while ($s = mysql_fetch_array($sprawdzenie, MYSQL_ASSOC))
  11. {
  12. $x = 'stop';
  13. }
  14. if ($x == 'dalej')
  15. {
  16. $add = mysql_query("INSERT INTO `pwa_komentarze` (komentarz, autor, aktywacja, id_postu) VALUES ('$a', '$c', '$b', '$k')");
  17. if ($add)
  18. {
  19. echo "<center>Poprawnie dodano wpis!</center>";
  20. }
  21. else
  22. {
  23. echo '<p>Blad! Spróbuj ponownie</p>';
  24. }
  25. }
  26. }
  27. echo '<a href="index.php?menu=zobacz-wpis-'.$tytulek.'"><b> Zobacz wszystkie komentarze do tego wpisu! </b></a><br><hr><br>';
  28. }
  29. ?>
konradkw
jakiego debugera uzywasz? ja szukam dobrego bo dreamviewer nei wylapuje wszystkiego ..

po poprawce juz nie duplikuje wpisow - dziekuje uprzejmie!!
zastanawia mnie tylko jedna rzecz .. dlaczego po dodaniu wpisu (strona sie odswieza zeby wyslac info) najnowszy wpis sie nie pokazuje do kolejnego odswiezenia .. ?
Shido
Ja korzystam ze standardowego Apache'owego tyle że ustawiam
  1. ini_set('display_errors', 1);

I mi wtedy najmniejsze błędy wyświetla.

Co do odświeżania komentarze musiałyby być odświeżane niezależnie od strony. Ewentualnie po dodaniu komentarza wymuś odświeżenie, lub przenieś skrypt dodania komentarza przed skrypt ich wyświetlania ( najbardziej prawdopodobne że tak masz tongue.gif )
konradkw
zgadza sie - przenioslem na sama gore .. i jest gitara..

Gdzie to "ini_set('display_errors', 1);" ustawiasz? w apache? czy dajesz to w skrypcie? - nigdy tego nie uzywalem ..
Shido
ogólnie opcje są 2 ustawiasz w PHP.ini display_errors na 1 lub dajesz w pliku php. Jeżeli cały serwer opiera się na np. pliku index.php to wystarczy że dasz to na początku tego index i będzie jak trza, w innym wypadku musisz dać w każdym pliku w którym chcesz by wyświetlały się błędy.
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.