带有php和mysql的预订系统

时间:2018-10-14 11:05:22

标签: php mysql database

因此,我正在为学校补习课制作这种预订系统,而且我是编码的新手。因此制作此书时遇到了很多问题。
我在系统上使用PHP和mysql。以下是我用于“ sinsert.php”的乏味的100行代码

<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”数据库的“ booking”表中。我借助老师的代码和PHP: Inserting Values from the Form into MySQL
编写了代码 'booking'表由8个字段组成。除了代码中提到的7个字段外,还有主键字段'bookid',该字段可以自动递增

这是我遇到的问题

1.每次我进入“ sinsert.php”页面时,我的表单下方都会显示2条警告消息
第一条警告消息指出:
'mysqli_prepare()恰好需要2个参数,第143行给出1个参数
另一个是致命错误消息,指出:
'未捕获的错误:在sinsert.php:144中的null上调用成员函数bind_param()堆栈跟踪:#0 {main}在144行中的sinsert.php中被抛出'
而且我不知道它们是什么意思或如何解决它们

2.我也无法在数据库中插入输入的数据。我的猜测是由于上面的错误消息。但我实际上并不知道真正的原因

我想知道如何解决上述问题。非常感谢您的帮助


奖励问题:如何防止重复预订,就像没有记录应该有相同的房间和时间一样

1 个答案:

答案 0 :(得分:0)

您的主要问题是,即使没有提交表单,您也正在运行数据库内容。底部的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之外回显字符串(echo“ Not Inserted!”;),这很丑陋
  • 使用HTML标记结束代码(它丢失了)
  • 请勿在HTML中混合使用引号样式(因为这会激怒我)
  • 正确缩进您的代码(便于阅读)
  • 不要比您需要设置更多次变量,这很丑陋(难以阅读)
  • 数据库日期格式为Y-m-d而不是m/d/Y使用日期时间可以处理多种格式,并根据需要设置它们。
  • 要懒惰,不要编写不需要的代码。我很想为<select>选项做一些循环,但是可惜复制起来很容易。主要是我不想在时间上解释str_pad添加开头的0's
  • &nbsp;相比,使用CSS不满意的样式来style="margin-right:15px"多次,这样更精确,更容易编辑。

至少有这个prepare并不都是坏事。同样是仅供参考,大约四年来我都没有使用过Mysqli。我主要使用PDO,所以我照原样保留了数据库代码。

PS,我真的不能测试一下,所以请原谅我任何错字

  

奖金问题:如何防止重复预订,就像没有记录应该有相同的房间和时间一样

在数据库中将roomdatestartend做成一个复合唯一键(其中有多个字段的键),然后它将抛出一个输入相同数据时出错。换句话说,在同一房间预订相同的日期和时间。在PDO中,您可以使用异常处理try/catch来捕获Mysqli中的那些错误,正如我所说的,我已经很长时间没有使用过了。但是我想您会为execute遇到错误。您在same date中忘记了same room and same time,所以我在其中添加了它。因为您分别存储日期和时间,所以很重要。

存储这些数据的另一种方法是摆脱日期字段,并在数据库中将Start和End更改为DateTime。并更改此:

 $start = $_POST["start"];
 $end = $_POST["end"];

收件人

  $start = $date.' '.$_POST["start"]; //2018-10-14 09:00:00
  $end = $date.' '.$_POST["end"];

这样,您可以将日期存储为时间的一部分。同样在将来,如果一堂课的时间跨度超过一天,那么您就准备就绪了。因为您可以从今天开始到明天结束。由于有了DATE(field)和其他与日期有关的功能,在SQL中使用它也会更容易一些。