Webbserver - Love Blomberg

Show sourcecode

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

public_html/crumbs/admin/products/

addproduct.php
deleteproduct.php
editproduct.php

addproduct.php

145 lines UTF-8 Windows (CRLF)
<?php
$basePath 
'../../';
$pageTitle 'Skapa Produkt';
$activePage 'addproduct';

// Handle form before header (need session for admin check within header)
session_start();
if (!isset(
$_SESSION['is_admin']) || $_SESSION['is_admin'] != 1) {
  
header('Location: ../../login.php');
  die();
}

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

if (
  isset(
$_POST['name']) && isset($_POST['price']) && isset($_POST['stock']) &&
  !empty(
$_POST['name']) && !empty($_POST['price']) && !empty($_POST['stock'])
) {
  
$name $_POST['name'];
  
$price $_POST['price'];
  
$description $_POST['description'];
  
$category $_POST['category'];
  
$image_url = !empty($_POST['image_url']) ? $_POST['image_url'] : 'https://i0.wp.com/unleash-gods-dream.com/wp-content/uploads/2023/03/placeholder-image-blue-square.png';
  
$stock $_POST['stock'];
  
$is_disabled = isset($_POST['is_disabled']) ? 0;

  
// SÄKERHET: Validera att pris och lager är positiva tal (klientsidan kan kringgås)
  
$errors = [];
  if (!
is_numeric($price) || $price 0) {
    
$errors[] = "Priset måste vara ett positivt tal.";
  }
  if (!
is_numeric($stock) || $stock 0) {
    
$errors[] = "Lagersaldot måste vara ett positivt tal.";
  }

  if (empty(
$errors)) {
    include(
'../../dbconnection.php');
    if (!
$dbconn) {
      die(
"Connection failed: Can't connect to database.");
    }
    try {
      
$sql "INSERT INTO products (name, price, description, category, image_url, stock, is_disabled)
          VALUES (?, ?, ?, ?, ?, ?, ?)"
;
      
$stmt $dbconn->prepare($sql);
      
$data = array($name$price$description$category$image_url$stock$is_disabled);
      
$stmt->execute($data);

      
$lastId $dbconn->lastInsertId();
      
$messageClass 'alert-success';
      
$message "Produkt skapad! ID: " . (int)$lastId;
    } catch (
PDOException $e) {
      
// SÄKERHET: Visa inte detaljerade databasfel (kan avslöja intern information)
      
error_log("addproduct error: " $e->getMessage());
      
$messageClass 'alert-error';
      
$message "Ett databasfel uppstod. Försök igen senare.";
    }
    
$dbconn null;
  } else {
    
$messageClass 'alert-error';
    
$message implode(' '$errors);
  }
  
$showMessage true;
}

include(
'../../includes/header.php');
?>

<div class="page-header">
  <div class="page-header-text">
    <h1>Skapa Produkt</h1>
    <p>Lägg till en ny produkt i menyn.</p>
  </div>
</div>

<?php if ($showMessage && $message): ?>
  <div class="alert <?= $messageClass ?>"><?= $message ?></div>
<?php endif; ?>

<div class="card">
  <h2><span class="material-symbols-rounded" style="font-size:20px; vertical-align:middle; margin-right:6px">add_box</span>Produktinformation</h2>
  <form method="post" action="">
    <table>
      <tr>
        <td>Namn *</td>
        <td class="input-wrapper">
          <input type="text" name="name" maxlength="32" required placeholder="Produktnamn">
          <span class="char-count">32</span>
        </td>
      </tr>
      <tr>
        <td>Pris (SEK) *</td>
        <td class="input-wrapper">
          <input type="number" name="price" min="0" maxlength="4" step="0.01" required placeholder="0">
          <span class="char-count">4</span>
        </td>
      </tr>
      <tr>
        <td>Beskrivning</td>
        <td class="input-wrapper">
          <textarea rows="5" style="resize: none;" name="description" id="description" maxlength="256" placeholder="Kort beskrivning"></textarea>
          <span class="char-count">256</span>
        </td>
      </tr>
      <tr>
        <td>Kategori</td>
        <td>
          <select name="category" id="category">
            <option value="none">Ingen</option>
            <option value="beverage">Dryck</option>
            <option value="food">Mat</option>
            <option value="material">Material</option>
          </select>
        </td>
      </tr>
      <tr>
        <td>Bild (URL)</td>
        <td><input type="url" name="image_url" placeholder="https://..."></td>
      </tr>
      <tr>
        <td>Lager *</td>
        <td>
          <input type="number" name="stock" maxlength="4" min="0" required placeholder="0">
          <span class="char-count">4</span>
        </td>
      </tr>
      <tr>
        <td>Inaktiv</td>
        <td><input type="checkbox" name="is_disabled"></td>
      </tr>
      <tr>
        <td class="meta">* = Obligatoriskt</td>
        <td>
          <button type="submit" class="btn btn-success">
            <span class="material-symbols-rounded">add</span>
            Lägg till
          </button>
        </td>
      </tr>
    </table>
  </form>
</div>

<?php include('../../includes/footer.php'); ?>