Webbserver - Love Blomberg

Show sourcecode

The following files exists in this folder. Click to view.

public_html/crumbs/

.gitignore
admin/
config.php
createtable.php
crumbs_design_system.html
dbconnection.php
icons/
includes/
index.php
js/
login.php
logout.php
order/
register.php
style/

register.php

146 lines UTF-8 Windows (CRLF)
<?php
session_start
();

$message null;
$messageClass 'alert-warning';

if (
  isset(
$_POST['username']) && isset($_POST['password']) &&
  !empty(
$_POST['username']) && !empty($_POST['password'])
) {
  
// Input variablar, hämta från POST
  
$username trim($_POST['username']);
  
$fullname trim($_POST['fullname'] ?? '');
  
$password $_POST['password'];
  
$email trim($_POST['email'] ?? '');
  
$phone trim($_POST['phone'] ?? '');

  
// SÄKERHET: Validera indata på serversidan (klientsidan kan kringgås)
  
$errors = [];
  if (
strlen($password) < 4) {
    
$errors[] = "Lösenordet måste vara minst 4 tecken.";
  }
  if (!empty(
$email) && !filter_var($emailFILTER_VALIDATE_EMAIL)) {
    
$errors[] = "Ogiltig e-postadress.";
  }

  if (empty(
$errors)) {
    
$passwordHash password_hash($passwordPASSWORD_DEFAULT);

    include(
'./dbconnection.php');
    if (!
$dbconn) {
      die(
"Connection failed: Can't connect to database.");
    }
    try {
      
// Skicka in variablar till databas
      
$sql "INSERT INTO users (username, fullname, password, email, phone) VALUES (?, ?, ?, ?, ?)";
      
$stmt $dbconn->prepare($sql);
      
$data = array($username$fullname$passwordHash$email$phone);
      
$stmt->execute($data);

      
// FÖRBÄTTRING: Spara meddelande i session så det visas efter redirect till login
      
$_SESSION['register_success'] = "Konto skapat! Du kan nu logga in.";
      
header('Location: ./login.php');
      die();
    } catch (
PDOException $e) {
      
// SÄKERHET: Visa inte detaljerade databasfel för användaren (avslöjar intern information)
      
error_log("register error: " $e->getMessage());
      
$messageClass 'alert-error';
      
$message "Ett fel uppstod vid registreringen. Försök igen.";
    }

    
$dbconn null;
  }

  if (!empty(
$errors)) {
    
$messageClass 'alert-error';
    
$message implode(' '$errors);
  }
}
?>

<!DOCTYPE html>
<html lang="sv">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Registrera - Crumbs</title>
  <link rel="shortcut icon" href="./icons/cookie_24dp_E3E3E3_FILL0_wght400_GRAD0_opsz24.svg" type="image/svg">
  <link rel="stylesheet" href="./style/stylesheet.css">
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
</head>

<body>
  <div class="auth-wrapper">
    <div class="auth-card">
      <div class="auth-header">
        <span class="material-symbols-rounded">person_add</span>
        <h1>Registrera</h1>
        <p>Skapa ett nytt konto för att börja beställa.</p>
      </div>

      <!-- Visa felmeddelande -->
      <?php if ($message): ?>
        <div class="alert <?= $messageClass ?>"><?= $message ?></div>
      <?php endif; ?>

      <!-- Registreringsformulär -->
      <form method="post" action="">
        <div class="form-group">
          <label for="username">Användarnamn *</label>
          <div class="input-wrapper">
            <input type="text" id="username" name="username" maxlength="32" required placeholder="Välj ett användarnamn">
            <span class="char-count">32</span>
          </div>
        </div>
        <div class="form-group">
          <label for="fullname">Namn</label>
          <div class="input-wrapper">
            <input type="text" id="fullname" name="fullname" maxlength="64" required placeholder="För- och Efternamn (Valfritt)">
            <span class="char-count">64</span>
          </div>
        </div>
        <div class="form-group">
          <label for="email">E-post *</label>
          <div class="input-wrapper">
            <input type="email" id="email" name="email" maxlength="64" required autocomplete="email" placeholder="namn@exempel.se">
            <span class="char-count">64</span>
          </div>
        </div>
        <div class="form-group">
          <label for="phone">Telefon</label>
          <div class="input-wrapper">
            <input type="tel" id="phone" name="phone" maxlength="20" autocomplete="tel" placeholder="+46 70 123 45 78">
            <span class="char-count">20</span>
          </div>
        </div>
        <div class="form-group">
          <label for="password">Lösenord *</label>
          <div class="input-wrapper">
            <input type="password" id="password" name="password" maxlength="32" required autocomplete="new-password" placeholder="Minst 4 tecken">
            <span class="char-count">32</span>
          </div>
        </div>

        <p class="meta" style="margin-bottom: 12px;">* = Obligatoriskt fält</p>

        <div class="actions">
          <button type="submit" class="btn btn-success" style="flex:1">
            <span class="material-symbols-rounded">how_to_reg</span>
            Registrera
          </button>
        </div>
        <div style="text-align:center; margin-top: 16px;">
          <a href="./login.php" class="meta" style="color: var(--primary);">
            Har redan ett konto? Logga in
          </a>
        </div>
      </form>
    </div>
  </div>

  <script src="./js/charcount.js"></script>
</body>

</html>