Система бронирования с php и mysql - PullRequest
0 голосов
/ 14 октября 2018

Итак, я создаю эту систему бронирования для дополнительных уроков в школе, и я новичок в программировании. Так что при создании этого я сталкиваюсь со многими проблемами.
Я использую PHP и mysql для своей системы.Ниже приведен мой утомительный 100-строчный код для sinsert.php

<html>
<head>
<style>
.error {color: #FF0000;}
</style>
    <title>Booking Page</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<?php
//Prevent empty fields
$date = $room = $tid = $subj = $start = $end = $noofstu = null;
$nodate = $noroom = $notid = $nosubj = $nostart = $noend = $nonoofstu = null;

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["date"])) {
    $nodate = "*Date of lesson is required";
    $date = null;
  } else {
    $date = $_POST["date"];
  }

  if (empty($_POST["room"])) {
    $noroom = "*Room is required";
    $room = null;
  } else {
    $room = $_POST["room"];}

  if (empty($_POST["tid"])) {
    $notid = "*Teacher in charge is required";
    $tid = null;
  } else {
    $tid = $_POST["tid"];}

    if (empty($_POST["noofstu"])) {
    $nonoofstu = "*Number of Students Attending is required";
    $noofstu = null;
  } else {
    $noofstu = $_POST["noofstu"];}
}
function ($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
return $data;}
?>

<div id='frm'><form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST">
    <p><h1><u>Lesson Booking Form</u></h1></p>
    <p>
        <label>Date of Lesson:</label>
        <input type="date" name="date" >
        <br><span class="error"><?php echo $nodate;?></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 $noroom;?></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 $notid;?></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">   
            <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>
            &nbsp;&nbsp;&nbsp;
            <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 $nonoofstu;?></span>
        </p>
        <p>
        <input type="reset" id="reset" value="Reset">
        <input type="submit" id="submit" value="Submit">
        </p>
        </form>
<?php
//Insert data in mysql database
$date = $_POST['date'];
$room = $_POST['room'];
$tid = $_POST['tid'];
$subj = $_POST['subj'];
$start = $_POST['start'];
$end = $_POST['end'];
$noofstu = $_POST['noofstu'];


    $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( $_POST['date'], $_POST['room'], $_POST['tid'], $_POST['subj'], $_POST['start'], $_POST['end'], $_POST['noofstu']);
    $stmt->execute();

    if(!mysqli_query($conn, $sql))
    {
        echo "Not Inserted!";
    }
    else
    {
        echo "Inserted";
    }



$conn->close();
?>

        </div>
</body>

. В sinsert.php есть два кода. Первый код - убедиться, что пользователь заполнил все поля допоявится сообщение об ошибке отправки или получения кода ошибки. Первый код в основном копируется из W3schools. Так что я не думаю, что будут какие-либо проблемы с этим кодом.
Второй код - это вставка введенных данных в таблицу «бронирования».в базе данных 'sba'. Я сделал код с помощью кода моего учителя и PHP: вставка значений из формы в MySQL
Таблица «бронирования» состоит из 8 полей. Помимо 7 полейупоминается в коде, есть также поле первичного ключа 'bookid', которое находится в автоматическом приращении

Вот проблемы, с которыми я столкнулся

1. Каждый раз, когда я заходил в 'sinsert.php 'page, под моей формой есть 2 предупреждающих сообщения
Первое предупреждающее сообщение гласит:
' mysqli_prepare () ожидает ровно 2 параметра, 1 указан в строке 143 '
Другое сообщение о фатальной ошибке,состояния:
'Uncaught Ошибка: вызов функции-члена bind_param () для null в sinsert.php: 144 Трассировка стека: # 0 {main} выбрасывается в sinsert.php в строке 144'
И я понятия не имею,что они означают или как их решить

2. Я также не могу вставить введенные данные в базу данных. Я думаю, это связано с сообщениями об ошибках выше. Но на самом деле я не знаю реальной причины

Я хотел бы знать, как я могу решить вышеупомянутые проблемы. Я очень благодарен, если вы помогли


Бонусный вопрос: Как я могу предотвратить двойное бронирование, так как никакие записи не должны иметьв ту же комнату и в то же время

1 Ответ

0 голосов
/ 14 октября 2018

Ваша главная проблема - вы запускаете базу данных, даже если форма не отправлена.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, а не контент для стилизации &nbsp; несколько раз против 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) и других функций, связанных с датой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...