add this to git finally
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
db
|
||||
.php-*
|
||||
REPORT_CONTENTS
|
214
database.php
Normal file
214
database.php
Normal file
@ -0,0 +1,214 @@
|
||||
<?php
|
||||
|
||||
include_once 'utils.php';
|
||||
|
||||
$RESULT_MODE = SQLITE3_BOTH;
|
||||
|
||||
session_start();
|
||||
|
||||
function connectToRedis()
|
||||
{
|
||||
$redis_host = '127.0.0.1';
|
||||
$redis_port = 6379;
|
||||
|
||||
try {
|
||||
$redis = new Redis();
|
||||
if ($redis->connect($redis_host, $redis_port)) {
|
||||
/* if ($redis_password) { */
|
||||
/* $redis->auth($redis_password); */
|
||||
/* } */
|
||||
return $redis;
|
||||
}
|
||||
return false;
|
||||
} catch (Exception $e) {
|
||||
error_log("Redis connection error: ".$e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function initializeNewUser()
|
||||
{
|
||||
$redis = connectToRedis();
|
||||
if (!$redis) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$user_id = generateUUID();
|
||||
|
||||
$redis->hSet('users', $user_id, json_encode([
|
||||
'created_at' => time(),
|
||||
'status' => 'active'
|
||||
]));
|
||||
|
||||
$db_file = "db/$user_id.db";
|
||||
$db = new SQLite3($db_file);
|
||||
|
||||
$schema_sql = file_get_contents('db/schema.sql');
|
||||
if (!$schema_sql) {
|
||||
error_log("Failed to read schema file: $schema_path");
|
||||
return false;
|
||||
}
|
||||
|
||||
$db->exec($schema_sql);
|
||||
|
||||
if (!$db) {
|
||||
// Cleanup Redis entry if db creation fails
|
||||
$redis->hDel('users', $user_id);
|
||||
return false;
|
||||
}
|
||||
$db->close();
|
||||
|
||||
return ["user_id" => $user_id, "db_file" => "db/$user_id.db"];
|
||||
}
|
||||
|
||||
function initializeApp($existing_user_id = null)
|
||||
{
|
||||
if ($existing_user_id) {
|
||||
/* $_SESSION["user_id"] = $existing_user_id; */
|
||||
} else {
|
||||
return initializeNewUser();
|
||||
}
|
||||
}
|
||||
|
||||
function getDB($user_id = null)
|
||||
{
|
||||
if (!is_null($user_id)) {
|
||||
$db_file = "db/$user_id.db";
|
||||
if (!file_exists($db_file)) {
|
||||
return createUserDatabase($user_id);
|
||||
}
|
||||
return new SQLite3($db_file);
|
||||
}
|
||||
}
|
||||
|
||||
function registerUser($username, $email, $password)
|
||||
{
|
||||
$db = getDB($_COOKIE['user_id']);
|
||||
$query = "INSERT INTO users(username, email, password) values ('$username', '$email', '$password');";
|
||||
|
||||
return $db->exec($query);
|
||||
}
|
||||
|
||||
function loginUser($email, $password)
|
||||
{
|
||||
global $RESULT_MODE;
|
||||
$db = getDB($_COOKIE['user_id']);
|
||||
$query = "SELECT username, password FROM users WHERE email = '$email';";
|
||||
$result = $db->query($query)->fetchArray($RESULT_MODE);
|
||||
if ($result["password"] === $password) {
|
||||
return $result['username'];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function getUserById($id)
|
||||
{
|
||||
global $RESULT_MODE;
|
||||
$db = getDB($_COOKIE['user_id']);
|
||||
$query = "SELECT username, email FROM users WHERE id = $id";
|
||||
try {
|
||||
$result = $db->query($query);
|
||||
return $result->fetchArray($RESULT_MODE);
|
||||
} catch (Exception $e) {
|
||||
$_SESSION['error_message'] = $e->getMessage()."\n";
|
||||
}
|
||||
}
|
||||
|
||||
function createProduct($title, $amountInStock)
|
||||
{
|
||||
$db = getDB($_COOKIE['user_id']);
|
||||
$query = "INSERT INTO products(title, amount_in_stock) values ('$title', $amountInStock)";
|
||||
|
||||
try {
|
||||
return $db->exec($query);
|
||||
} catch (Exception $e) {
|
||||
$_SESSION['error_message'] = $e->getMessage()."\n";
|
||||
}
|
||||
}
|
||||
|
||||
function getProductsByTitle($title)
|
||||
{
|
||||
global $RESULT_MODE;
|
||||
|
||||
$db = getDB($_COOKIE['user_id']);
|
||||
$query = "SELECT * FROM products WHERE title like '".$title."%'";
|
||||
|
||||
error_log($query, 0);
|
||||
try {
|
||||
$result = $db->query($query);
|
||||
if ($result === false) {
|
||||
error_log("{$db->lastErrorCode()}", 0);
|
||||
throw new Exception($db->lastErrorMsg());
|
||||
}
|
||||
|
||||
$products = [];
|
||||
while ($row = $result->fetchArray($RESULT_MODE)) {
|
||||
$products[] = $row;
|
||||
}
|
||||
return $products;
|
||||
} catch (Exception $e) {
|
||||
$_SESSION['error_message'] = $e->getMessage()."\n";
|
||||
}
|
||||
}
|
||||
|
||||
function getAllProducts()
|
||||
{
|
||||
global $RESULT_MODE;
|
||||
|
||||
$db = getDB($_COOKIE['user_id']);
|
||||
$query = "SELECT * FROM products";
|
||||
|
||||
try {
|
||||
$result = $db->query($query);
|
||||
$products = [];
|
||||
while ($row = $result->fetchArray($RESULT_MODE)) {
|
||||
$products[] = $row;
|
||||
}
|
||||
return $products;
|
||||
} catch (Exception $e) {
|
||||
$_SESSION['error_message'] = $e->getMessage()."\n";
|
||||
}
|
||||
}
|
||||
|
||||
function deleteProductByTitle($title)
|
||||
{
|
||||
$db = getDB($_COOKIE['user_id']);
|
||||
$query = "DELETE FROM products where title='$title'";
|
||||
|
||||
try {
|
||||
return $db->exec($query);
|
||||
} catch (Exception $e) {
|
||||
$_SESSION['error_message'] = $e->getMessage()."\n";
|
||||
}
|
||||
}
|
||||
|
||||
function getOrdersForUser($userId)
|
||||
{
|
||||
global $RESULT_MODE;
|
||||
|
||||
$db = getDB($_COOKIE['user_id']);
|
||||
$query = "SELECT * FROM orders WHERE user_id = $userId";
|
||||
|
||||
try {
|
||||
$result = $db->query($query);
|
||||
return $result->fetchArray($RESULT_MODE);
|
||||
} catch (Exception $e) {
|
||||
$_SESSION['error_message'] = $e->getMessage()."\n";
|
||||
}
|
||||
}
|
||||
|
||||
function getOrdersForProduct($productId)
|
||||
{
|
||||
global $RESULT_MODE;
|
||||
|
||||
$db = getDB($_COOKIE['user_id']);
|
||||
$query = "SELECT * FROM orders WHERE product_id = $productId";
|
||||
|
||||
try {
|
||||
$result = $db->query($query);
|
||||
return $result->fetchArray($RESULT_MODE);
|
||||
} catch (Exception $e) {
|
||||
$_SESSION['error_message'] = $e->getMessage()."\n";
|
||||
}
|
||||
}
|
40
header.php
Normal file
40
header.php
Normal file
@ -0,0 +1,40 @@
|
||||
<header>
|
||||
<nav class="nav-links">
|
||||
<a href="/users">Users</a>
|
||||
<a href="/products">Products</a>
|
||||
<a href="/orders">Orders</a>
|
||||
</nav>
|
||||
|
||||
<div class="auth-section">
|
||||
<?php
|
||||
session_start(); if(isset($_SESSION['username']) && !empty($_SESSION['username'])): ?>
|
||||
<div class="user-info">
|
||||
<span class="username">Welcome, <?=htmlspecialchars($_SESSION['username'])?></span>
|
||||
<a href="/logout" class="logout-link">Log out</a>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<?php if (isset($_SESSION['error_message'])): ?>
|
||||
<p style="color: red; text-align: center;"><?= $_SESSION['error_message'] ?></p>
|
||||
<?php endif; ?>
|
||||
<form id="authenticate-form" action="/login" method="post">
|
||||
<input type="text" name="username" placeholder="Username (*for registration*)">
|
||||
<input type="text" name="email" placeholder="Email" required>
|
||||
<input type="password" name="password" placeholder="Password" required>
|
||||
<button type="button" onclick="submitForm('login');">Login</button>
|
||||
<button type="button" class="register-btn" onclick="submitForm('register');">Register</button>
|
||||
</form>
|
||||
<script>
|
||||
function submitForm(action) {
|
||||
const form = document.getElementById('authenticate-form');
|
||||
|
||||
form.action = `/${action}`;
|
||||
if (form.checkValidity()) {
|
||||
form.submit();
|
||||
} else {
|
||||
form.reportValidity();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</header>
|
122
index.css
Normal file
122
index.css
Normal file
@ -0,0 +1,122 @@
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 10px;
|
||||
}
|
||||
.product {
|
||||
background: #f5f5f5;
|
||||
padding: 15px;
|
||||
margin-bottom: 10px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
label {
|
||||
display: block;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
input, textarea, select {
|
||||
width: 100%;
|
||||
padding: 8px;
|
||||
margin-bottom: 10px;
|
||||
max-width: 400px;
|
||||
}
|
||||
button {
|
||||
padding: 0.5rem 1rem;
|
||||
background: #4CAF50;
|
||||
color: white;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
border-radius: 3px;
|
||||
text-decoration: none;
|
||||
display: inline-block;
|
||||
}
|
||||
button:hover {
|
||||
background-color: #45a049;
|
||||
}
|
||||
.delete {
|
||||
background: #f44336;
|
||||
}
|
||||
.search {
|
||||
background: #2196F3;
|
||||
}
|
||||
.warning {
|
||||
color: #f44336;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
header {
|
||||
background-color: #333;
|
||||
color: white;
|
||||
padding: 1rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.nav-links {
|
||||
display: flex;
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.nav-links a {
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.nav-links a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.auth-section {
|
||||
display: flex;
|
||||
align-items: start;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
#authenticate-form {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
#authenticate-form input {
|
||||
padding: 0.5rem;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.register-btn {
|
||||
background-color: #2196F3;
|
||||
}
|
||||
|
||||
.register-btn:hover {
|
||||
background-color: #0b7dda;
|
||||
}
|
||||
|
||||
.user-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.username {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.logout-link {
|
||||
color: #ff9999;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.logout-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#product-forms {
|
||||
padding: 0px 10px;
|
||||
display: flex;
|
||||
|
||||
justify-content: space-between;
|
||||
}
|
49
index.php
Normal file
49
index.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
include_once 'database.php';
|
||||
|
||||
$request = $_SERVER['REQUEST_URI'];
|
||||
$path = parse_url($request, PHP_URL_PATH);
|
||||
|
||||
if (isset($_COOKIE["user_id"])) {
|
||||
error_log('cookie is set', 0);
|
||||
} else {
|
||||
error_log('cookie is NOT set', 0);
|
||||
$ids = initializeApp(null);
|
||||
setcookie("user_id", $ids["user_id"], time() + 3600, "/");
|
||||
setcookie("db_file", $ids["db_file"], time() + 3600, "/");
|
||||
|
||||
$_COOKIE["user_id"] = $ids["user_id"];
|
||||
$_COOKIE["db_file"] = $ids["db_file"];
|
||||
}
|
||||
|
||||
/* TODO: remove for prod code */
|
||||
$file_path = __DIR__.$request;
|
||||
$extension = pathinfo($file_path, PATHINFO_EXTENSION);
|
||||
if ($extension === 'css') {
|
||||
header('Content-Type: text/css');
|
||||
readfile($file_path);
|
||||
exit;
|
||||
}
|
||||
/* TODO: remove for prod code */
|
||||
|
||||
switch($path) {
|
||||
case '': case '/': case '/products':
|
||||
require __DIR__.'/products.php';
|
||||
break;
|
||||
case '/login':
|
||||
require __DIR__.'/login.php';
|
||||
break;
|
||||
case '/register':
|
||||
require __DIR__.'/register.php';
|
||||
break;
|
||||
case '/logout':
|
||||
require __DIR__.'/logout.php';
|
||||
break;
|
||||
case '/orders':
|
||||
require __DIR__.'/orders.php';
|
||||
break;
|
||||
case '/users':
|
||||
require __DIR__.'/users.php';
|
||||
break;
|
||||
}
|
||||
?>
|
20
login.php
Normal file
20
login.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
include_once 'database.php';
|
||||
|
||||
session_start();
|
||||
|
||||
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
$email = $_POST["email"];
|
||||
$password = $_POST["password"];
|
||||
|
||||
$username = loginUser($email, $password);
|
||||
if (!is_null($username)) {
|
||||
$_SESSION['error_message'] = null;
|
||||
$_SESSION['username'] = $username;
|
||||
$_SESSION['email'] = $email;
|
||||
} else {
|
||||
$_SESSION['error_message'] = "Invalid email or password";
|
||||
}
|
||||
header("Location: /products");
|
||||
}
|
||||
?>
|
10
logout.php
Normal file
10
logout.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
session_start();
|
||||
/* $personalDb = "db/{$_SESSION["user_id"]}.db"; */ // TODO: put it in cookie
|
||||
/* if (file_exists($personalDb)) { */
|
||||
/* unlink($personalDb); */
|
||||
/* } */
|
||||
session_unset();
|
||||
session_destroy();
|
||||
header("Location: /products");
|
||||
?>
|
13
orders.php
Normal file
13
orders.php
Normal file
@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Orders - WIP</title>
|
||||
<link rel="stylesheet" href="index.css">
|
||||
</head>
|
||||
<body>
|
||||
<?php include 'header.php'; ?>
|
||||
<h1>Orders - Work in progress!</h1>
|
||||
</body>
|
||||
</html>
|
73
products.php
Normal file
73
products.php
Normal file
@ -0,0 +1,73 @@
|
||||
<?php
|
||||
include_once 'database.php';
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
if ($method === 'POST') {
|
||||
if (isset($_POST['create'])) {
|
||||
$title = $_POST['title'];
|
||||
$amountInStock = $_POST['in_stock'];
|
||||
createProduct($title, $amountInStock);
|
||||
}
|
||||
} elseif ($method === 'GET') {
|
||||
if (isset($_GET["title"])) {
|
||||
$title = $_GET["title"];
|
||||
}
|
||||
if (!is_null($title)) {
|
||||
$products = getProductsByTitle($title);
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($products)) {
|
||||
$products = getAllProducts();
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Products page</title>
|
||||
<link rel="stylesheet" href="index.css">
|
||||
</head>
|
||||
<body>
|
||||
<?php include 'header.php'; ?>
|
||||
<div id="product-forms">
|
||||
<div id="add-product">
|
||||
<h2>Add new Product</h2>
|
||||
<form method="POST">
|
||||
<label for "title">Title:</label>
|
||||
<input type="text" name="title" required>
|
||||
|
||||
<label for "in_stock">Amount in stock:</label>
|
||||
<input type="text" name="in_stock" required>
|
||||
|
||||
<br>
|
||||
<button type="submit" name="create">Create product</button>
|
||||
</form>
|
||||
</div>
|
||||
<div id="search-product-by-title">
|
||||
<h2>Find product by title</h2>
|
||||
<form method="GET" action="/products">
|
||||
<label for "title">Title:</label>
|
||||
<input type="text" name="title" required>
|
||||
|
||||
<br>
|
||||
<button type="submit">Search</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2>Products:</h2>
|
||||
<?php if (empty($products)): ?>
|
||||
<p>No products found.</p>
|
||||
<?php else: ?>
|
||||
<?php foreach ($products as $prod): ?>
|
||||
<div class="product">
|
||||
<h3><?= $prod[1] ?></h3>
|
||||
<p>In stock: <?= $prod[2] ?> items</p>
|
||||
<p><strong>ID: <?= $prod[0] ?></strong></p>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</body>
|
||||
</html>
|
21
register.php
Normal file
21
register.php
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
include_once 'database.php';
|
||||
|
||||
session_start();
|
||||
|
||||
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
$username = $_POST["username"];
|
||||
$email = $_POST["email"];
|
||||
$password = $_POST["password"];
|
||||
|
||||
$result = registerUser($username, $email, $password);
|
||||
if ($result) {
|
||||
$_SESSION['error_message'] = null;
|
||||
$_SESSION['username'] = $username;
|
||||
$_SESSION['email'] = $email;
|
||||
} else {
|
||||
$_SESSION['error_message'] = "User with this username already exists!";
|
||||
}
|
||||
header("Location: /products");
|
||||
}
|
||||
?>
|
167
tutorial.php
Normal file
167
tutorial.php
Normal file
@ -0,0 +1,167 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Vulnerability testing</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Welcome to vulnerability testing! Powered by PHP!</h1>
|
||||
<?= 'Hello world!' ?>
|
||||
<?php
|
||||
// datatypes are inferred at runtime
|
||||
$name = "John";
|
||||
$age = 30;
|
||||
$height = 1.85;
|
||||
$isActive = true;
|
||||
$skills = ["PHP", "JS"];
|
||||
$person = null;
|
||||
|
||||
echo nl2br("\n\n");
|
||||
var_dump($skills);
|
||||
?>
|
||||
|
||||
<?php
|
||||
// type juggling
|
||||
$a = "5";
|
||||
$b = 2;
|
||||
|
||||
$c = $a+$b;
|
||||
|
||||
echo nl2br("\n\ntype juggling:\n");
|
||||
var_dump($c); // whaddaya think? of course, it's int(7)
|
||||
?>
|
||||
|
||||
<?php
|
||||
if ($age > 18) {
|
||||
echo "Adult";
|
||||
} elseif ($age > 12) {
|
||||
echo "Teenager";
|
||||
} else {
|
||||
echo "Child";
|
||||
}
|
||||
echo nl2br("\n\n");
|
||||
|
||||
switch($day) {
|
||||
case "Monday":
|
||||
echo "Start of week";
|
||||
break;
|
||||
case "Friday":
|
||||
echo "End of week";
|
||||
break;
|
||||
default:
|
||||
echo "Mid-week";
|
||||
}
|
||||
echo nl2br("\n\n");
|
||||
|
||||
for ($i = 0; $i < 5; $i++) {
|
||||
echo $i;
|
||||
}
|
||||
echo nl2br("\n\n");
|
||||
|
||||
$fruits = ["apple", "banana", "orange"];
|
||||
|
||||
foreach($fruits as $fruit) {
|
||||
echo $fruit;
|
||||
}
|
||||
echo nl2br("\n\n");
|
||||
|
||||
foreach($fruits as $index => $fruit) {
|
||||
echo "$index: $fruit";
|
||||
}
|
||||
echo nl2br("\n\n");
|
||||
|
||||
$i = 0;
|
||||
while ($i < 5) {
|
||||
echo $i++;
|
||||
}
|
||||
echo nl2br("\n\n");
|
||||
?>
|
||||
|
||||
<?php
|
||||
$name = "John";
|
||||
$age = 20;
|
||||
|
||||
echo "Hello, $name! You are $age years old!";
|
||||
|
||||
// for complex, use squirly braces {}
|
||||
/* echo "Hello, {$name}! In 5 years, you'll be {$age + 5} years old."; */ // HACK: doesn't work for some way?
|
||||
|
||||
// NOTE: single quote strings don't interpolate!!!
|
||||
echo nl2br("\n\n");
|
||||
?>
|
||||
|
||||
<?php
|
||||
function greet($name, $greeting = "Hello") {
|
||||
return "$greeting, $name!";
|
||||
}
|
||||
|
||||
echo greet("John");
|
||||
echo greet("Mary", "Hi");
|
||||
|
||||
$multiply = function($a, $b) {
|
||||
return $a * $b;
|
||||
};
|
||||
|
||||
echo $multiply(3,4);
|
||||
echo nl2br("\n\n");
|
||||
?>
|
||||
|
||||
<?php
|
||||
class Person {
|
||||
public $name;
|
||||
private $age;
|
||||
|
||||
public function __construct($name, $age) {
|
||||
$this->name = $name;
|
||||
$this->age = $age;
|
||||
}
|
||||
|
||||
public function greet() {
|
||||
return "Hello, my name is {$this->name} and I'm {$this->age} years old.";
|
||||
}
|
||||
|
||||
public function getAge() {
|
||||
return $this->age;
|
||||
}
|
||||
}
|
||||
|
||||
$person = new Person("John", 30);
|
||||
echo $person->greet();
|
||||
echo $person->getAge();
|
||||
echo nl2br("\n\n");
|
||||
?>
|
||||
|
||||
<?php
|
||||
$fruits = ["apple", "banana", "orange"];
|
||||
echo $fruits[0];
|
||||
echo nl2br("\n");
|
||||
|
||||
$person = [
|
||||
"name" => "John",
|
||||
"age" => 30,
|
||||
"city" => "NewYork"
|
||||
];
|
||||
echo $person["name"];
|
||||
echo nl2br("\n");
|
||||
|
||||
$users = [
|
||||
["name" => "John", "age" => 30],
|
||||
["name" => "Mary", "age" => 25],
|
||||
];
|
||||
echo $users[1]["name"];
|
||||
echo nl2br("\n");
|
||||
|
||||
$fruits[] = "grape"; // add item to the end
|
||||
$person["job"] = "developer"; // add new K-V pair
|
||||
|
||||
$count = count($fruits);
|
||||
$exists = in_array("apple", $fruits);
|
||||
sort($fruits);
|
||||
$keys = array_keys($person);
|
||||
$values = array_values($person);
|
||||
|
||||
echo nl2br("\n\n");
|
||||
?>
|
||||
</body>
|
||||
</html>
|
13
users.php
Normal file
13
users.php
Normal file
@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Users - WIP</title>
|
||||
<link rel="stylesheet" href="index.css">
|
||||
</head>
|
||||
<body>
|
||||
<?php include 'header.php'; ?>
|
||||
<h1>Users - Work in progress!</h1>
|
||||
</body>
|
||||
</html>
|
15
utils.php
Normal file
15
utils.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
function generateUUID()
|
||||
{
|
||||
// Generate 16 random bytes
|
||||
$data = random_bytes(16);
|
||||
|
||||
// Set version to 0100 (UUID v4)
|
||||
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
|
||||
// Set bits 6-7 to 10
|
||||
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
|
||||
|
||||
// Format the UUID
|
||||
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
|
||||
}
|
||||
?>
|
Reference in New Issue
Block a user