• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pomóż znaleźć błąd w kodzie mającym zaktualizować nazwę gracza

Object Storage Arubacloud
0 głosów
168 wizyt
pytanie zadane 5 stycznia 2016 w PHP przez Bernard158S Nowicjusz (220 p.)

Dzień dobry :)

Byłbym bardzo wdzięczny, jeśli by ktoś zechciał poświęcić parę chwil na analizę i naprawę tego kodu, bo nie mam pojęcia gdzie szukać błędu. 


/*Plik 'game.php':*/

<div id="setwindow" title="Ustawienia" style="width: 600px; height: 400px; background-color: #050505; color: #00ffff;">
  <div class="setwindow-head">Ustawienia loginu i hasła</div>
  <div class="setwindow-body">
    <div>
      <div style="font-size: 19px;">Zmiana nazwy:</div>
      <div style="float: left; width: 200px; height: 70px;">
        Obecna nazwa użytkownika: <a style="color: #00ffff;"><?php echo $_SESSION['user']; ?></a>
      </div> 
      <div style="float: left; margin-left: 20px; width: 320px; height: 30px;">
        <form action="setnewlogin.php" id="zmiana-nazwy" method="post">
          Nowa nazwa: <input type="text" class="input-text1" name="chgname" placeholder="<?php echo $_SESSION['id']; ?>" />
          <input type="submit" name="submit-zmiana-nazwy" value="Zmień" class="input-button1" />
          <?php
          if (isset($_SESSION['err-username'])){
            echo '<div class="register-input-error">'.$_SESSION['err-username'].'</div>';
            unset ($_SESSION['err-username']);}
          if (isset($_SESSION['err1-username'])){
            echo '<div class="register-input-error">'.$_SESSION['err1-username'].'</div>';
            unset ($_SESSION['err1-username']);}
          if (isset($_SESSION['err2-username'])){
            echo '<div class="register-input-error">'.$_SESSION['err2-username'].'</div>';
            unset ($_SESSION['err2-username']);}
        ?>
        </form>
      </div>
      <div style="clear: both;"></div>
    </div>

/*A to plik zawierający skrypt mający zaktualizować nazwę w bazie danych 'setnewlogin.php':*/

<?php 
        session_start();
        require_once "connect.php";
        $polaczenie = new mysqli($host, $db_user, $db_password, $db_name);

        
        $id = $_SESSION['id'];

        if (isset($_POST['chgname']))
        {
          $chgname = $_POST['chgname'];
          $udalo_sie = true;

          if ((strlen($chgname)<4) || (strlen($chgname)>20))
          {
            $udalo_sie = false;
            $_SESSION['err-chgname'] = "Nazwa musi posiadać od 5 do 20 znaków!";
          }
          if (ctype_alnum($chgname)==false)
          {
            $udalo_sie = false;
            $_SESSION['err1-chgname'] = "Nazwa nie może zawierać polskich znaków ani cyfr!";
          }


          mysqli_report(MYSQLI_REPORT_STRICT);
        try 
        {
          $polaczenie = new mysqli($host, $db_user, $db_password, $db_name);
            if ($polaczenie->connect_errno!=0)
          {
            throw new Exception(mysqli_connect_errno());
          }
          else
          {
          $result = $polaczenie->query("SELECT user FROM uzytkownicy WHERE user = '$chgname'");
            if(!$result) throw new Exception($polaczenie->error);

            $ile_loginow = $result->num_rows;
            if($ile_loginow>0)
            {
              $udalo_sie = false;
              $_SESSION['err2-nickname'] = "Taka nazwa już istnieje!";
            }

            if ($udalo_sie == true)
            {
              if($polaczenie->query("UPDATE uzytkownicy SET user='$chgname' WHERE id='id'"))
              {
                $_SESSION['Uzytkownik-zarejestrowany'] = true;
                header('location: game.php');
              }
              else
              {
                throw new Exception($polaczenie->error);
              }
            }
            mysqli_close($polaczenie);
        }
      }
      catch(Exception $err)
    {
      echo '<span  style="position: absolute; color: red;">'."Błąd serwera. Przepraszamy za niedogodności.".'</span>';
      //echo '<br />Info dla dev.<br />'.$err;
    }
}

?>

 

Dziękuję i pozdrawiam, przepraszam za możliwą nieczytelność postu.. Uczę się ;)

2 odpowiedzi

+1 głos
odpowiedź 5 stycznia 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)
wybrane 5 stycznia 2016 przez Bernard158S
 
Najlepsza
if($polaczenie->query("UPDATE uzytkownicy SET user='$chgname' WHERE id='id'"))

Pewnie tu leży problem bo jako id podstawiasz tekst 'id' a wypadałoby raczej podstawić zmienną z rzeczywistym id użytkownika czyli $id.

Inna sprawa że nie widzę zabezpieczenia przed sql injection.

Jeszcze inna sprawa że funkcja strlen ma problem z polskimi znakami - jeśli więc ktoś wpisze do pola literkę "z ogonkiem" to źle ją policzy. Lepiej użyć funkcji mb_strlen() która nie ma takiego problemu.

A jeszcze inna sprawa to według mnie te błędy na sesjach głupio wyglądają i są bez sensu - wiem że pan Mirosław pokazywał robienie błędów na sesjach ale no dość śmiesznie i mało praktycznie to wygląda - wg mnie wystarczyłoby wysłać formularz do tego samego pliku, sprawdzić co trzeba i w razie potrzeby od razu wyświetlić błędy.

komentarz 5 stycznia 2016 przez Bernard158S Nowicjusz (220 p.)
Bardzo dziękuję za pomoc i uwagi, takie są bardzo potrzebne :) Jeśli możesz szepnąć jeszcze słowo, jak wysłać formularz do tego samego pliku?
komentarz 5 stycznia 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)
Pewnie że mogę, wystarczy w <form action=""> podać nazwę tego samego pliku czyli w Twoim przypadku z tego co podałeś game.php.

A żeby tam odebrać ten formularz wystarczy po prostu przenieść cały ten kod php z pliku setnewlogin.php i zmienić wyświetlanie błędów. Przykładowo zamiast sesji można przypisywać je do zwykłej zmiennej i później wyświetlić w odpowiednim miejscu.
komentarz 5 stycznia 2016 przez Bernard158S Nowicjusz (220 p.)

Dziękuję, zerknij sobie na to co zrobiłem do teraz

http://spacecraft.hol.es/spacecraft/index.php

komentarz 5 stycznia 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)
No jest okej, wygląda ciekawie :)

Co to będzie za serwis? Jakaś gra?
komentarz 5 stycznia 2016 przez Bernard158S Nowicjusz (220 p.)
To ma być gra przeglądarkowa, coś typu "The West", tylko że w kosmosie ;) Na razie nie wiem czy mi się uda, czy dotrwam, ale jestem dobrej myśli :)
komentarz 5 stycznia 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)
W takim razie trzymam kciuki i życzę powodzenia. Nie warto się poddawać bo czasem na prawdę coś fajnego może wyjść mimo trudności ;)
0 głosów
odpowiedź 5 stycznia 2016 przez jaca121212 Nałogowiec (40,760 p.)
Spróbuj zrobić to tak

 if($polaczenie->query("UPDATE uzytkownicy SET user='%s' WHERE id='%d'",$chgname,

$_SESSION['id']))

              {

                $_SESSION['Uzytkownik-zarejestrowany'] = true;

                header('location: game.php');

              }

Podobne pytania

0 głosów
0 odpowiedzi 222 wizyt
+1 głos
1 odpowiedź 512 wizyt
pytanie zadane 28 lipca 2021 w Java przez nowawtowarzystwie Nowicjusz (130 p.)
+1 głos
1 odpowiedź 267 wizyt
pytanie zadane 3 marca 2022 w PHP przez AnimaVillis Stary wyjadacz (11,350 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...