我有一个sql预订问题。该表有idstylist,bdate,stime和etime。
基本上造型师一次只能做一份工作。因此,在预订时,我需要检查该造型师是否还在忙于另一个预订。这是我的冲突方法;
public function checkClash($bdate, $stime,$stylist){
$query = sprintf("SELECT id FROM table WHERE (date=%s AND idstylist=%s) AND (%s BETWEEN stime AND etime)",
$this->db->GetSQLValueString($bdate, "date"),
$this->db->GetSQLValueString($stylist, "int"),
$this->db->GetSQLValueString($stime, "text"));
$result = $this->db->query($query);
if($result && $this->db->num_rows($result) > 0){
return true;
}
return false;
}
据我所知,我的查询是从(日期)中选择所有预订,其中idstylist为this,开始时间为> = $ stime但是< = $ stime。
例如,我在数据库中有一行看起来像这样;
id |日期| idstylist | stime | ETIME
1 | 2014-12-05 | 68 | 07:00:00 | 7时30分○○秒
现在我试图在同一天的07:10:00为同一个造型师预订,这应该会失败,但系统允许我进行预订。我无法看到我的查询有什么问题。
//next check for clashes in the booking table
$clash = $bookings->checkClash($_POST['bdate'],$_POST['stime'], $_POST['stylist']);
if($clash==true){
$errors[] = "Booking clashes. Please try again";
}
答案 0 :(得分:1)
这将变成调试会话。
从您的SQL :( stime> =%s AND etime< =%s)
替换为值:('7:00'> ='7:10'和'7:30'< ='7:10')
我猜你想要:(%s BETWEEN stime和etime)