#php #mysql #nested #conditional-statements
Вопрос:
У меня возникли проблемы с этим кодом. Он не переходит в базу 3-го условия по запросу. У меня есть 5 колонок для работы.
AMIN AMOUT PMIN СТАТУС PMOUT
Первая запись создает запись, нет ли записи для этой даты и студента. Столбец: AMIN со статусом 0 Он должен обновиться в столбце AMOUT и СТАТУС до 1 Далее, должен обновить PMIN со СТАТУСОМ 2, наконец, обновляет PMOUT со статусом 3.
Этот код работает только до PMIN, а затем обновляется после обновления PMIN. он не переходит в PMOUT
У меня есть этот код:
<?php
$sql ="SELECT * FROM attendance WHERE STUDENTID='$id' AND LOGDATE='$date'";
$query=$conn->query($sql);
if($query->num_rows>0){
$sql1 ="SELECT * FROM attendance WHERE STUDENTID='$id' AND LOGDATE='$date' AND STATUS='1'";
$query1=$conn->query($sql1);
if($query1->num_rows>0){
$sql2 ="SELECT * FROM attendance WHERE STUDENTID='$id' AND LOGDATE='$date' AND STATUS='2'";
$query2=$conn->query($sql2);
if($query2->num_rows>0){
$sql = "UPDATE attendance SET PMOUT='$time', STATUS='3' WHERE STUDENTID='$studentID' AND LOGDATE='$date'";
$query=$conn->query($sql);
$_SESSION['success'];
}
else{
$sql = "UPDATE attendance SET PMIN='$time', STATUS='2' WHERE STUDENTID='$studentID' AND LOGDATE='$date'";
$query=$conn->query($sql);
$_SESSION['success'];
}
}
else{
$sql = "UPDATE attendance SET AMOUT='$time', STATUS='1' WHERE STUDENTID='$studentID' AND LOGDATE='$date'";
$query=$conn->query($sql);
}
}else{
$sql = "INSERT INTO attendance(STUDENTID,AMIN,LOGDATE,STATUS) VALUES('$studentID','$time','$date','0')";
if($conn->query($sql) ===TRUE){
$_SESSION['success'];
}else{
$_SESSION['error'] = $conn->error;
}
}
Есть ли лучший способ сделать это?
Комментарии:
1. У меня есть 5 колонок для работы. Нет, предоставьте полный сценарий СОЗДАНИЯ ТАБЛИЦЫ.
2. Создать таблицу
attendance
(ID
тип int(11) не null,STUDENTID
имя varchar(250) не null,AMIN
имя varchar(250) не null,AMOUT
имя varchar(250) не null,PMIN
имя varchar(50) по умолчанию null,PMOUT
имя varchar(50) по умолчанию null,LOGDATE
имя varchar(250) не null,STATUS
имя varchar(2) не равно null ) двигатель=InnoDB значения по умолчанию то charset=utf8mb4;3. Пожалуйста, не публикуйте факты в качестве комментариев — добавьте их в текст вопроса (используйте ссылку «Редактировать» под ним).
Ответ №1:
Похоже, что вам нужно:
- Создайте уникальный индекс по студенту и дате:
CREATE UNIQUE INDEX idx_student_date ON attendance (studentid, logdate);
- Используйте следующий запрос:
INSERT INTO attendance (studentid, logdate, amin, amout, pmin, pmout, status)
VALUES ($id, CURRENT_DATE, CURRENT_TIME, NULL, NULL, NULL, 0)
ON DUPLICATE KEY UPDATE
amout = CASE WHEN status = 0 THEN CURRENT_TIME ELSE amout END,
pmin = CASE WHEN status = 1 THEN CURRENT_TIME ELSE pmin END,
pmout = CASE WHEN status = 2 THEN CURRENT_TIME ELSE pmout END,
status = status 1;
Если строка для текущего студента и даты не существует, то она будет создана, если она существует, то она будет обновлена в соответствии с вашим алгоритмом. Ваши вложенные IFS в PHP не нужны.
Кроме того, я рекомендую вам изменить типы данных, которые должны соответствовать данным, хранящимся в.
logdate
должно бытьDATE NOT NULL
amin, amout, pmin, pmout
должно бытьTIME
status
должно бытьTINYINT CHECK (status BETWEEN 0 AND 3)
Комментарии:
1. Значит, это будет всего один запрос? Я попробую…
2. @JohnArzaga, значит, это будет всего один запрос? ДА. Смотрите скрипку по предоставленной ссылке.
3. Это потрясающе! спасибо тебе, парень. Очень хорошая и безопасная техника. Я всегда думаю о том, чтобы сделать это процедурно. Теперь я начал учиться. Я хочу узнать больше о процедурах sql. ЕЩЕ РАЗ СПАСИБО ВАМ. Это спасает мне жизнь.
4. @JohnArzaga Вы можете использовать сам запрос, а не сохраненный процесс. Я создаю SP только для того, чтобы не повторять этот длинный текст SQL в целях.