簡體   English   中英

帶有php和mysql的預訂系統

[英]Booking system with php and mysql

因此,我正在為學校補習課制作這種預訂系統,而且我是編碼的新手。因此,在編寫此書時遇到了很多問題。
我在系統上使用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的幫助下編寫代碼的:將表單中的值插入MySQL
“預訂”表由8個字段組成。除了代碼中提到的7個字段外,還有主鍵字段“ bookid”,該字段自動遞增

這是我遇到的問題

1.每次我進入“ sinsert.php”頁面時,我的表格下方都有2條警告消息
第一條警告消息指出:
'mysqli_prepare()恰好需要2個參數,第143行給出1個參數'
另一個是致命錯誤消息,指出:
“未捕獲的錯誤:在sinsert.php:144中的null上調用成員函數bind_param()的堆棧跟蹤:在行144上的sinsert.php中拋出了#0 {main}”
我不知道它們是什么意思或如何解決它們

2.我也無法在數據庫中插入輸入的數據。我的猜測是由於上述錯誤消息造成的,但我實際上並不知道真正的原因

我想知道如何解決上述問題。如果您有所幫助,我非常感謝


獎勵問題:如何防止重復預定,就像沒有記錄應該有相同的房間和時間一樣

您的主要問題是即使沒有提交表單,您也正在運行數據庫內容。 底部的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; (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中混用引號樣式(因為這會激怒我)
  • 正確縮進您的代碼,(便於閱讀)
  • 不要設置變量多於所需的時間,這很難看(很難閱讀)
  • 數據庫日期格式是Ymd而不是m/d/Y使用日期時間將處理多種格式,並根據需要放置它們。
  • 懶惰,不要編寫不需要的代碼。 我很想為<select>選項制作一些循環,但是可惜復制起來很容易。 主要是我不想解釋str_pad在時間上添加前導0's
  • 使用CSS不提供樣式設置&nbsp; style="margin-right:15px"多次,它更精確,更容易編輯。

至少你們有這樣的prepare並不壞。 也是僅供參考,大約四年來我都沒有使用過Mysqli 我主要使用PDO,所以我照原樣保留了數據庫代碼。

附言:我真的不能測試這個,所以請原諒我任何錯別字

獎勵問題:如何防止重復預定,就像沒有記錄應該有相同的房間和時間一樣

在數據庫中設置roomdatestartend復合唯一鍵(其中包含多個字段的鍵),然后在輸入相同數據時將引發錯誤。 換句話說,在同一房間預訂相同的日期和時間。 在PDO中,您可以使用異常處理try/catch來捕獲Mysqli那些錯誤,因為我說我已經很長時間沒有使用過了。 但是我想您execute會出錯。 您忘記了在same room and same time same date ,所以我添加了該日期。因為您分別存儲日期和時間,所以很重要。

存儲這些數據的另一種方法是擺脫date字段,並在數據庫中將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中使用它也將更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM