Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]kilka pytań odnośnie poprawnej sesji
Forum PHP.pl > Forum > Przedszkole
jobp33
Witam
Tworzę prostą aplikacje z logowanie i sesją. Jedno pyatanie zaznaczyłem jako komentarze w kodzie (wydaje mi się że chyba najlepsze rozwiązanie aby wytłumaczyć o co mi chodzi)
  1. <!DOCTYPE html>
  2.  
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>strona</title>
  6. </head>
  7. <body>
  8. <div>
  9.  
  10. <center>
  11. <br>
  12. <br>
  13. <font>LOGOWANIE</font>
  14. <br>
  15. <br>
  16.  
  17. <?php
  18.  
  19. $con = mysqli_connect('localhost', 'ja, 'ja', 'baza');
  20. if(mysqli_connect_errno()){
  21. echo mysqli_connect_error();
  22. exit();
  23. }
  24.  
  25. session_start();
  26.  
  27. if(isset($_POST['zaloguj'])){
  28. $login = $_POST['login'];
  29. $haslo= $_POST['haslo'];
  30.  
  31. $log = mysqli_query($con, 'select * from uzytkownicy where login = "'.$login.'" and haslo = "'.$haslo.'" ');
  32. //$res=$mysqli->query($log);
  33.  
  34. if(mysqli_num_rows($log)==1 || ){
  35. if("'.admin.'"==1){ <------Czy w ten sposób powinno się podawać zmienne z bazy danych których wartość ma sprawdzić?
  36. $_SESSION ['imie'] = $imie;
  37. $_SESSION ['nazwisko'] = $nazwisko; <----
  38. header ('Location:admin.php');
  39. }
  40. else{
  41. $_SESSION ['imie'] = $imie;
  42. $_SESSION ['nazwisko'] = $nazwisko;
  43. header ('Location:start.php');
  44. }
  45. }else{ echo "Błędny login lub hasło";
  46. }
  47.  
  48. if(isset($_GET['Wyloguj'])){
  49. session_unregister($login);
  50. }
  51. }
  52.  
  53. ?>
  54.  
  55. <form name="logowanie" method="POST">
  56. LOGIN <input type="text" name="login" value="" size="35" /><br>
  57. HASŁO <input type="password" name="haslo" value="" size="35" /><br>
  58. <input type="submit" value="Login" name="zaloguj" />
  59.  
  60.  
  61.  
  62. </form>
  63. </center>
  64.  
  65.  
  66. </body>
  67. </html>


Odnośnie linijki 36 i 37: Czy dzięki takiej konstrukcji program przechwyci konkretne dane z bazy i przypisze je do tych zmiennych dzieki czemu będe mógł się do nich odwoływać na innych plikach tego projektu? Np. na stronie admin czy ten zapisa ma sens
  1. echo 'Witamy '.$_SESSION['imie'];
?
Której składni lepiej używać mysql czy mysqli?
viking
O rozszerzeniu mysql zapomnij, zostało usunięte.

W linii 31 masz podatność na SQL Injection. Stosuj bindowanie parametrów. mysqli_query zwraca result http://php.net/manual/pl/class.mysqli-result.php więc musisz go jeszcze wybrać np. poprzez http://php.net/manual/pl/mysqli-result.fetch-assoc.php
header nie zadziała bo wysłałeś już tekst.
patwoj98
Tak jak kolega wyżej napisał - header nie pójdzie. Użyj ob_start() na samym początku.
Dodawaj slashe do danych, które współgrają z bazą.
Zdecyduj się czy używasz objektów czy strukturalnego. Wszystko robisz na strukturze i nagle object w 32 się pojawił.
Między 32, a 35 nie masz nic co by Ci tego admina do 35 pobrało. Musisz użyć fetch_assoc lub fetch_array.
Mysql nie używamy, a najlepiej teraz na PDO się przenosić już smile.gif
jobp33
Cytat(patwoj98 @ 14.12.2015, 18:50:58 ) *
Wszystko robisz na strukturze i nagle object w 32 się pojawił.


Z różnych jakiś rzeczy ktróre czytałem na temat MySQL i MySQLi to zrozumiałem, że MySQL to działania strukturalne a MySQLi to obiektowe (i jeszcze wspomniane przez ciebie PDO) więc jeśli jest inaczej czy ktoś by mógł jeszcze rozwinąć trochę tą kwestię? Bindowanie parametrów to już jest chyba PDO?
Pyton_000
mysqli_* ma też odpowiedniki strukturalne.

patwoj98
Tak jak napisał Pyton. Mysqli ma odpowiedniki strukturalne, gdzie chyba każdy różni się od mysql tylko literką i na końcu i podaniem nazwy połączenia. Ty cały czas działasz strukturalnie, aż do momentu 35 linijki gdzie się pojawia nagle jakiś object. Przerób sobie kod, aby był pod tym względem poprawny.
W samyn manualu już jest pokazane jak się łączyć i działać z mysqli objectowo. Nie wielka różnica, a lepiej wygląda i jest nowszym rozwiązaniem.
Pyton_000
Kolejna uwaga, oddzielaj kod HTML od PHP.
Wrzuć sobie formularz do jednego pliku, a całość wysyłaj do drugiego pliku.

Będziesz miał porządek i będziesz mógł łatwiej i klarowniej sterować przepływem tego co użytkownik robi.
viking
I jeszcze odnośnie bindowania parametrów: http://php.net/manual/pl/mysqli-stmt.bind-param.php
Oczywiście że jest też w mysqli.
jobp33
Czy po takim zabiegu on przechwyci poszczególne dane do sesji? Czemu akurat te? Robię aplikacje w stylu "gieldy ogloszeń" i chcę aby każde dodane ogłoszenie było z automatu podpisane (zalogowany jan kowalski to podpis dodał jan kowalski, napis witający itp ). W którym miejscu należy sprawdzić czy konto jest admina i czy ma upranienia do komentowania?
  1. <?php
  2.  
  3. $mysqli = new mysqli('localhost', 'ja', 'ja', 'baza');
  4.  
  5. if(mysqli_connect_errno()){
  6. echo mysqli_connect_error();
  7. exit();
  8. }
  9.  
  10.  
  11. if(isset($_POST['zaloguj'])){
  12. $login = $_POST['login'];
  13. $haslo= $_POST['haslo'];
  14.  
  15. $query = "SELECT * FROM uzytkownicy WHERE login = ".$login." AND haslo = ".$haslo."";
  16.  
  17. if($stmt = $mysqli->prepare($query)){
  18.  
  19. $stmt->execute();
  20.  
  21. $stmt->bind_result($imie, $nazwisko);
  22.  
  23. while ($stmt->fetch()){
  24.  
  25. $_SESSION ['imie'] = $imie;
  26. $_SESSION ['nazwisko'] = $nazwisko;
  27.  
  28. }
  29.  
  30. }
  31. }
  32.  
  33.  
  34. if(isset($_GET['Wyloguj'])){
  35. }
  36.  
  37.  
  38. ?>
viking
A zajrzałeś do dokumentacji, bo na pewno nie tak wygląda prepare i na pewno nie przekazanie zmiennych z POST bo to przed niczym nie chroni. Do tego login jest pewnie jeden więc ograniczaj zapytanie LIMIT 1. W ten sposób dostajesz 1 rekord w zwrotce który jest tym właściwym.
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.