Ваша главная проблема - вы запускаете базу данных, даже если форма не отправлена.PHP-код внизу.
Я все это очистил для вас:
<?php
if(!empty($_POST)){
$errors = [];
$date = empty($_POST["date"]) ? false : (new DateTime($_POST["date"]))->format('Y-m-d');
if(!$date) $errors["date"] = "*Please set a Date of the lesson";
$room = empty($_POST["room"]) ? false : $_POST["room"];
if(!$room) $errors["room"] = "*Please pick a room";
$tid = empty($_POST["tid"]) ? false : $_POST["tid"];
if(!$tid) $errors["tid"] = "*Please pick a Teacher";
$noofstu = empty($_POST["noofstu"]) ? false : trim($_POST["noofstu"]);
if(!$noofstu) $errors["noofstu"] = "*Please set the number of students that are attending";
$start = $_POST["start"];
$end = $_POST["end"];
$subj = $_POST['subj'];
if(empty($errors)){
$conn = mysqli_connect("localhost","root","","sba");
if(mysqli_connect_errno()) die("Failed to connect to MySQL: " . mysqli_connect_error());
$sql = "INSERT INTO booking (date, room, tid, subj, start, end, noofstu) Values (?,?,?,?,?,?,?)";
$stmt = mysqli_prepare($sql);
$stmt->bind_param( $date, $room, $tid, $subj, $start, $end, $noofstu);
$stmt->execute();
if(!mysqli_query($conn, $sql)) $errors["DB"] = "Dateabase error!";
}
}
?>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
<title>Booking Page</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div id='frm'>
<form action="" method="post" >
<p>
<h1><u>Lesson Booking Form</u></h1>
<span class="error"><?php echo isset($errors['DB']) ? $errors['DB'] : '';?></span>
</p>
<p>
<label>Date of Lesson:</label>
<input type="date" name="date" >
<br><span class="error"><?php echo isset($errors['date']) ? $errors['date'] : '';?></span>
</p>
<p>
<label>Room:</label><br>
<input type="radio" name="room" value="246"/> Room 246
<input type="radio" name="room" value="340"/> Room 340
<input type="radio" name="room" value="342"/> Room 342<br>
<span class="error"><?php echo isset($errors['room']) ? $errors['room'] : '';?></span>
</p>
<p>
<label>Teacher in charge:</label><br>
<input type="radio" name="tid" value="T001"/>Mr.Williams
<input type="radio" name="tid" value="T002"/>Mr.Zimmerman
<input type="radio" name="tid" value="T003"/>Ms.Alcott<br>
<span class="error"><?php echo isset($errors['tid']) ? $errors['tid'] : '';?></span>
</p>
<p>
<label>Subject:</label>
<select name="subj">
<option value="unitA">Unit A</option>
<option value="unitB">Unit B</option>
<option value="unitC">Unit C</option>
<option value="unitD">Unit D</option>
<option value="unitE">Unit E</option>
<option value="unitF">Unit F</option>
</select>
</p>
<p>
<label>Starting Time:</label>
<select name="start" style="margin-right:15px" >
<option value="09:00:00">09:00</option>
<option value="10:00:00">10:00</option>
<option value="11:00:00">11:00</option>
<option value="12:00:00">12:00</option>
<option value="13:00:00">13:00</option>
<option value="14:00:00">14:00</option>
<option value="15:00:00">15:00</option>
<option value="16:00:00">16:00</option>
<option value="17:00:00">17:00</option>
</select>
<label>Ending Time:</label>
<select name="end">
<option value="10:00:00">10:00</option>
<option value="11:00:00">11:00</option>
<option value="12:00:00">12:00</option>
<option value="13:00:00">13:00</option>
<option value="14:00:00">14:00</option>
<option value="15:00:00">15:00</option>
<option value="16:00:00">16:00</option>
<option value="17:00:00">17:00</option>
<option value="18:00:00">18:00</option>
</select>
</p>
<p>
<label>Number of Students Attending:</label>
<input type="number" name="noofstu" min="1" max="40"><br>
<span class="error"><?php echo isset($errors['noofstu']) ? $errors['noofstu'] : '';?></span>
</p>
<p>
<input type="reset" id="reset" value="Reset">
<input type="submit" id="submit" value="Submit">
</p>
</form>
</div>
</body>
</html>
Слишком много, чтобы охватить, но стиль (condition) ? true : false;
называется троичным выражением.В PHP7 некоторые из них могут быть заменены нулевым оператором объединения ??
Например, это:
$room = empty($_POST["room"]) ? false : $_POST["room"];
Может быть сделано в PHP7 как
$room = $_POST["room"] ?? false;
Несколько других вещей.
- Храните ваш PHP-код вместе, если это возможно (делает его чище)
- не изменяйте данные, очищайте дисплей.Вы не отображаете никакой пользовательский ввод здесь.большинство ваших входных данных не являются свободными типами форм.Таким образом, вы выполняете больше работы, чем вам нужно (при условии, что
function ($data)
фактически что-то сделал, кроме того, что вызвало синтаксическую ошибку) - использовать массивы для похожих типов данных
$errors
- не отображать строкивне HTML (эхо «Not Inserted!»;), его уродливый
- завершает код HTML-тэгом (его не было)
- не смешивайте стили цитирования в HTML (потому что это раздражаетменя)
- правильно сделать отступ для вашего кода, (легче читать)
- не устанавливайте переменную больше, чем нужно, это некрасиво (затрудняет чтение)
- Формат даты в базе данных:
Y-m-d
, а не m/d/Y
Использование даты и времени будет обрабатывать несколько форматов и указывать их так, как вам нужно. - Будьте ленивы, не пишите код, который вам не нужен.Я наполовину испытывал желание сделать несколько циклов для параметров
<select>
, но, увы, их было проще скопировать.В основном мне не хотелось объяснять str_pad
, чтобы добавить ведущий 0's
к времени. - использовать CSS, а не контент для стилизации
несколько раз против style="margin-right:15px"
, это более точно и проще для редактирования.
Все было не так плохо, по крайней мере, у вас было это prepare
.Кроме того, к вашему сведению, я не использовал Mysqli
около 4 лет.Я в основном использую PDO, поэтому я оставил код БД как есть.
PS Я не могу это проверить, поэтому простите мне любые опечатки
Бонус Вопрос: Как я могу предотвратитьдвойное бронирование, как будто никакие записи не должны иметь одну и ту же комнату и одно и то же время
Сделать room
, date
, start
и end
составным уникальным ключом в БД (ключ, которыйимеет несколько полей), тогда он будет выдавать ошибку при вводе одних и тех же данных.Другими словами, когда одна и та же комната забронирована на ту же дату и время.В PDO вы можете использовать обработку исключений try/catch
, чтобы перехватить эти ошибки в Mysqli
, как я уже говорил, что давно не использовал.Но я думаю, вы получите ошибку за execute
.Вы забыли same date
в same room and same time
, поэтому я добавил это. Поскольку вы храните дату и время отдельно, это имеет значение.
Еще один способ сохранить их - избавиться от поля даты и изменить Start иКонец DateTime в БД.И измените это:
$start = $_POST["start"];
$end = $_POST["end"];
На
$start = $date.' '.$_POST["start"]; //2018-10-14 09:00:00
$end = $date.' '.$_POST["end"];
Таким образом, вы можете сохранить дату как часть времени.Также в будущем, если урок охватит более одного дня, у вас все будет готово.Потому что вы могли бы начать это сегодня и закончить завтра.Также было бы немного проще работать в SQL из-за DATE(field)
и других функций, связанных с датой.