Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sesje, kod do przepisania
Forum PHP.pl > Forum > PHP
Salvation
Witam.
Mam problem z nadpisywaniem się stworzonej sesji. W sesji znajduje się "safetycode", który trzeba poprawnie przepisać, żeby móc dodać komentarz... Wrzucam poniżej mój kod php i html. Może rozwiązanie jest banalne, a ja o czymś jeszcze nie wiem? :/

  1. <form id="comment" action="?page='. $page .'&do=add_comment" method="POST">
  2. <table width=100%>
  3. <tr>
  4. <td width=150px>Imię / Nick:</td>
  5. <td><input type="text" name="nick" autofocus placeholder="Wpisz swoje imię/nick"></td>
  6. </tr>
  7. <tr>
  8. <td>E-mail<sup>*</sup>:</td>
  9. <td><input type="email" name="mail" placeholder="Wpisz swój e-mail"></td>
  10. </tr>
  11. <tr>
  12. <td align="left" valign="top">Treść komentarza:</td>
  13. <td><textarea rows="10" name="text" placeholder="Wpisz swój komantarz">Super kalkulator! Polecam wszystkim!</textarea></td>
  14. </tr>
  15. <tr>
  16. <td>Kod: <span class="code" oncopy="return false">'. $_SESSION['code'] .'</span></td>
  17. <td><input type="text" name="code" placeholder="Przepisz kod"></td>
  18. </tr>
  19. <tr>
  20. <td></td>
  21. <td><input id="submit" type="submit" value="Wyślij"></td>
  22. </tr>
  23. </table>
  24. <sup>*</sup> nie będzie wyświetlony
  25. </form>

  1. $do = $_GET['do'];
  2. if(isset($do)){
  3. switch($do){
  4. case "add_comment":
  5. {
  6. $nick = trim($_POST['nick']);
  7. $mail = trim($_POST['mail']);
  8. $text = trim($_POST['text']);
  9. $code = trim($_POST['code']);
  10. if($code == $_SESSION['code']){
  11. $add = @mysql_query("INSERT INTO `komentarze` SET `nick`=$nick, `mail`=$mail, `text`=$text");
  12. if($add){
  13. //header("Location: ?page=$page"); //----- success
  14. echo "success";
  15. }else{
  16. //header("Location: ?page=$page"); //----- error add
  17. echo "error add";
  18. }
  19. }else{
  20. //header("Location: ?page=$page"); //----- error code
  21. echo "error code";
  22. }
  23. }
  24. break;
  25. default:
  26. header("Location: ?page=$page");
  27. break;
  28. }
  29. }

Mój problem pojawia się przy warunku sprawdzania czy wpisany kod jest taki sam jak na "obrazku". Niestety za każdym razem jest on nadpisywany... Próbowałem już przypisać zmienną sesyjną do zmiennej i zabić sesje albo wrzucenie kodu z sha1() do ciasteczka - niestety też nie działa.
Pozdrawiam i czekam z niecierpliwością na odpowiedź.
johny_s
Przecież tu nigdzie nie ma ustawiania tej zmiennej

if(isset($do)){ <--- to możesz wywalić nie działa tak jak Ci się wydaje jak działa
Salvation
Nie ma zmiennej, bo nic nie zmieniało, więc to wyrzuciłem i operuję na $_SESSION[]...

isset($do) działa tak jak potrzebuję, nie wykonuje się skrypt dodawania, dopóki nie zostanie stworzona/wywołana zmienna $do.
trueblue
Gdzie ustawiasz $_SESSION['code'] ?
Salvation
Na samej górze pliku, tego tu nie wkleiłem, bo myślałem, że to logiczne.

Rozwiązałem problem kodu aktualnie tak:
  1. //---------- stworzenie ciasteczka
  2. $name = sha1("code");
  3. $value = sha1($_SESSION['code']);
  4. setcookie($name, $value, time()+60*5);
  5. //---------- dodawanie komenatrza
  6. if(isset($do)){
  7. $Code = $_COOKIE[$name];
  8. switch($do){
  9. case "add_comment":
  10. {
  11. $nick = trim($_POST['nick']);
  12. $mail = trim($_POST['mail']);
  13. $text = trim($_POST['text']);
  14. $code = trim($_POST['code']);
  15. if(sha1($code) == $Code){
  16. $add = @mysql_query("INSERT INTO `komentarze` SET `nick`='$nick', `mail`='$mail', `text`='$text'");
  17. if($add){
  18. //header("Location: ?page=$page"); //----- success
  19. echo "success";
  20. }else{
  21. //header("Location: ?page=$page"); //----- error add
  22. echo "error add";
  23. }
  24. }else{
  25. //header("Location: ?page=$page"); //----- error code
  26. echo "error code";
  27. }
  28. }
  29. break;
  30. default:
  31. header("Location: ?page=$page");
  32. break;
  33. }
  34. }

O dziwo działa. Przedtem nie ustawiałem czasu życia ciasteczka i nadpisywało go cały czas.
trueblue
Umiejscowienie w sensie problemu, owszem, jest logiczne, natomiast nielogicznym jest umieszczanie go tam, bo w ten sposób nadpisujesz sesję, choć z Twojego opisu można wywnioskować, że nadpisywanie dokonuje się w momencie porównania.
Kod powinieneś ustawiać po warunku sprawdzania.

P.S. A jak generujesz kod do przepisania dla użytkownika?
Salvation
Cytat(trueblue @ 15.07.2014, 18:19:27 ) *
(...) P.S. A jak generujesz kod do przepisania dla użytkownika?

index.php
  1. include 'scripts/gencode.php';
  2. $_SESSION['code'] = gen(6);

gencode.php
  1. <?php
  2. function gen($int){
  3. $tab = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','w','v','x','y','z',1,2,3,4,5,6,7,8,9,0);
  4. $code = NULL;
  5. for($i = 0; $i < $int; $i++){
  6. $code .= $tab[rand(0,count($tab)-1)];
  7. }
  8. return $code;
  9. }
  10. ?>

Nie wiem czy zauważyłeś, ale rozwiązałem swój problem wink.gif

Temat można zamknąć wink.gif
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.