Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [HTML][MySQL][SQL] Wpisy się duplikują mimo if-a porównującego, Wpisy się duplikują mimo if-a porównującego
konradkw
post 14.07.2012, 20:21:58
Post #1





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 31.05.2010

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


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. ?>
Go to the top of the page
+Quote Post
matty7
post 14.07.2012, 20:27:40
Post #2





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 23.12.2006
Skąd: Będzin / Kraków

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


A próbowałeś funkcji unset() ? Zastosuj go pod koniec if'a wink.gif

Ten post edytował matty7 14.07.2012, 20:28:09
Go to the top of the page
+Quote Post
konradkw
post 14.07.2012, 20:41:01
Post #3





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 31.05.2010

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


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

Ten post edytował konradkw 14.07.2012, 20:42:06
Go to the top of the page
+Quote Post
skleps
post 14.07.2012, 20:46:50
Post #4





Grupa: Zarejestrowani
Postów: 142
Pomógł: 9
Dołączył: 3.03.2011

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


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

Ten post edytował skleps 14.07.2012, 20:49:28
Go to the top of the page
+Quote Post
redeemer
post 14.07.2012, 20:48:03
Post #5





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


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.


--------------------
Go to the top of the page
+Quote Post
konradkw
post 14.07.2012, 20:51:19
Post #6





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 31.05.2010

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


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?
Go to the top of the page
+Quote Post
redeemer
post 14.07.2012, 20:54:36
Post #7





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


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.

Ten post edytował redeemer 14.07.2012, 20:59:30


--------------------
Go to the top of the page
+Quote Post
konradkw
post 16.07.2012, 11:57:11
Post #8





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 31.05.2010

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


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



Ten post edytował konradkw 15.07.2012, 23:57:11
Go to the top of the page
+Quote Post
Shido
post 16.07.2012, 14:01:23
Post #9





Grupa: Zarejestrowani
Postów: 121
Pomógł: 22
Dołączył: 22.06.2012

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


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

Ten post edytował Shido 16.07.2012, 14:03:19


--------------------
Sorka za błędy ort. jak coś dajcie znać na PW to popoprawiam.
Go to the top of the page
+Quote Post
konradkw
post 16.07.2012, 14:11:21
Post #10





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 31.05.2010

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


nie dodaje komentarzy wcale teraz :/

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

edit: bez @ tez nie dziala ..

Ten post edytował konradkw 16.07.2012, 14:12:45
Go to the top of the page
+Quote Post
Shido
post 16.07.2012, 14:13:25
Post #11





Grupa: Zarejestrowani
Postów: 121
Pomógł: 22
Dołączył: 22.06.2012

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


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


Ten post edytował Shido 16.07.2012, 14:14:39


--------------------
Sorka za błędy ort. jak coś dajcie znać na PW to popoprawiam.
Go to the top of the page
+Quote Post
konradkw
post 16.07.2012, 14:16:35
Post #12





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 31.05.2010

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


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 .. ?
Go to the top of the page
+Quote Post
Shido
post 16.07.2012, 14:20:32
Post #13





Grupa: Zarejestrowani
Postów: 121
Pomógł: 22
Dołączył: 22.06.2012

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


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 )


--------------------
Sorka za błędy ort. jak coś dajcie znać na PW to popoprawiam.
Go to the top of the page
+Quote Post
konradkw
post 16.07.2012, 14:25:10
Post #14





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 31.05.2010

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


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 ..
Go to the top of the page
+Quote Post
Shido
post 16.07.2012, 14:28:06
Post #15





Grupa: Zarejestrowani
Postów: 121
Pomógł: 22
Dołączył: 22.06.2012

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


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.

Ten post edytował Shido 16.07.2012, 14:28:41


--------------------
Sorka za błędy ort. jak coś dajcie znać na PW to popoprawiam.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 05:10