Διαδικτυακός Προγραμματισμός - Τμήμα Ψηφιακών Συστημάτων
Μια HTML φόρμα είναι το κομμάτι μιας ιστοσελίδας που επιτρέπει στον χρήστη να εισάγει δεδομένα (π.χ. όνομα, email, σχόλια, επιλογές) και να τα στείλει (submit) για επεξεργασία — συνήθως σε ένα PHP ή server-side αρχείο.
Η φόρμα ξεκινά και τελειώνει με το στοιχείο <form>:
<form action="process.php" method="post">
<!-- εδώ μπαίνουν τα πεδία -->
</form>
Αυτά είναι τα "κουτάκια", "κουμπιά" και "πεδία" όπου γράφει ή επιλέγει ο χρήστης.
<input type="text" name="username" placeholder="Όνομα χρήστη">
<input type="email" name="user_email" required>
<input type="number" name="age" min="1" max="120">
<input type="password" name="user_password" required>
<input type="checkbox" name="subscribe" value="yes"> Εγγραφή στο newsletter
subscribe=yes.<input type="radio" name="gender" value="male"> Άνδρας
<input type="radio" name="gender" value="female"> Γυναίκα
name).<select name="product">
<option value="1">Προϊόν 1</option>
<option value="2">Προϊόν 2</option>
</select>
<textarea name="comments" rows="4" cols="30"></textarea>
Το στοιχείο <label> χρησιμοποιείται για να περιγράφει ή να "ονοματίζει" ένα στοιχείο φόρμας, όπως input, textarea, select κ.λπ.
Δηλαδή, λέει στον χρήστη τι πρέπει να συμπληρώσει και συνδέεται με το αντίστοιχο πεδίο.
Το label βοηθά:
ώστε να καταλαβαίνουν τι αφορά κάθε πεδίο.
Αν το label συνδεθεί με το πεδίο, τότε:
Π.χ. κλικ στο «Άνδρας» → επιλέγεται το radio button.
Η φόρμα γίνεται πιο καθαρή, οργανωμένη και επαγγελματική.
Υπάρχουν δύο τρόποι:
for και το id (ο πιο συχνός)<label for="email">Email:</label>
<input type="email" id="email" name="email">
for="email" δηλώνει ότι αυτό το label ανήκει στο input με id="email".💡 Δοκιμάστε να πατήσετε πάνω στο κείμενο "Email:" - το πεδίο θα ενεργοποιηθεί!
<label>
Email:
<input type="email" name="email">
</label>
Και αυτό λειτουργεί, αλλά χρησιμοποιείται πιο σπάνια.
<button type="submit">Αποστολή</button>
action.| Τύπος | Περιγραφή | Παράδειγμα |
|---|---|---|
| text | Απλό πεδίο κειμένου | <input type="text" name="firstname"> |
| Πεδίο email με έλεγχο | <input type="email" name="email"> | |
| password | Πεδίο κωδικού (κρυφοί χαρακτήρες) | <input type="password" name="pwd"> |
| number | Αριθμητικό πεδίο | <input type="number" name="age"> |
| checkbox | Τετραγωνάκι επιλογής | <input type="checkbox" name="agree"> |
| radio | Κύκλος επιλογής | <input type="radio" name="gender"> |
| date | Επιλογή ημερομηνίας | <input type="date" name="birthdate"> |
| file | Επιλογή αρχείου | <input type="file" name="upload"> |
| submit | Κουμπί υποβολής | <input type="submit" value="Αποστολή"> |
| reset | Κουμπί επαναφοράς | <input type="reset" value="Καθαρισμός"> |
Παρακάτω βλέπουμε μια πλήρη φόρμα εγγραφής που συνδυάζει όλα τα παραπάνω στοιχεία:
<!DOCTYPE html>
<html lang="el">
<head>
<meta charset="UTF-8">
<title>Φόρμα Εγγραφής</title>
</head>
<body>
<h1>Φόρμα Εγγραφής</h1>
<form action="register.php" method="post">
Ονοματεπώνυμο:
<input type="text" name="fullname" required>
<br><br>
Email:
<input type="email" name="email" required>
<br><br>
Κωδικός:
<input type="password" name="password" required>
<br><br>
Ηλικία:
<input type="number" name="age" min="18" max="100">
<br><br>
Φύλο:
<input type="radio" name="gender" value="male"> Άνδρας
<input type="radio" name="gender" value="female"> Γυναίκα
<br><br>
Χώρα:
<select name="country">
<option value="greece">Ελλάδα</option>
<option value="cyprus">Κύπρος</option>
<option value="other">Άλλο</option>
</select>
<br><br>
Σχόλια:
<textarea name="comments" rows="4" cols="50"></textarea>
<br><br>
<input type="checkbox" name="terms" required> Αποδέχομαι τους όρους χρήσης
<br><br>
<button type="submit">Εγγραφή</button>
<button type="reset">Καθαρισμός</button>
</form>
</body>
</html>
Το ίδιο παράδειγμα, αλλά τώρα με χρήση <label> για καλύτερη προσβασιμότητα:
<!DOCTYPE html>
<html lang="el">
<head>
<meta charset="UTF-8">
<title>Φόρμα Εγγραφής με Labels</title>
</head>
<body>
<h1>Φόρμα Εγγραφής</h1>
<form action="register.php" method="post">
<label for="fullname">Ονοματεπώνυμο:</label>
<input type="text" id="fullname" name="fullname" required>
<br><br>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<br><br>
<label for="password">Κωδικός:</label>
<input type="password" id="password" name="password" required>
<br><br>
<label for="age">Ηλικία:</label>
<input type="number" id="age" name="age" min="18" max="100">
<br><br>
<label>Φύλο:</label><br>
<input type="radio" id="male" name="gender" value="male">
<label for="male">Άνδρας</label>
<input type="radio" id="female" name="gender" value="female">
<label for="female">Γυναίκα</label>
<br><br>
<label for="country">Χώρα:</label>
<select id="country" name="country">
<option value="greece">Ελλάδα</option>
<option value="cyprus">Κύπρος</option>
<option value="other">Άλλο</option>
</select>
<br><br>
<label for="comments">Σχόλια:</label>
<textarea id="comments" name="comments" rows="4" cols="50"></textarea>
<br><br>
<input type="checkbox" id="terms" name="terms" required>
<label for="terms">Αποδέχομαι τους όρους χρήσης</label>
<br><br>
<button type="submit">Εγγραφή</button>
<button type="reset">Καθαρισμός</button>
</form>
</body>
</html>
| Attribute | Περιγραφή | Παράδειγμα |
|---|---|---|
| required | Το πεδίο είναι υποχρεωτικό | <input type="text" required> |
| placeholder | Βοηθητικό κείμενο μέσα στο πεδίο | <input placeholder="Όνομα"> |
| value | Προεπιλεγμένη τιμή | <input value="Μαρία"> |
| disabled | Απενεργοποιεί το πεδίο | <input disabled> |
| readonly | Μόνο για ανάγνωση | <input readonly> |
| maxlength | Μέγιστος αριθμός χαρακτήρων | <input maxlength="10"> |
| min / max | Ελάχιστη/Μέγιστη τιμή για αριθμούς | <input type="number" min="1" max="100"> |
| pattern | Regular expression για έλεγχο | <input pattern="[0-9]{5}"> |
name, τα δεδομένα δεν στέλνονται.for του label πρέπει να ταιριάζει με το id του input.$sql = "SELECT * FROM products WHERE id = $product_id";
Εδώ φτιάχνεις ένα κείμενο (string) που λέει στη βάση: "Βρες όλα τα πεδία από τον πίνακα products όπου το id είναι ίσο με $product_id."
$result = $conn->query($sql);
Λέμε στη βάση δεδομένων: "Τρέξε το ερώτημα αυτό" και ό,τι απάντηση δώσει η βάση, μπαίνει στο $result.
if ($result->num_rows > 0) {
Το $result δεν είναι πίνακας — είναι αντικείμενο ειδικού τύπου (mysqli_result). Η ιδιότητα num_rows λέει πόσες γραμμές βρήκε η βάση.
$row = $result->fetch_assoc();
Η μέθοδος fetch_assoc() παίρνει μια γραμμή από το αποτέλεσμα και σου τη δίνει σε μορφή ενός πίνακα (array) με κλειδιά τα ονόματα των πεδίων.
Δηλαδή το $row γίνεται κάτι σαν:
[
"name" => "Keyboard",
"price" => 25.90,
"description" => "USB keyboard"
]
$product_name = $row["name"];
$product_price = $row["price"];
Απλά "τραβάς" τις τιμές από τον πίνακα $row χρησιμοποιώντας τα ονόματα των στηλών.
$sql_customer = "INSERT INTO customers (name, email) VALUES ('$customer_name', '$customer_email')";
Αυτό το SQL σημαίνει: "Βάλε έναν νέο πελάτη στον πίνακα customers με αυτά τα στοιχεία (name, email)"
if ($conn->query($sql_customer) === TRUE) {
Εντολή INSERT: Αν επιστρέψει TRUE, σημαίνει: "Η εγγραφή μπήκε με επιτυχία!"
$customer_id = $conn->insert_id;
Κάθε φορά που κάνεις ένα INSERT και η βάση δημιουργεί ένα αυτόματο id (AUTO_INCREMENT), η mysqli σου δίνει αυτό το id μέσω της ιδιότητας insert_id.
Δηλαδή σου λέει: "Το id του πελάτη που μόλις έβαλες είναι αυτό εδώ."
Παράδειγμα: Αν το νέο id είναι 27 → $customer_id θα γίνει 27.
$conn->insert_id σου επιστρέφει αυτό το 27Μέχρι τώρα είδαμε πώς φτιάχνουμε φόρμες στην HTML. Τώρα θα δούμε πώς επεξεργαζόμαστε τα δεδομένα με PHP και τα αποθηκεύουμε σε μια βάση δεδομένων MySQL.
Πρώτα πρέπει να δημιουργήσουμε έναν πίνακα στη βάση δεδομένων. Άνοιξε το phpMyAdmin και εκτέλεσε το παρακάτω SQL:
-- Δημιουργία πίνακα για παραγγελίες
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL,
customer_email VARCHAR(100) NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
is_member ENUM('yes', 'no') DEFAULT 'no',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Δημιουργούμε μια φόρμα που στέλνει τα δεδομένα στο αρχείο process_order.php:
<!-- order_form.html -->
<!DOCTYPE html>
<html lang="el">
<head>
<meta charset="UTF-8">
<title>Φόρμα Παραγγελίας</title>
</head>
<body>
<h1>Φόρμα Παραγγελίας</h1>
<form action="process_order.php" method="post">
Ονοματεπώνυμο:
<input type="text" name="customer_name" required>
<br><br>
Email:
<input type="email" name="customer_email" required>
<br><br>
Προϊόν:
<select name="product_id" required>
<option value="1">Laptop</option>
<option value="2">Smartphone</option>
<option value="3">Tablet</option>
</select>
<br><br>
Ποσότητα:
<input type="number" name="quantity" min="1" required>
<br><br>
<input type="checkbox" name="is_member" value="yes"> Είμαι μέλος
<br><br>
<button type="submit">Αποστολή Παραγγελίας</button>
</form>
</body>
</html>
Τώρα δημιουργούμε το PHP αρχείο που θα δέχεται τα δεδομένα και θα τα αποθηκεύει στη βάση:
<?php
// process_order.php
// Σύνδεση με τη βάση
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Δημιουργία σύνδεσης στη MySQL
$conn = new mysqli($servername, $username, $password, $dbname);
// Έλεγχος αν η σύνδεση απέτυχε
if ($conn->connect_error) {
die("Αποτυχία σύνδεσης: " . $conn->connect_error);
}
// Λήψη δεδομένων από τη φόρμα
$customer_name = $_POST['customer_name'];
$customer_email = $_POST['customer_email'];
$product_id = $_POST['product_id'];
$quantity = $_POST['quantity'];
// Checkbox: αν δεν υπάρχει στο POST → θεωρείται "no"
$is_member = isset($_POST['is_member']) ? 'yes' : 'no';
// Δημιουργία SQL query εισαγωγής (κατασκευή εντολής INSERT)
$sql = "INSERT INTO orders (customer_name, customer_email, product_id, quantity, is_member)
VALUES ('$customer_name', '$customer_email', '$product_id', '$quantity', '$is_member')";
// Εκτέλεση του query (=== TRUE για να ελέγχουμε ακριβή τιμή TRUE)
if ($conn->query($sql) === TRUE) {
echo "<h2>Επιτυχής Καταχώρηση!</h2>";
echo "<p>Η παραγγελία σας καταχωρήθηκε με επιτυχία.</p>";
echo "<p>ID Παραγγελίας: " . $conn->insert_id . "</p>";
} else {
// Μήνυμα σφάλματος αν το query δεν εκτελέστηκε
echo "Σφάλμα: " . $sql . "<br>" . $conn->error;
}
// Κλείσιμο σύνδεσης
$conn->close();
?>
| HTML Form (name) | PHP ($_POST) | SQL (Στήλη Βάσης) | Τύπος |
|---|---|---|---|
| name="customer_name" | $_POST['customer_name'] | customer_name | VARCHAR(100) |
| name="customer_email" | $_POST['customer_email'] | customer_email | VARCHAR(100) |
| name="product_id" | $_POST['product_id'] | product_id | INT |
| name="quantity" | $_POST['quantity'] | quantity | INT |
| name="is_member" | $_POST['is_member'] | is_member | ENUM('yes','no') |
$_POST['...']isset() γιατί αν δεν είναι τσεκαρισμένο, δεν στέλνεται καθόλουif ($_SERVER["REQUEST_METHOD"] == "POST") { ... }
Εκτός από την εισαγωγή δεδομένων (INSERT), χρειάζεται συχνά να διαβάσουμε δεδομένα από τη βάση. Για αυτό χρησιμοποιούμε το SELECT.
Το παρακάτω script διαβάζει όλες τις παραγγελίες από τον πίνακα orders και τις εμφανίζει σε πίνακα HTML:
<?php
// view_all_orders.php
// Σύνδεση με τη βάση
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Δημιουργία σύνδεσης
$conn = new mysqli($servername, $username, $password, $dbname);
// Έλεγχος σύνδεσης
if ($conn->connect_error) {
die("Αποτυχία σύνδεσης: " . $conn->connect_error);
}
// SQL query για ανάγνωση όλων των εγγραφών
$sql = "SELECT * FROM orders";
// Εκτέλεση του query
$result = $conn->query($sql);
// Έλεγχος αν υπάρχουν αποτελέσματα
if ($result->num_rows > 0) {
// Εμφάνιση αποτελεσμάτων σε πίνακα HTML
echo "<h2>Όλες οι Παραγγελίες</h2>";
echo "<table border='1'>";
echo "<tr>";
echo "<th>ID</th>";
echo "<th>Όνομα</th>";
echo "<th>Email</th>";
echo "<th>Προϊόν ID</th>";
echo "<th>Ποσότητα</th>";
echo "<th>Μέλος</th>";
echo "</tr>";
// Επανάληψη για κάθε εγγραφή
// Result-fetching method: fetch_assoc() φέρνει μία γραμμή σαν associative array
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row["id"] . "</td>";
echo "<td>" . $row["customer_name"] . "</td>";
echo "<td>" . $row["customer_email"] . "</td>";
echo "<td>" . $row["product_id"] . "</td>";
echo "<td>" . $row["quantity"] . "</td>";
echo "<td>" . $row["is_member"] . "</td>";
echo "</tr>";
}
echo "</table>";
} else {
echo "Δεν βρέθηκαν παραγγελίες.";
}
// Κλείσιμο σύνδεσης
$conn->close();
?>
<?php
// ---------------- Σύνδεση με τη βάση (όπως στο process_order.php) ----------------
$servername = "localhost";
$username = "root";
$password = "123456";
$database = "eshop";
$conn = new mysqli($servername, $username, $password, $database);
// Έλεγχος σύνδεσης
if ($conn->connect_error) {
die("Αποτυχία σύνδεσης: " . $conn->connect_error);
}
// ---------------- ΒΗΜΑ 1: SELECT όλων των παραγγελιών ----------------
// ORDER BY id DESC: οι πιο πρόσφατες (με μεγαλύτερο id) πρώτες
$sql = "SELECT * FROM orders ORDER BY id DESC";
$result = $conn->query($sql);
// ---------------- ΒΗΜΑ 2: Εμφάνιση σε πίνακα HTML ----------------
if ($result->num_rows > 0) {
echo '<table>';
echo '<thead>
<tr>
<th>ID Παραγγελίας</th>
<th>ID Πελάτη</th>
<th>ID Προϊόντος</th>
<th>Ποσότητα</th>
<th>Τελικό Ποσό</th>
</tr>
</thead>
<tbody>';
// Loop: παίρνουμε κάθε γραμμή ως associative array
while ($row = $result->fetch_assoc()) {
// number_format(..., 2): 2 δεκαδικά
$fmt_total = number_format($row["total_price"], 2);
// Εκτύπωση σειράς πίνακα για την τρέχουσα παραγγελία
echo '<tr>';
echo ' <td>' . $row["id"] . '</td>';
echo ' <td>' . $row["customer_id"] . '</td>';
echo ' <td>' . $row["product_id"] . '</td>';
echo ' <td>' . $row["quantity"] . '</td>';
echo ' <td>' . $fmt_total . ' €</td>';
echo '</tr>';
}
echo '</tbody></table>';
} else {
echo "<p>Δεν υπάρχουν παραγγελίες προς εμφάνιση.</p>";
}
$conn->close();
?>
$sql = "SELECT * FROM orders ORDER BY id DESC";
ordersORDER BY id DESC ταξινομούμε τα αποτελέσματα φθίνουσα σειρά:
Έλεγχος αν υπάρχουν αποτελέσματα:
if ($result->num_rows > 0) {
Δημιουργία κεφαλίδας πίνακα:
echo '<table>';
echo '<thead>
<tr>
<th>ID Παραγγελίας</th>
<th>ID Πελάτη</th>
<th>ID Προϊόντος</th>
<th>Ποσότητα</th>
<th>Τελικό Ποσό</th>
</tr>
</thead>
<tbody>';
🔄 Επανάληψη για κάθε γραμμή αποτελέσματος:
while ($row = $result->fetch_assoc()) {
Τι κάνει αυτή η γραμμή:
fetch_assoc() διαβάζει μία γραμμή τη φορά από τα αποτελέσματα$row["id"], $row["quantity"])fetch_assoc() επιστρέφει null → η while σταματάΜορφοποίηση και εμφάνιση των δεδομένων:
$fmt_total = number_format($row["total_price"], 2);
echo '<tr>';
echo ' <td>' . $row["id"] . '</td>';
echo ' <td>' . $row["customer_id"] . '</td>';
echo ' <td>' . $row["product_id"] . '</td>';
echo ' <td>' . $row["quantity"] . '</td>';
echo ' <td>' . $fmt_total . ' €</td>';
echo '</tr>';
<tr>) στον πίνακα<td>) μπαίνουν τα δεδομένα της αντίστοιχης γραμμήςΚλείσιμο πίνακα:
echo '</tbody></table>';
Αν δεν υπάρχουν παραγγελίες:
} else {
echo "<p>Δεν υπάρχουν παραγγελίες προς εμφάνιση.</p>";
}
num_rows == 0), εμφανίζεται μήνυμα αντί για πίνακαΜπορούμε να φιλτράρουμε τα αποτελέσματα χρησιμοποιώντας WHERE. Για παράδειγμα, να βρούμε μόνο τα μέλη:
<?php
// Σύνδεση με τη βάση (όπως πριν)
$conn = new mysqli("localhost", "root", "", "my_database");
// SELECT με συνθήκη - μόνο μέλη
$sql = "SELECT * FROM orders WHERE is_member = 'yes'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<h3>Παραγγελίες από Μέλη (" . $result->num_rows . ")</h3>";
while ($row = $result->fetch_assoc()) {
echo "Όνομα: " . $row["customer_name"] . " - Email: " . $row["customer_email"] . "<br>";
}
} else {
echo "Δεν βρέθηκαν παραγγελίες από μέλη.";
}
$conn->close();
?>
Μπορούμε να ταξινομήσουμε τα αποτελέσματα:
// Ταξινόμηση από τη νεότερη προς την παλαιότερη παραγγελία
$sql = "SELECT * FROM orders ORDER BY id DESC";
// Ταξινόμηση αλφαβητικά κατά όνομα
$sql = "SELECT * FROM orders ORDER BY customer_name ASC";
SELECT * → Διαβάζει όλες τις στήλεςSELECT customer_name, email → Διαβάζει συγκεκριμένες στήλεςWHERE → Φιλτράρισμα με συνθήκηORDER BY ... ASC → Αύξουσα ταξινόμησηORDER BY ... DESC → Φθίνουσα ταξινόμησηLIMIT 10 → Μόνο τις πρώτες 10 εγγραφές$result->num_rows → Αριθμός εγγραφών που βρέθηκανfetch_assoc() → Result-fetching method: Φέρνει μία γραμμή σαν associative arrayΣτις πραγματικές εφαρμογές, συνδυάζουμε διάφορες εντολές SQL:
<?php
// Παράδειγμα: Βρες πόσες παραγγελίες έχει κάνει ο χρήστης
$email = "[email protected]";
$sql = "SELECT COUNT(*) as total FROM orders WHERE customer_email = '$email'";
$result = $conn->query($sql);
$row = $result->fetch_assoc();
echo "Ο χρήστης έχει κάνει " . $row['total'] . " παραγγελίες.";
?>
Οι HTML φόρμες είναι το βασικό εργαλείο για την επικοινωνία μεταξύ χρήστη και διακομιστή. Τα κύρια σημεία που πρέπει να θυμάστε είναι:
<form> και τελειώνει με </form>action καθορίζει που στέλνονται τα δεδομέναmethod καθορίζει πως στέλνονται (GET ή POST)name για να σταλεί<label> για καλύτερη προσβασιμότητα και ευκολία χρήσηςfor του label πρέπει να ταιριάζει με το id του inputrequired κάνει τα πεδία υποχρεωτικάΓια την επεξεργασία με PHP:
$_POST['name'] για να πάρουμε τα δεδομέναisset() για έλεγχο αν είναι επιλεγμένοfetch_assoc() → Result-fetching method που φέρνει μία γραμμή αποτελεσμάτων ως associative arraynum_rows → Αριθμός εγγραφών που βρέθηκανΓιώργος Μπάρδης
Πανεπιστήμιο Πελοποννήσου - Τμήμα Ψηφιακών Συστημάτων