سیستم نوبت دهی دکتر با PHP

سیستم نوبت دهی دکتر با PHP

نوبت دهی دکتر با PHP – با کمک PHP و Javascript و Mysql می توانیم یک سیستم رزرو وقت دکتر مناسب برای بیمارستان ها بگیریم .

این پروژه شامل 4 قسمت PHP:

  1. index.php شامل فرم دریافت اطلاعات بیمار
  2. process.php اطلاعات بیمار را پردازش و ثبت می کند در دیتابیس
  3. db.php توابع مورد نیاز برای ثبت و دریافت اطلاعات بیمار
  4. list.patients.php لیست بیمارانی که نوبت گرفته اند را با جزئیات لیست می کند

همچنین از تقویم فارسی در این پروژه استفاده می کنیم که نیازمند :

  1. jQuery
  2. persian-datepicker
  3. persian-date

دموی برنامه

1- اسکریپت index.php

<?php 
require_once 'db.php';
$doctors = getData("SELECT * FROM DOCTORS");
?>
<!DOCTYPE html>
<html lang="fa">
<head>
    <meta charset="UTF-8">
    <title>Rapidcode.iR - سورس کد</title>
    <link rel="stylesheet" href="static/css/lib/persian-datepicker.min.css">
    <link rel="stylesheet" href="static/css/main.css">
    <script type="text/javascript">var doctors = <?php echo json_encode($doctors) ?></script>
</head>
<body>


    <div class="container">
        <a id="introduce" href="https://rapidcode.ir" target="_blank">رپید کد • کتابخانه مجازی برنامه نویسان</a>

        <?php if(@$_GET['msg']): ?>
            <div class="message"><?php echo $_GET['msg']; ?></div>
        <?php endif; ?>

       <form action="process.php" method="post">
           
        <input required type="text" name="patient[name]" placeholder="نام و نام خانوادگی"><br><br>
        <input required type="number" name="patient[insurancecode]" placeholder="شماره بیمه"><br><br>

        <select required id="expert" name="patient[expert]">
            <option>تخصص</option>
            <?php 
            $tmp_doctors = [];
            foreach($doctors as $doctor):
                if(in_array($doctor['expert'], $tmp_doctors)) continue;
                $tmp_doctors[] = $doctor['expert'];

            ?>
                <option value="<?php echo $doctor['expert'] ?>"><?php echo $doctor['expert'] ?></option>
            <?php endforeach; ?>
        </select><br><br>
        <select required id="doctor" name="patient[doctor]"></select><br><br>
        <input type="text" id="doctor_day" name="patient[doctor_day]" readonly="true">
        <select required id="doctor_time" name="patient[doctor_time]"></select><br><br>
        

        <input type="submit" id="submit" value="گرفتن نوبت">

       </form>

       
    </div>


    <script src="static/js/lib/jquery-3.2.1.min.js"></script>
    <script src="static/js/lib/persian-date.min.js"></script>
    <script src="static/js/lib/persian-datepicker.min.js"></script>
    <script src="static/js/app.js"></script>
</body>
</html>


2- اسکریپت process.php

<?php 
require_once "db.php";
$patient = $_POST['patient'];

$reserved = getData("SELECT * FROM `reservations` WHERE insurance_code=?" , [$patient['insurancecode']]);

if($reserved) die("شما از قبل نوبت گرفته اید.");

$is_inserted = setData("INSERT INTO `reservations` (name , insurance_code , doctor , doctor_date , doctor_time) VALUES (?,?,?,?,?)" , [$patient['name'] , $patient['insurancecode'] , $patient['doctor'] , $patient['doctor_day'] , $patient['doctor_time']]);

if(!$is_inserted) die("خطایی در ارسال اطلاعات به پایگاه داده رخ داده");

$message = "$patient[name] برای دکتر $patient[doctor] در تاریخ $patient[doctor_day] و در ساعت $patient[doctor_time] نوبت گرفته و باید در همان موعد مقرر حاضر گردد !";

header("Location: index.php?msg=" . $message);

?>


3- اسکریپت db.php

<?php 

$mysqli = new mysqli("localhost", "root", "", "cms");
if ($mysqli->connect_error) {
    die("MYSQL ISSUE : " . $mysqli->connect_error);
}
 
$mysqli->set_charset("utf8");
$stmt = $mysqli->stmt_init();


function getData($uquery,$data=[]){
    global $mysqli;
    global $stmt;
    $query = $uquery;
    $rows = [];
   
    $stmt->prepare($query);

    if(sizeof($data))
        $stmt->bind_param(str_repeat("s",count($data)), ...$data);
  
    if ($stmt->execute() && $res = $stmt->get_result()) {
        if ($stmt->affected_rows || $res->num_rows) {
            while ($row = $res->fetch_assoc()) {
                $rows[] = $row;
            }
        }
    }
    return $rows;
}

function setData($uquery , $data){
    global $mysqli;
    global $stmt;
      
    $query = $uquery;
    $stmt->prepare($query);
    $type = str_repeat("s",count($data));
    $stmt->bind_param($type, ...$data);
    $inserted_id=0;
    if ($stmt->execute()) {
        $inserted_id = $stmt->affected_rows ? $stmt->insert_id : 0;
    }
    return $inserted_id;
}

?>


4- اسکریپت list.patients.php

<?php 
require_once 'db.php';
$doctors = getData("SELECT * FROM DOCTORS");
?>
<!DOCTYPE html>
<html lang="fa">
<head>
    <meta charset="UTF-8">
    <title>Rapidcode.iR - سورس کد</title>
    <link rel="stylesheet" href="static/css/main.css">
</head>
<body>


    <div class="container">
        <a id="introduce" href="https://rapidcode.ir" target="_blank">رپید کد • کتابخانه مجازی برنامه نویسان</a>

        <table>
            <thead>
                <tr>
                    <th>نام بیمار</th>
                    <th>شماره بیمه بیمار</th>
                    <th>دکتر معالج</th>
                    <th>تاریخ نوبت</th>
                    <th>زمان نوبت</th>
                </tr>
            </thead>

            <tbody>

            <?php
                require_once "db.php";
                $rows = getData("SELECT * FROM reservations WHERE 1=?" , [1]);
                foreach($rows as $row):
            ?>

                <tr>
                    <td><?php echo $row['name'] ?></td>
                    <td><?php echo $row['insurance_code'] ?></td>
                    <td><?php echo $row['doctor'] ?></td>
                    <td><?php echo $row['doctor_date'] ?></td>
                    <td><?php echo $row['doctor_time'] ?></td>
                </tr>

            <?php endforeach; ?>
            </tbody>

        </table>

       
    </div>


  
</body>
</html>


5- اسکریپت جاوا اسکریپت app.js

const expertDOM = document.getElementById('expert');
const doctorDOM = document.getElementById('doctor');
const doctorTimeDOM = document.getElementById('doctor_time');

window.activeWeekDay = ["سه شنبه" , "پنجشنبه"];

const calendar = $("#doctor_day");
var dateObject = false;

loadDatePicker();


expertDOM.onchange = function() {
    const expert = this.value;
    resetDoctorsFields();
    doctors.forEach(function(doctor) {
        if (doctor['expert'] == expert) {
            doctorDOM.innerHTML += `<option value="${doctor['name']}">${doctor['name']}</option>`;
            updateDayAndTime(doctor);
            doctorDOM.onchange();
        }
    })
}

doctorDOM.onchange = function() {
    const doctor = this.value;
    resetDoctorsFields(this);
    doctors.forEach(function(doc) {
        if (doc['name'] == doctor) {
        	updateDayAndTime(doc);
        }
    });
}

function loadDatePicker(){
	
	dateObject = calendar.persianDatepicker({
	navigator:{
            enabled: false,
            scroll:{
            	enabled: false,
            }
    },
    timePicker: {enabled: false},
    format: 'YYYY/MM/DD',
    minDate: new persianDate().subtract('day', 0).valueOf(),
    checkDate: function(unix){
    	const date = new persianDate(unix).date();
    	const month = new persianDate(unix).month();
    	const day = new persianDate(unix).day();
    	const currentMonth = this.model.state.selected.month;
    	const currentDate = this.model.state.selected.date;
		
    	let show = false;
    	activeWeekDay.forEach(function(dayi){
    		if(month == currentMonth){
    			if(day == getWeekdayByNum(dayi)){
    				show = true;
    				return true;
    			}
    		}
    	});

        return show;
    },
    onSelect : function(selectedDayUnix){
    	dateObject.hide()
    }
});

	
}

function resetDoctorsFields(exception){
	const domList = [doctorDOM , doctorTimeDOM];
	
	domList.forEach(function(dom){
		if(exception != dom){
			dom.innerHTML = "";
		}
		
	});
}

function updateDayAndTime(doctor) {
    const days = doctor['weekdays'].split(",");
    const time = doctor['time'].split(",");

    days.forEach(function(day,key) {
        days[key] = day.toString().trim();
    });

    activeWeekDay = days;
    loadDatePicker();

    time.forEach(function(tme) {
        doctorTimeDOM.innerHTML += `<option value="${tme}">${tme}</option>`;
    });
}

function getWeekdayByNum(dayLetter){
	const days = {1: "شنبه" , 2: "یکشنبه" , 3: "دوشنبه" , 4: "سه شنبه" , 5: "چهارشنبه" , 6: "پنجشنبه" , 7: "جمعه"}

	const keys = Object.keys(days);
	for (var i = 0; i < keys.length; i++) {
		const key = keys[i];
		if(days[key] == dayLetter){
			return key;
		}
	}

	return false;
}


استایل main.css

.datepicker-day-view .table-days td:not(.disabled) span {
    color: #4caf50 !important;
    font-weight: bold;
}

.datepicker-day-view .table-days td.selected span,
.datepicker-day-view .table-days td span:hover {
    background-color: #4caf50 !important;
    color: #fff !important;
}

.message{
    width: 100%;
    padding: 10px 15px;
    background-color: #ff9800;
    color: #000;
    margin-bottom: 15px;
}

table{
    border-collapse: collapse;
}

table tr td , table tr th{
    border: 1px solid;
    padding: 5px 15px;
}

قبل از اجرای برنامه وارد پوشه DATABASE TO IMPORT شده cms را import کنید

دانلود برنامه رزرو دکتر با PHP

ارسال نظر

جهت استفاده از کد حتما از تگ pre استفاده نمایید .

لیست نظرات

  1. محمد صدرا
    محمد صدرا

    چطور میشه کاری کرد که وقتی یکی یه نوبتی میگیره دیگه کسی نتونه بگیرش و کلا ان نوبت برا بقیه کاربرا نمایش داده نشه تا سلکت کنن با توجه به اینکه سورسی که دادین فقط برا ظهره

    09 خرداد 1401 | 01:13:40
  • حسین باقری
    حسین باقری

    برای اینکه کلا نشه just after noon کوئری ش رو با time رو حذف کنید .

    09 خرداد 1401 | 11:56:33
  • Parsa
    Parsa

    چطور میشه کاری کرد که وقتی یکی مثلا نوبت بعد از ظهرو گفت دیگه کسی نتونه بگیرش و کلا بعد از ظهر برا بقیه کاربرا نمایش داده نشه تا سلکت کنن

    20 اردیبهشت 1401 | 02:49:22
    • حسین باقری
      حسین باقری

      برای این کار می تونید با کوئری تعداد رکورد هایی که برای بعد از ظهر هست بگیرید اگر بیشتر از 0 بود نوبت بعد از ظهر غیر فعال بشه .

      20 اردیبهشت 1401 | 16:58:01
      • محمد صدرا
        محمد صدرا

        میشه سورسش رو بدید من هر کاری کردم نشد

        04 خرداد 1401 | 22:36:52
        • حسین باقری
          حسین باقری

          سلام بررسی شد لینک دانلود سالمه .

          05 خرداد 1401 | 00:43:26
          • محمد صدرا
            محمد صدرا

            سورس کلی که اوکیه من سورس این جوابتونو می خوام "برای این کار می تونید با کوئری تعداد رکورد هایی که برای بعد از ظهر هست بگیرید اگر بیشتر از 0 بود نوبت بعد از ظهر غیر فعال بشه ."

            06 خرداد 1401 | 20:56:22
          • حسین باقری
            حسین باقری

            سلام . تغییرات انجام شد در فایل process.php می تونید کوئری با نام justAfterNoonReserved مشاهده می کنید دقت داشته باشید که زمان ثبت فرم اعتبارسنجی برای نوبت بعد از ظهر رو انجام میده . لینک سورس

            06 خرداد 1401 | 21:58:42
    contact us