Que són les consultes?: Les consultes són instruccions escrites en un llenguatge específic (SQL en aquest cas) que serveix per donar instruccions a una base de dades per demanar-li que faci una acció concreta.
# Codi app.py
from flask import Flask, request, render_template_string, redirect, url_for, flash
import sqlite3
app = Flask(__name__)
app.secret_key = 'lan_party_secret_catalunya'
DB_NAME = 'lan_party_v2.db'
# --- Configuració de la Base de Dades ---
def init_db():
with sqlite3.connect(DB_NAME) as conn:
conn.execute('''
CREATE TABLE IF NOT EXISTS assistents (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nom TEXT NOT NULL,
cognoms TEXT NOT NULL,
nickname TEXT NOT NULL,
email TEXT NOT NULL,
telefon TEXT NOT NULL,
dni TEXT NOT NULL,
dies TEXT NOT NULL,
intolerancies TEXT
)
''')
print("Base de dades preparada amb tots els camps.")
# --- Plantilla HTML + CSS (Disseny Gamer Modern) ---
HTML_TEMPLATE = '''
<!DOCTYPE html>
<html lang="ca">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Registre LAN Party</title>
<style>
:root {
--neon-blue: #00f2ff;
--neon-purple: #bc13fe;
--bg-color: #0d0d0d;
}
body {
font-family: 'Segoe UI', Tahoma, sans-serif;
background-color: var(--bg-color);
color: white;
display: flex;
justify-content: center;
padding: 40px 20px;
margin: 0;
}
.container {
background: #1a1a1a;
padding: 30px;
border-radius: 15px;
box-shadow: 0 0 20px var(--neon-blue);
width: 100%;
max-width: 500px;
}
h2 { text-align: center; color: var(--neon-blue); text-transform: uppercase; margin-bottom: 25px; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-size: 0.9rem; color: #ccc; }
input[type="text"], input[type="email"], input[type="tel"], textarea {
width: 100%;
padding: 10px;
background: #2a2a2a;
border: 1px solid var(--neon-purple);
color: white;
border-radius: 5px;
box-sizing: border-box;
}
.days-group {
display: flex;
gap: 15px;
background: #2a2a2a;
padding: 10px;
border-radius: 5px;
border: 1px solid var(--neon-purple);
}
.day-option { display: flex; align-items: center; gap: 5px; cursor: pointer; }
button {
width: 100%;
padding: 15px;
background: var(--neon-purple);
border: none;
color: white;
font-weight: bold;
text-transform: uppercase;
cursor: pointer;
border-radius: 5px;
margin-top: 20px;
transition: 0.3s;
}
button:hover { background: var(--neon-blue); color: black; }
.success-msg {
background: rgba(0, 255, 136, 0.2);
color: #00ff88;
padding: 10px;
border-radius: 5px;
text-align: center;
margin-bottom: 20px;
}
.admin-link { display: block; text-align: center; margin-top: 15px; color: #666; text-decoration: none; font-size: 0.8rem; }
</style>
</head>
<body>
<div class="container">
<h2>🎮 INSCRIPCIÓ LAN PARTY</h2>
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for msg in messages %} <div class="success-msg">{{ msg }}</div> {% endfor %}
{% endif %}
{% endwith %}
<form method="POST">
<div class="form-group">
<label>Nom</label>
<input type="text" name="nom" required>
</div>
<div class="form-group">
<label>Cognoms</label>
<input type="text" name="cognoms" required>
</div>
<div class="form-group">
<label>Nom d'usuari (Nickname)</label>
<input type="text" name="nickname" placeholder="Ex: ProGamer99" required>
</div>
<div class="form-group">
<label>Correu electrònic</label>
<input type="email" name="email" required>
</div>
<div class="form-group">
<label>Número de telèfon</label>
<input type="tel" name="telefon" required>
</div>
<div class="form-group">
<label>DNI / NIE</label>
<input type="text" name="dni" required>
</div>
<div class="form-group">
<label>Quins dies assistiràs?</label>
<div class="days-group">
<label class="day-option"><input type="checkbox" name="dies" value="10"> Dia 10</label>
<label class="day-option"><input type="checkbox" name="dies" value="11"> Dia 11</label>
<label class="day-option"><input type="checkbox" name="dies" value="12"> Dia 12</label>
</div>
</div>
<div class="form-group">
<label>Intoleràncies o al·lèrgies</label>
<textarea name="intolerancies" rows="2" placeholder="Ex: Celíac, fruits secs..."></textarea>
</div>
<button type="submit">Finalitzar Registre</button>
</form>
</div>
</body>
</html>
'''
# --- Lògica de Flask ---
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
nom = request.form['nom']
cognoms = request.form['cognoms']
nickname = request.form['nickname']
email = request.form['email']
telefon = request.form['telefon']
dni = request.form['dni']
# Obtenir llista de dies seleccionats i convertir-la en text
dies_llista = request.form.getlist('dies')
dies_text = ", ".join(dies_llista)
intolerancies = request.form['intolerancies']
with sqlite3.connect(DB_NAME) as conn:
conn.execute('''
INSERT INTO assistents (nom, cognoms, nickname, email, telefon, dni, dies, intolerancies)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
''', (nom, cognoms, nickname, email, telefon, dni, dies_text, intolerancies))
flash('Registre realitzat correctament! T\'esperem.')
return redirect(url_for('index'))
return render_template_string(HTML_TEMPLATE)
@app.route('/admin')
def admin():
with sqlite3.connect(DB_NAME) as conn:
cursor = conn.execute('SELECT * FROM assistents')
assistents = cursor.fetchall()
# Taula simple per veure els resultats
return f'''
<body style="background:#111; color:white; font-family:sans-serif; padding:20px;">
<h2>Llista d'assistents registrats</h2>
<table border="1" style="border-collapse:collapse; width:100%; text-align:left;">
<tr style="background:#333;">
<th>ID</th><th>Nom</th><th>Cognoms</th><th>Nick</th><th>Email</th><th>Telèfon</th><th>DNI</th><th>Dies</th><th>Intoleràncies</th>
</tr>
{"".join([f"<tr>{''.join([f'<td>{col}</td>' for col in row])}</tr>" for row in assistents])}
</table>
<br><a href="/" style="color:cyan;">Tornar al formulari</a>
</body>
'''
if __name__ == '__main__':
init_db()
app.run(debug=True)Les consultes que hi han al codi son:
conn.execute('''
CREATE TABLE IF NOT EXISTS assistents (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nom TEXT NOT NULL,
cognoms TEXT NOT NULL,
nickname TEXT NOT NULL,
email TEXT NOT NULL,
telefon TEXT NOT NULL,
dni TEXT NOT NULL,
dies TEXT NOT NULL,
intolerancies TEXT
)
''')Aquesta part del codi crea la taula a la base de dadas si no existeix amb el nom: assistents. Dins d’aquesta taula afegeix las seguents columnes: id, nom cognoms, nickname, email, telèfon, DNI, dies i intoleràncies.
conn.execute('''
INSERT INTO assistents (nom, cognoms, nickname, email, telefon, dni, dies, intolerancies)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
''', (nom, cognoms, nickname, email, telefon, dni, dies_text, intolerancies))El que fa aquesta consulta és que insereix a la taula assistents les files: nom, cognoms, nickname, email, telèfon, DNI, dies i intoleràncies. els ? es fan servir per seguretat, per evitar un atac anomenat SQL Injection.
L’altra consulta que hi ha a app.py és:
cursor = conn.execute('SELECT * FROM assistents')El que fa aquesta consulta és que selecciona totes les línies d’una taula que es diu assistents, l’asterisc significa totes les columnes.