我问的这个问题是要教会我自己在某种情况下使用正确的方法,而不是如何编码的问题。
由于我是自学成才的学生,以前从未使用过关系表。通过搜索和实验,我已经知道关系的基本概念及其用法,但是我不确定在使用这些表时是否仍在使用正确的方法。
我没有任何官方老师,所以在这里我只能问你们一个令人困扰的问题。
例如,我写了一些代码,其中有2个表。
doctors
,其中具有id
(AI和主数据库)和names
的varChar表。patient_recipts
,其中有一个doctor_name
表tinyint names
表中包含医生的姓名doctor_name
表保存着id
表中相应的doctors
name
和doctor_name
在数据库中彼此关联现在,当我需要从patient_recipts
获取数据并显示医生的姓名时,我将需要INNER JOIN doctor
表,将doctor_name
的值与医生中的id
进行比较表格并获得医生的名字。
我将用来获取某位医生的患者的查询类似
$getPatList = $db->prepare("SELECT *
FROM patient_recipts
INNER JOIN doctor ON patient_recipts.doctor_name = doctor.id
WHERE dept = 'OPD' AND date_time = DATE(NOW())
ORDER BY patient_recipts.id DESC");
现在,如果我要在其他处理器文件中插入动作日志条目,它将类似于(动作和日志条目)
$recipt_no = $_POST['recipt_no'];
$doctor_name = $_POST['doctor_name']; //this hold id(int) not text
$dept = $_POST['dept'];
$patient_name = $_POST['patient_name'];
$patient_tel = $_POST['patient_telephone'];
$patient_addr = $_POST['patient_address'];
$patient_age = $_POST['patient_age'];
$patient_gender = $_POST['patient_gender'];
$patient_fee = $_POST['patient_fee'];
$logged_user = $_SESSION['user_name'];
$insData = $db->prepare("
INSERT INTO patient_recipts (date_time, recipt_no, doctor_name, dept, pat_gender, pat_name, pat_tel, pat_address, pat_age, pat_fee, booked_by)
VALUES (NOW(),?,?,?,?,?,?,?,?,?,?)");
$insData->bindValue(1,$recipt_no);
$insData->bindValue(2,$doctor_name);
$insData->bindValue(3,$dept);
$insData->bindValue(4,$patient_gender);
$insData->bindValue(5,$patient_name);
$insData->bindValue(6,$patient_tel);
$insData->bindValue(7,$patient_addr);
$insData->bindValue(8,$patient_age);
$insData->bindValue(9,$patient_fee);
$insData->bindValue(10,$logged_user);
$insData->execute();
// Add Log
write_log("{$logged_user} booked OPD of patient {$patient_name} for {$doctor_name}");
OUTPUT: Ayesha booked OPD of patient Steve for 15
现在问题很明显了,我将需要再次执行上述提取查询再次以获取具有ID比较的医生的姓名并将ID 15
绑定到Doctor的姓名之前调用write_log()
函数。
所以这是我认为我的方法完全错误的地方。
patient_recipts
中使用实际的医生姓名而不是ID 请提供帮助,以便在以后的日子里我能理解并实施更好的方法:)
答案 0 :(得分:0)
您的表结构是正确的,将ID用作其他表中的外键被认为是最佳实践。如果要在日志消息中包括医生的姓名,则必须执行另一个SELECT
查询。像
SELECT name
FROM doctor
WHERE id = :doctor_id
不是很贵。
但是您可以简单地使用仅包含ID的日志文件。如果需要查找特定日志消息所指的是哪位医生,请稍后再查询该医生的名字。
顺便说一句,当您使用PDO时,建议您使用命名的占位符(如上面的示例所示),而不要使用?
。它使代码更易于阅读,并且如果您修改查询以添加或删除列,则不必更改所有占位符编号。