Data wordt niet opgeslagen

    • Data wordt niet opgeslagen

      Heey!

      Vraagje...

      Mijn script werkte voorheen, nu heb ik een paar velden toegevoegd (voornaam,tussenvoegsel,achternaam,woonplaats etc). Nu werkt het nog wel het wordt alleen niet in de database opgeslagen. Kan iemand mij uit de brand helpen?

      PHP Source Code

      1. <?php
      2. session_start();
      3. // initializing variables
      4. $username = "";
      5. $email = "";
      6. $straat = "";
      7. $voornaam = "";
      8. $tussenvoegsel = "";
      9. $achternaam = "";
      10. $huisnummer = "";
      11. $postcode = "";
      12. $woonplaats = "";
      13. $errors = array();
      14. // connect to the database
      15. $db = mysqli_connect('localhost', '******', '*****', '******');
      16. // REGISTER USER
      17. if (isset($_POST['reg_user'])) {
      18. // receive all input values from the form
      19. $username = mysqli_real_escape_string($db, $_POST['username']);
      20. $email = mysqli_real_escape_string($db, $_POST['email']);
      21. $password_1 = mysqli_real_escape_string($db, $_POST['password_1']);
      22. $password_2 = mysqli_real_escape_string($db, $_POST['password_2']);
      23. $voornaam = mysqli_real_escape_string($db, $_POST['voornaam']);
      24. $tussenvoegsel = mysqli_real_escape_string($db, $_POST['tussenvoegsel']);
      25. $achternaam = mysqli_real_escape_string($db, $_POST['achternaam']);
      26. $straat = mysqli_real_escape_string($db, $_POST['straat']);
      27. $huisnummer = mysqli_real_escape_string($db, $_POST['huisnummer']);
      28. $postcode = mysqli_real_escape_string($db, $_POST['postcode']);
      29. $woonplaats = mysqli_real_escape_string($db, $_POST['woonplaats']);
      30. // form validation: ensure that the form is correctly filled ...
      31. // by adding (array_push()) corresponding error unto $errors array
      32. if (empty($username)) { array_push($errors, "Gebruikersnaam is verplicht"); }
      33. if (empty($email)) { array_push($errors, "Email is verplicht"); }
      34. if (empty($voornaam)) { array_push($errors, "Voornaam is verplicht"); }
      35. if (empty($achternaam)) { array_push($errors, "Achternaam is verplicht"); }
      36. if (empty($straat)) { array_push($errors, "Straat is verplicht"); }
      37. if (empty($huisnummer)) { array_push($errors, "Huisnummer is verplicht"); }
      38. if (empty($postcode)) { array_push($errors, "Postcode is verplicht"); }
      39. if (empty($woonplaats)) { array_push($errors, "Woonplaats is verplicht"); }
      40. if (empty($password_1)) { array_push($errors, "Password is required"); }
      41. if ($password_1 != $password_2) {
      42. array_push($errors, "The two passwords do not match");
      43. }
      44. // first check the database to make sure
      45. // a user does not already exist with the same username and/or email
      46. $user_check_query = "SELECT * FROM users WHERE username='$username' OR email='$email' LIMIT 1";
      47. $result = mysqli_query($db, $user_check_query);
      48. $user = mysqli_fetch_assoc($result);
      49. if ($user) { // if user exists
      50. if ($user['username'] === $username) {
      51. array_push($errors, "Username already exists");
      52. }
      53. if ($user['email'] === $email) {
      54. array_push($errors, "email already exists");
      55. }
      56. }
      57. // Finally, register user if there are no errors in the form
      58. if (count($errors) == 0) {
      59. $password = md5($password_1);//encrypt the password before saving in the database
      60. $query = "INSERT INTO users (username,email,password,voornaam,tussenvoegsel,achternaam,straat,huisnummer,postcode,woonplaats,geboortedatum,geslacht)
      61. VALUES('$username', '$email', '$password', '$straat', '$huisnummer', '$postcode', '$woonplaats', '$voornaam', '$tussenvoegsel', '$achternaam', '$geslacht', '$geboortedatum')";
      62. mysqli_query($db, $query);
      63. $_SESSION['username'] = $username;
      64. $_SESSION['success'] = "You are now logged in";
      65. header('location: index.php');
      66. }
      67. }
      68. // LOGIN USER
      69. if (isset($_POST['login_user'])) {
      70. $username = mysqli_real_escape_string($db, $_POST['username']);
      71. $password = mysqli_real_escape_string($db, $_POST['password']);
      72. if (empty($username)) {
      73. array_push($errors, "Username is required");
      74. }
      75. if (empty($password)) {
      76. array_push($errors, "Password is required");
      77. }
      78. if (count($errors) == 0) {
      79. $password = md5($password);
      80. $query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
      81. $results = mysqli_query($db, $query);
      82. if (mysqli_num_rows($results) == 1) {
      83. $_SESSION['username'] = $username;
      84. $_SESSION['success'] = "You are now logged in";
      85. header('location: index.php');
      86. }else {
      87. array_push($errors, "Wrong username/password combination");
      88. }
      89. }
      90. }
      91. ?>
      Display All
    • EDIT: stap 0 is natuurlijk het controleren van je errorlogs, kun je hier iets in vinden?
      Ben je ook nagegaan dat $errors leeg is?

      password is een gereserveerd woord, dus wellicht zou die kolom tussen `backticks` moeten staan?

      Voor debugging zou je tijdelijk de header() kunnen verwijderen en mysqli_error() kunnen inspecteren.

      Zou het ook niet beter zijn om enkel een user id op te slaan in de sessie, en elke page-refresh de gebruikersinfo op te halen aan de hand van een id en dan een user object te bakken ofzo? In plaats van dit in je sessie te zetten. Elke keer als je je profiel bijwerkt houdt dit in de huidige opzet ook een potentiële administratieve bijwerkactie van je sessie in. En al die extra administratie is niet nodig als je de informatie gewoon elke pagina ververst (middels een on-the-fly berekend User object).

      Je controleert ook nergens of de query slaagt maar je gooit de nieuwe username zo bam in je sessie :D.

      Ook zou ik registratie en het inloggen zelf splitsen, anders wordt dit een onoverzichtelijke brei. En meer in het algemeen zou je je logica meer in aparte acties kunnen compartimenteren. Elke actie is dan toegespitst op één specifieke handeling. Hoe je dit aan zou kunnen pakken heb ik een blogpost beschreven.

      Daarnaast zou ik geen dingen als $_SESSION['success'] gebruiken, tenzij dit bedoeld is als een soort van flash message, in welk geval ik het $_SESSION['messages'] zou noemen ofzo, om de (zeer) tijdelijke aard van dit soort sessie-inhoud te benadrukken. Dit hele subarray zou ook direct de eerstvolgende page-access geleegd moeten worden nadat deze berichten zijn weergegeven op je pagina.

      Enne, md5() voor password hashing? :/

      Enne, na header('Location: ...') hoort ALTIJD een exit; te staan. Headers zijn onderdeel van output, dus nadat ergens middenin je code header('Location: ...') staat word je niet direct naar de nieuwe locatie getransporteerd, dat gebeurt pas aan het einde van het script. Het aanwezig zijn of het ontbreken van een exit-statement kan het verschil betekenen tussen veilige en onveilige code.

      Je bent gewaarschuwd :evil: .

      Voorbeeld:

      PHP Source Code

      1. <?php
      2. if (isset($_SESSION['some_required_value']) === false) {
      3. header('Location: elsewhere.php');
      4. }
      5. // gevoelige code die gegevens kan manipuleren
      6. // ...
      7. ?>
      Dit is wat er dan achtereenvolgens gebeurt bij aanroep van dit script:
      1. de Location header wordt ingesteld op "elsewhere.php"
      2. de code in het onderdeel "// gevoelige code die gegevens kan manipuleren" >>>WORDT UITGEVOERD <<<
      3. na afloop van het script word je direct doorgestuurd naar "elsewhere.php"

      Daarom is het handig/verstandig om hiervoor een functie/methode te hebben zodat je dit nooit meer per ongeluk vergeet:

      PHP Source Code

      1. <?php
      2. function redirect($link) {
      3. header('HTTP/1.1 303 See Other');
      4. header('Location: '.$link);
      5. exit; // opdat we dit NOOIT meer vergeten
      6. }
      7. ?>

      The post was edited 12 times, last by FangorN ().